aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2022-04-02 19:33:14 -0500
committerRob Landley <rob@landley.net>2022-04-02 19:33:14 -0500
commit72e7e3821b4a0cce07e6d1450efef09ca9d3a5db (patch)
treef7f7bb424ff5cc93c9e5d166d805915e71c55ca9 /lib
parentcfea8f012d6d755026e27297dca5293c4973b2d4 (diff)
downloadtoybox-72e7e3821b4a0cce07e6d1450efef09ca9d3a5db.tar.gz
Add tar --strip-components.
Also in lib/ add bufget name variants for password and group.
Diffstat (limited to 'lib')
-rw-r--r--lib/lib.c29
-rw-r--r--lib/lib.h2
2 files changed, 25 insertions, 6 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 3f709f07..cf0a9582 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -1252,7 +1252,7 @@ char *next_printf(char *s, char **start)
}
// Return cached passwd entries.
-struct passwd *bufgetpwuid(uid_t uid)
+struct passwd *bufgetpwnamuid(char *name, uid_t uid)
{
struct pwuidbuf_list {
struct pwuidbuf_list *next;
@@ -1264,11 +1264,14 @@ struct passwd *bufgetpwuid(uid_t uid)
// If we already have this one, return it.
for (list = pwuidbuf; list; list = list->next)
- if (list->pw.pw_uid == uid) return &(list->pw);
+ if (name ? !strcmp(name, list->pw.pw_name) : list->pw.pw_uid==uid)
+ return &(list->pw);
for (;;) {
list = xrealloc(list, size *= 2);
- errno = getpwuid_r(uid, &list->pw, sizeof(*list)+(char *)list,
+ if (name) errno = getpwnam_r(name, &list->pw, sizeof(*list)+(char *)list,
+ size-sizeof(*list), &temp);
+ else errno = getpwuid_r(uid, &list->pw, sizeof(*list)+(char *)list,
size-sizeof(*list), &temp);
if (errno != ERANGE) break;
}
@@ -1284,8 +1287,13 @@ struct passwd *bufgetpwuid(uid_t uid)
return &list->pw;
}
+struct passwd *bufgetpwuid(uid_t uid)
+{
+ return bufgetpwnamuid(0, uid);
+}
+
// Return cached group entries.
-struct group *bufgetgrgid(gid_t gid)
+struct group *bufgetgrnamgid(char *name, gid_t gid)
{
struct grgidbuf_list {
struct grgidbuf_list *next;
@@ -1296,11 +1304,14 @@ struct group *bufgetgrgid(gid_t gid)
unsigned size = 256;
for (list = grgidbuf; list; list = list->next)
- if (list->gr.gr_gid == gid) return &(list->gr);
+ if (name ? !strcmp(name, list->gr.gr_name) : list->gr.gr_gid==gid)
+ return &(list->gr);
for (;;) {
list = xrealloc(list, size *= 2);
- errno = getgrgid_r(gid, &list->gr, sizeof(*list)+(char *)list,
+ if (name) errno = getgrnam_r(name, &list->gr, sizeof(*list)+(char *)list,
+ size-sizeof(*list), &temp);
+ else errno = getgrgid_r(gid, &list->gr, sizeof(*list)+(char *)list,
size-sizeof(*list), &temp);
if (errno != ERANGE) break;
}
@@ -1315,6 +1326,12 @@ struct group *bufgetgrgid(gid_t gid)
return &list->gr;
}
+struct group *bufgetgrgid(gid_t gid)
+{
+ return bufgetgrnamgid(0, gid);
+}
+
+
// Always null terminates, returns 0 for failure, len for success
int readlinkat0(int dirfd, char *path, char *buf, int len)
{
diff --git a/lib/lib.h b/lib/lib.h
index 6e9a2640..1721dd67 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -260,7 +260,9 @@ int qstrcmp(const void *a, const void *b);
void create_uuid(char *uuid);
char *show_uuid(char *uuid);
char *next_printf(char *s, char **start);
+struct passwd *bufgetpwnamuid(char *name, uid_t uid);
struct passwd *bufgetpwuid(uid_t uid);
+struct group *bufgetgrnamgid(char *name, gid_t gid);
struct group *bufgetgrgid(gid_t gid);
int readlinkat0(int dirfd, char *path, char *buf, int len);
int readlink0(char *path, char *buf, int len);