diff options
author | Rob Landley <rob@landley.net> | 2016-08-18 21:33:27 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2016-08-18 21:33:27 -0500 |
commit | 3d64b0cc95c5957e53474c3e50f143c61a057104 (patch) | |
tree | 0c32cb7e4d104aa5d3c1f7ee0dcb7ac1f45f3a20 /lib | |
parent | 05e1582ec435932a25db21fd3ae71fbf62a4b45d (diff) | |
download | toybox-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.h | 4 | ||||
-rw-r--r-- | lib/xwrap.c | 36 |
2 files changed, 18 insertions, 22 deletions
@@ -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) |