X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/fd2b6046cb0afc960da8cbd2c1dab40c786f8097..b506a4f40c9f6b2170c0d1a7efc643320ef3e2f5:/util.c diff --git a/util.c b/util.c index bad2faed..bc01afd0 100644 --- 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 */