Enhance name_to_[ug]id to optionally recognize numbers.
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index bad2fae..bc01afd 100644 (file)
--- a/util.c
+++ b/util.c
@@ -535,27 +535,35 @@ void kill_all(int sig)
 }
 
 /** Turn a user name into a uid */
-int name_to_uid(const char *name, uid_t *uid_p)
+int name_to_uid(const char *name, uid_t *uid_p, BOOL num_ok)
 {
        struct passwd *pass;
        if (!name || !*name)
                return 0;
-       if (!(pass = getpwnam(name)))
+       if (num_ok && name[strspn(name, "0123456789")] == '\0') {
+               *uid_p = atol(name);
+               return 1;
+       } else if ((pass = getpwnam(name))) {
+               *uid_p = pass->pw_uid;
+               return 1;
+       } else
                return 0;
-       *uid_p = pass->pw_uid;
-       return 1;
 }
 
 /** Turn a group name into a gid */
-int name_to_gid(const char *name, gid_t *gid_p)
+int name_to_gid(const char *name, gid_t *gid_p, BOOL num_ok)
 {
        struct group *grp;
        if (!name || !*name)
                return 0;
-       if (!(grp = getgrnam(name)))
+       if (num_ok && name[strspn(name, "0123456789")] == '\0') {
+               *gid_p = atol(name);
+               return 1;
+       } else if ((grp = getgrnam(name))) {
+               *gid_p = grp->gr_gid;
+               return 1;
+       } else
                return 0;
-       *gid_p = grp->gr_gid;
-       return 1;
 }
 
 /** Lock a byte range in a open file */