/* 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; }