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 Workerchar *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