io: use fget{pw,gr}ent_r only on uclibc and glibc

musl does not have those.
cute-signatures
Timo Teräs 2013-07-04 10:36:47 +03:00
parent 4fad6d9c15
commit 26558bd126
1 changed files with 23 additions and 4 deletions

View File

@ -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) {