فهرست منبع

support null buffer argument to getcwd, auto-allocating behavior

this is a popular extension some programs depend on, and by using a
temporary buffer and strdup rather than malloc prior to the syscall,
i've avoided the dependency on free and thus minimized the bloat cost
of supporting this feature.
Rich Felker 13 سال پیش
والد
کامیت
899b13cae7
1فایلهای تغییر یافته به همراه6 افزوده شده و 1 حذف شده
  1. 6 1
      src/unistd/getcwd.c

+ 6 - 1
src/unistd/getcwd.c

@@ -1,8 +1,13 @@
 #include <unistd.h>
 #include <errno.h>
+#include <limits.h>
+#include <string.h>
 #include "syscall.h"
 
 char *getcwd(char *buf, size_t size)
 {
-	return syscall(SYS_getcwd, buf, size) < 0 ? NULL : buf;
+	char tmp[PATH_MAX];
+	if (!buf) buf = tmp, size = PATH_MAX;
+	if (syscall(SYS_getcwd, buf, size) < 0) return 0;
+	return buf == tmp ? strdup(buf) : buf;
 }