From 3d64b0cc95c5957e53474c3e50f143c61a057104 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Thu, 18 Aug 2016 21:33:27 -0500 Subject: 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". --- lib/lib.h | 4 ++-- lib/xwrap.c | 36 ++++++++++++++++-------------------- 2 files changed, 18 insertions(+), 22 deletions(-) (limited to 'lib') 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) -- cgit v1.2.3