#include <unistd.h>
#include <errno.h>
+#include <limits.h>
+#include <string.h>
#include "syscall.h"
char *getcwd(char *buf, size_t size)
{
- return syscall2(__NR_getcwd, (long)buf, size) < 0 ? NULL : buf;
+ char tmp[PATH_MAX];
+ if (!buf) {
+ buf = tmp;
+ size = PATH_MAX;
+ } else if (!size) {
+ errno = EINVAL;
+ return 0;
+ }
+ long ret = syscall(SYS_getcwd, buf, size);
+ if (ret < 0)
+ return 0;
+ if (ret == 0 || buf[0] != '/') {
+ errno = ENOENT;
+ return 0;
+ }
+ return buf == tmp ? strdup(buf) : buf;
}