diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-03-01 22:08:05 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-03-01 22:08:05 -0500 |
commit | 899b13cae77469a9ed1f076c456b66d567af69d8 (patch) | |
tree | a01682acfab764f81abdc08c60ac33320e8fc93a /src/unistd/getcwd.c | |
parent | 051175d4fe2bdc7b09da9b303e88881ad4f936ff (diff) | |
download | musl-899b13cae77469a9ed1f076c456b66d567af69d8.tar.gz |
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.
Diffstat (limited to 'src/unistd/getcwd.c')
-rw-r--r-- | src/unistd/getcwd.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/unistd/getcwd.c b/src/unistd/getcwd.c index b64b560f..2e540cd4 100644 --- a/src/unistd/getcwd.c +++ b/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; } |