musl - musl - an implementation of the standard library for Linux-based systems

index : musl
musl - an implementation of the standard library for Linux-based systems
summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012年03月01日 22:08:05 -0500
committerRich Felker <dalias@aerifal.cx>2012年03月01日 22:08:05 -0500
commit899b13cae77469a9ed1f076c456b66d567af69d8 (patch)
treea01682acfab764f81abdc08c60ac33320e8fc93a /src
parent051175d4fe2bdc7b09da9b303e88881ad4f936ff (diff)
downloadmusl-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')
-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;
}
generated by cgit v1.2.1 (git 2.18.0) at 2025年09月18日 17:17:39 +0000

AltStyle によって変換されたページ (->オリジナル) /