From 26558bd126a611ca3d1490c0f27c30bf5b99114c Mon Sep 17 00:00:00 2001 From: Timo Teräs Date: Thu, 4 Jul 2013 10:36:47 +0300 Subject: io: use fget{pw,gr}ent_r only on uclibc and glibc musl does not have those. --- src/io.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/io.c b/src/io.c index 3b19c63..5ea5e4f 100644 --- a/src/io.c +++ b/src/io.c @@ -25,6 +25,11 @@ #include "apk_io.h" #include "apk_hash.h" +#if defined(__GLIBC__) || defined(__UCLIBC__) +#define HAVE_FGETPWENT_R +#define HAVE_FGETGRENT_R +#endif + struct apk_fd_istream { struct apk_istream is; int fd; @@ -908,9 +913,12 @@ void apk_id_cache_reset(struct apk_id_cache *idc) uid_t apk_resolve_uid(struct apk_id_cache *idc, const char *username, uid_t default_uid) { - struct cache_item *ci; - struct passwd pwent, *pwd; +#ifdef HAVE_FGETPWENT_R char buf[1024]; + struct passwd pwent; +#endif + struct cache_item *ci; + struct passwd *pwd; FILE *in; ci = resolve_cache_item(&idc->uid_cache, APK_BLOB_STR(username)); @@ -924,7 +932,11 @@ uid_t apk_resolve_uid(struct apk_id_cache *idc, const char *username, uid_t defa in = fdopen(openat(idc->root_fd, "etc/passwd", O_RDONLY|O_CLOEXEC), "r"); if (in != NULL) { do { +#ifdef HAVE_FGETPWENT_R fgetpwent_r(in, &pwent, buf, sizeof(buf), &pwd); +#else + pwd = fgetpwent(in); +#endif if (pwd == NULL) break; if (strcmp(pwd->pw_name, username) == 0) { @@ -944,9 +956,12 @@ uid_t apk_resolve_uid(struct apk_id_cache *idc, const char *username, uid_t defa uid_t apk_resolve_gid(struct apk_id_cache *idc, const char *groupname, uid_t default_gid) { - struct cache_item *ci; - struct group grent, *grp; +#ifdef HAVE_FGETGRENT_R char buf[1024]; + struct group grent; +#endif + struct cache_item *ci; + struct group *grp; FILE *in; ci = resolve_cache_item(&idc->gid_cache, APK_BLOB_STR(groupname)); @@ -960,7 +975,11 @@ uid_t apk_resolve_gid(struct apk_id_cache *idc, const char *groupname, uid_t def in = fdopen(openat(idc->root_fd, "etc/group", O_RDONLY|O_CLOEXEC), "r"); if (in != NULL) { do { +#ifdef HAVE_FGETGRENT_R fgetgrent_r(in, &grent, buf, sizeof(buf), &grp); +#else + grp = fgetgrent(in); +#endif if (grp == NULL) break; if (strcmp(grp->gr_name, groupname) == 0) { -- cgit v1.2.3-70-g09d2