xref: /aosp_15_r20/external/musl/src/unistd/getcwd.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <unistd.h>
2*c9945492SAndroid Build Coastguard Worker #include <errno.h>
3*c9945492SAndroid Build Coastguard Worker #include <limits.h>
4*c9945492SAndroid Build Coastguard Worker #include <string.h>
5*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
6*c9945492SAndroid Build Coastguard Worker 
getcwd(char * buf,size_t size)7*c9945492SAndroid Build Coastguard Worker char *getcwd(char *buf, size_t size)
8*c9945492SAndroid Build Coastguard Worker {
9*c9945492SAndroid Build Coastguard Worker 	char tmp[buf ? 1 : PATH_MAX];
10*c9945492SAndroid Build Coastguard Worker 	if (!buf) {
11*c9945492SAndroid Build Coastguard Worker 		buf = tmp;
12*c9945492SAndroid Build Coastguard Worker 		size = sizeof tmp;
13*c9945492SAndroid Build Coastguard Worker 	} else if (!size) {
14*c9945492SAndroid Build Coastguard Worker 		errno = EINVAL;
15*c9945492SAndroid Build Coastguard Worker 		return 0;
16*c9945492SAndroid Build Coastguard Worker 	}
17*c9945492SAndroid Build Coastguard Worker 	long ret = syscall(SYS_getcwd, buf, size);
18*c9945492SAndroid Build Coastguard Worker 	if (ret < 0)
19*c9945492SAndroid Build Coastguard Worker 		return 0;
20*c9945492SAndroid Build Coastguard Worker 	if (ret == 0 || buf[0] != '/') {
21*c9945492SAndroid Build Coastguard Worker 		errno = ENOENT;
22*c9945492SAndroid Build Coastguard Worker 		return 0;
23*c9945492SAndroid Build Coastguard Worker 	}
24*c9945492SAndroid Build Coastguard Worker 	return buf == tmp ? strdup(buf) : buf;
25*c9945492SAndroid Build Coastguard Worker }
26