diff options
author | William Pitcock <nenolod@dereferenced.org> | 2017-07-28 06:09:24 +0000 |
---|---|---|
committer | William Pitcock <nenolod@dereferenced.org> | 2017-07-28 06:09:24 +0000 |
commit | f4d9c794491808dfba3d0ec83d6907a6e9adbd84 (patch) | |
tree | 4e1178a759364737426b6a9bca3bc3205ae90223 /libgcompat | |
parent | aadf39c06a5573439f9a733d05946e723e77992b (diff) | |
download | gcompat-f4d9c794491808dfba3d0ec83d6907a6e9adbd84.tar.gz gcompat-f4d9c794491808dfba3d0ec83d6907a6e9adbd84.tar.bz2 gcompat-f4d9c794491808dfba3d0ec83d6907a6e9adbd84.tar.xz gcompat-f4d9c794491808dfba3d0ec83d6907a6e9adbd84.zip |
libgcompat: add getpwent_r() and fgetpwent_r() stubs
Diffstat (limited to 'libgcompat')
-rw-r--r-- | libgcompat/pwd.c | 55 |
1 files changed, 55 insertions, 0 deletions
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; +} |