Enhance name_to_{u,g}id() to optionally parse numbers and rename
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index bad2fae..bec9a93 100644 (file)
--- a/util.c
+++ b/util.c
@@ -534,24 +534,32 @@ void kill_all(int sig)
        }
 }
 
        }
 }
 
-/** Turn a user name into a uid */
-int name_to_uid(const char *name, uid_t *uid_p)
+/* Parse a user name or (optionally) a number into a uid */
+int user_to_uid(const char *name, uid_t *uid_p, BOOL num_ok)
 {
        struct passwd *pass;
        if (!name || !*name)
                return 0;
 {
        struct passwd *pass;
        if (!name || !*name)
                return 0;
+       if (num_ok && name[strspn(name, "0123456789")] == '\0') {
+               *uid_p = atol(name);
+               return 1;
+       }
        if (!(pass = getpwnam(name)))
                return 0;
        *uid_p = pass->pw_uid;
        return 1;
 }
 
        if (!(pass = getpwnam(name)))
                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)
+/* Parse a group name or (optionally) a number into a gid */
+int group_to_gid(const char *name, gid_t *gid_p, BOOL num_ok)
 {
        struct group *grp;
        if (!name || !*name)
                return 0;
 {
        struct group *grp;
        if (!name || !*name)
                return 0;
+       if (num_ok && name[strspn(name, "0123456789")] == '\0') {
+               *gid_p = atol(name);
+               return 1;
+       }
        if (!(grp = getgrnam(name)))
                return 0;
        *gid_p = grp->gr_gid;
        if (!(grp = getgrnam(name)))
                return 0;
        *gid_p = grp->gr_gid;