Implement the "m", "o", "g" include modifiers to tweak the permissions,
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index bad2fae..27fd44f 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 */
@@ -832,6 +840,25 @@ size_t stringjoin(char *dest, size_t destsize, ...)
        return ret;
 }
 
+/* Append formatted text at *dest_ptr up to a maximum of sz (like snprintf).
+ * On success, advance *dest_ptr and return True; on overflow, return False. */
+BOOL snappendf(char **dest_ptr, size_t sz, const char *format, ...)
+{
+       va_list ap;
+       size_t len;
+       
+       va_start(ap, format);
+       len = vsnprintf(*dest_ptr, sz, format, ap);
+       va_end(ap);
+
+       if (len >= sz)
+               return False;
+       else {
+               *dest_ptr += len;
+               return True;
+       }
+}
+
 int count_dir_elements(const char *p)
 {
        int cnt = 0, new_component = 1;