summaryrefslogtreecommitdiff
path: root/src/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/io.c')
-rw-r--r--src/io.c27
1 files 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) {