OSDN Git Service

Change xgetpwnamid/xgetgrnamid to xgetuid/xgetgid returning the id number
authorRob Landley <rob@landley.net>
Fri, 19 Aug 2016 02:33:27 +0000 (21:33 -0500)
committerRob Landley <rob@landley.net>
Fri, 19 Aug 2016 02:33:27 +0000 (21:33 -0500)
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
lib/xwrap.c
toys/other/makedevs.c
toys/posix/chgrp.c
toys/posix/cp.c
toys/posix/find.c

index 67d5303..43d6b1f 100644 (file)
--- 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);
index a7b7bfc..48e0296 100644 (file)
@@ -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)
index ed91fd9..5e6a982 100644 (file)
@@ -78,8 +78,8 @@ void makedevs_main()
       continue;
     } else mode |= (mode_t[]){S_IFIFO, S_IFCHR, S_IFBLK, 0, 0}[i];
 
-    uid = *user ? xgetpwnamid(user)->pw_uid : getuid();
-    gid = *group ? xgetgrnamid(group)->gr_gid : getgid();
+    uid = *user ? xgetuid(user) : getuid();
+    gid = *group ? xgetgid(group) : getgid();
 
     while (*node == '/') node++; // using relative path
 
index e0690c9..62e9eb1 100644 (file)
@@ -87,11 +87,11 @@ void chgrp_main(void)
       *(grp++) = 0;
       TT.group_name = grp;
     }
-    if (*own) TT.owner = xgetpwnamid(TT.owner_name = own)->pw_uid;
+    if (*own) TT.owner = xgetuid(TT.owner_name = own);
   } else TT.group_name = *toys.optargs;
 
   if (TT.group_name && *TT.group_name)
-    TT.group = xgetgrnamid(TT.group_name)->gr_gid;
+    TT.group = xgetgid(TT.group_name);
 
   for (s=toys.optargs+1; *s; s++)
     dirtree_flagread(*s, DIRTREE_SYMFOLLOW*!!(toys.optflags&(FLAG_H|FLAG_L)),
index eafabcd..0dd63a7 100644 (file)
@@ -499,8 +499,8 @@ void install_main(void)
   if (flags & FLAG_v) toys.optflags |= cp_flag_v();
   if (flags & (FLAG_p|FLAG_o|FLAG_g)) toys.optflags |= cp_flag_p();
 
-  if (TT.i.user) TT.uid = xgetpwnamid(TT.i.user)->pw_uid;
-  if (TT.i.group) TT.gid = xgetgrnamid(TT.i.group)->gr_gid;
+  if (TT.i.user) TT.uid = xgetuid(TT.i.user);
+  if (TT.i.group) TT.gid = xgetgid(TT.i.group);
 
   TT.callback = install_node;
   cp_main();
index 02f7702..86fc141 100644 (file)
@@ -398,8 +398,8 @@ static int do_find(struct dirtree *new)
             udl = xmalloc(sizeof(*udl));
             dlist_add_nomalloc(&TT.argdata, (void *)udl);
 
-            if (*s == 'u') udl->u.uid = xgetpwnamid(ss[1])->pw_uid;
-            else if (*s == 'g') udl->u.gid = xgetgrnamid(ss[1])->gr_gid;
+            if (*s == 'u') udl->u.uid = xgetuid(ss[1]);
+            else if (*s == 'g') udl->u.gid = xgetgid(ss[1]);
             else {
               struct stat st;