diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | libgcompat/pwd.c | 55 |
2 files changed, 56 insertions, 0 deletions
@@ -6,6 +6,7 @@ LIBGCOMPAT_SRC = \ libgcompat/malloc.c \ libgcompat/math.c \ libgcompat/pthread.c \ + libgcompat/pwd.c \ libgcompat/resource.c \ libgcompat/setjmp.c \ libgcompat/stdio.c \ diff --git a/libgcompat/pwd.c b/libgcompat/pwd.c new file mode 100644 index 0000000..2e09aea --- /dev/null +++ b/libgcompat/pwd.c @@ -0,0 +1,55 @@ +/* some musl versions incorrectly mark fgetpwent() as a GNU extension */ +#define _GNU_SOURCE + +#include <stdio.h> +#include <errno.h> +#include <pwd.h> +#include <string.h> + + +int getpwent_r(struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp) { + struct passwd *pwd; + + if (pwbufp == NULL || pwbuf == NULL) + return ERANGE; + + if (buflen < 1) + return ERANGE; + + if (buf != NULL) + *buf = '\0'; + + if ((pwd = getpwent()) == NULL) { + *pwbufp = NULL; + return ENOENT; + } + + memcpy(pwbuf, pwd, sizeof(*pwd)); + *pwbufp = pwbuf; + + return 0; +} + + +int fgetpwent_r(FILE *filp, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp) { + struct passwd *pwd; + + if (pwbufp == NULL || pwbuf == NULL) + return ERANGE; + + if (buflen < 1) + return ERANGE; + + if (buf != NULL) + *buf = '\0'; + + if ((pwd = fgetpwent(filp)) == NULL) { + *pwbufp = NULL; + return ENOENT; + } + + memcpy(pwbuf, pwd, sizeof(*pwd)); + *pwbufp = pwbuf; + + return 0; +} |