aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2016-08-18 21:33:27 -0500
committerRob Landley <rob@landley.net>2016-08-18 21:33:27 -0500
commit3d64b0cc95c5957e53474c3e50f143c61a057104 (patch)
tree0c32cb7e4d104aa5d3c1f7ee0dcb7ac1f45f3a20 /lib
parent05e1582ec435932a25db21fd3ae71fbf62a4b45d (diff)
downloadtoybox-3d64b0cc95c5957e53474c3e50f143c61a057104.tar.gz
Change xgetpwnamid/xgetgrnamid to xgetuid/xgetgid returning the id number
instead of a struct. This means it can return "12345" even if that user/group doesn't exist in /etc/passwd and similar. All the users were immediately dereferencing it to get pw_uid or gr_gid anyway, so just return it directly and adjust the users. This fixes things like "chown 12345:23456 filename".
Diffstat (limited to 'lib')
-rw-r--r--lib/lib.h4
-rw-r--r--lib/xwrap.c36
2 files changed, 18 insertions, 22 deletions
diff --git a/lib/lib.h b/lib/lib.h
index 67d53035..43d6b1ff 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -153,8 +153,8 @@ struct passwd *xgetpwuid(uid_t uid);
struct group *xgetgrgid(gid_t gid);
struct passwd *xgetpwnam(char *name);
struct group *xgetgrnam(char *name);
-struct passwd *xgetpwnamid(char *user);
-struct group *xgetgrnamid(char *group);
+unsigned xgetuid(char *name);
+unsigned xgetgid(char *name);
void xsetuser(struct passwd *pwd);
char *xreadlink(char *name);
long xparsetime(char *arg, long units, long *fraction);
diff --git a/lib/xwrap.c b/lib/xwrap.c
index a7b7bfcb..48e02965 100644
--- a/lib/xwrap.c
+++ b/lib/xwrap.c
@@ -590,36 +590,32 @@ struct group *xgetgrgid(gid_t gid)
return group;
}
-struct passwd *xgetpwnamid(char *user)
+unsigned xgetuid(char *name)
{
- struct passwd *up = getpwnam(user);
- uid_t uid;
+ struct passwd *up = getpwnam(name);
+ char *s = 0;
+ long uid;
- if (!up) {
- char *s = 0;
+ if (up) return up->pw_uid;
- uid = estrtol(user, &s, 10);
- if (!errno && s && !*s) up = getpwuid(uid);
- }
- if (!up) perror_exit("user '%s'", user);
+ uid = estrtol(name, &s, 10);
+ if (!errno && s && !*s && uid>=0 && uid<=UINT_MAX) return uid;
- return up;
+ error_exit("bad user '%s'", name);
}
-struct group *xgetgrnamid(char *group)
+unsigned xgetgid(char *name)
{
- struct group *gr = getgrnam(group);
- gid_t gid;
+ struct group *gr = getgrnam(name);
+ char *s = 0;
+ long gid;
- if (!gr) {
- char *s = 0;
+ if (gr) return gr->gr_gid;
- gid = estrtol(group, &s, 10);
- if (!errno && s && !*s) gr = getgrgid(gid);
- }
- if (!gr) perror_exit("group '%s'", group);
+ gid = estrtol(name, &s, 10);
+ if (!errno && s && !*s && gid>=0 && gid<=UINT_MAX) return gid;
- return gr;
+ error_exit("bad group '%s'", name);
}
struct passwd *xgetpwnam(char *name)