From f4d9c794491808dfba3d0ec83d6907a6e9adbd84 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Fri, 28 Jul 2017 06:09:24 +0000 Subject: libgcompat: add getpwent_r() and fgetpwent_r() stubs --- Makefile | 1 + libgcompat/pwd.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 libgcompat/pwd.c diff --git a/Makefile b/Makefile index e71ad20..59b365d 100644 --- a/Makefile +++ b/Makefile @@ -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 +#include +#include +#include + + +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; +} -- cgit v1.2.3-70-g09d2