#include #include #include #include #include "syscall.h" #include "libc.h" static char *do_getcwd(char *buf, size_t size) { long ret = syscall(SYS_getcwd, buf, size); if (ret < 0) return 0; if (ret == 0 || buf[0] != '/') { errno = ENOENT; return 0; } return buf; } static char *getcwd_glibc(size_t size) { char tmp[PATH_MAX]; if (!do_getcwd(tmp, sizeof tmp)) return 0; size_t len = strlen(tmp) + 1; if (!size) size = len; else if (size < len) { errno = ERANGE; return 0; } char *buf = malloc(size); if (!buf) { errno = ENOMEM; return 0; } memcpy(buf, tmp, len); return buf; } char *getcwd(char *buf, size_t size) { if (!buf) return getcwd_glibc(size); if (!size) { errno = EINVAL; return 0; } return do_getcwd(buf, size); }