-@@ -61,6 +61,8 @@ extern int copy_links;
- extern int copy_unsafe_links;
- extern int protocol_version;
- extern int sanitize_paths;
-+extern char *usermap;
-+extern char *groupmap;
+@@ -67,6 +67,7 @@ extern int need_unsorted_flist;
+ extern int unsort_ndx;
uid = recv_user_name(f, uid);
- else if (inc_recurse && am_root && !numeric_ids)
+ else if (inc_recurse && am_root && (!numeric_ids || usermap))
uid = match_uid(uid);
}
}
uid = recv_user_name(f, uid);
- else if (inc_recurse && am_root && !numeric_ids)
+ else if (inc_recurse && am_root && (!numeric_ids || usermap))
uid = match_uid(uid);
}
}
-@@ -752,7 +754,7 @@ static struct file_struct *recv_file_ent
- gid = (gid_t)read_varint(f);
- if (flags & XMIT_GROUP_NAME_FOLLOWS)
- gid = recv_group_name(f, gid);
+@@ -759,7 +760,7 @@ static struct file_struct *recv_file_ent
+ gid_flags = 0;
+ if (xflags & XMIT_GROUP_NAME_FOLLOWS)
+ gid = recv_group_name(f, gid, &gid_flags);
- else if (inc_recurse && (!am_root || !numeric_ids))
+ else if (inc_recurse && (!am_root || !numeric_ids || groupmap))
- else if (inc_recurse && (!am_root || !numeric_ids))
+ else if (inc_recurse && (!am_root || !numeric_ids || groupmap))
rprintf(F," --delay-updates put all updated files into place at transfer's end\n");
rprintf(F," -m, --prune-empty-dirs prune empty directory chains from the file-list\n");
rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
rprintf(F," --delay-updates put all updated files into place at transfer's end\n");
rprintf(F," -m, --prune-empty-dirs prune empty directory chains from the file-list\n");
rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
rprintf(F," --timeout=TIME set I/O timeout in seconds\n");
rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n");
rprintf(F," --size-only skip files that match in size\n");
rprintf(F," --timeout=TIME set I/O timeout in seconds\n");
rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n");
rprintf(F," --size-only skip files that match in size\n");
-@@ -568,6 +572,8 @@ static struct poptOption long_options[]
- {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
- {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
- {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
+@@ -601,6 +605,8 @@ static struct poptOption long_options[]
+ {"no-s", 0, POPT_ARG_VAL, &protect_args, 0, 0, 0},
+ {"numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 1, 0, 0 },
+ {"no-numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 0, 0, 0 },
+ {"usermap", 0, POPT_ARG_STRING, &usermap, 0, 0, 0 },
+ {"groupmap", 0, POPT_ARG_STRING, &groupmap, 0, 0, 0 },
{"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
+ {"usermap", 0, POPT_ARG_STRING, &usermap, 0, 0, 0 },
+ {"groupmap", 0, POPT_ARG_STRING, &groupmap, 0, 0, 0 },
{"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
{"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
{"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
- {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
-@@ -1857,6 +1863,18 @@ void server_options(char **args,int *arg
- args[ac++] = "--numeric-ids";
+@@ -1931,6 +1937,18 @@ void server_options(char **args, int *ar
+ args[ac++] = "--use-qsort";
--delay-updates put all updated files into place at end
-m, --prune-empty-dirs prune empty directory chains from file-list
--numeric-ids don't map uid/gid values by user/group name
--delay-updates put all updated files into place at end
-m, --prune-empty-dirs prune empty directory chains from file-list
--numeric-ids don't map uid/gid values by user/group name
--timeout=TIME set I/O timeout in seconds
-I, --ignore-times don't skip files that match size and time
--size-only skip files that match in size
--timeout=TIME set I/O timeout in seconds
-I, --ignore-times don't skip files that match size and time
--size-only skip files that match in size
the chroot setting affects rsync's ability to look up the names of the
users and groups and what you can do about it.
the chroot setting affects rsync's ability to look up the names of the
users and groups and what you can do about it.
+ #ifdef HAVE_GETGROUPS
+ # ifndef GETGROUPS_T
+@@ -41,6 +44,9 @@ extern int numeric_ids;
+
+ #define GID_NONE ((gid_t)-1)
+
++#define NFLAGS_WILD_NAME_MATCH (1<<0)
++#define NFLAGS_NAME_MATCH (1<<1)
++
+static struct idlist *uidlist, *uidmap;
+static struct idlist *gidlist, *gidmap;
+static struct idlist *uidlist, *uidmap;
+static struct idlist *gidlist, *gidmap;
- static struct idlist *add_to_list(struct idlist **root, int id, char *name,
- int id2)
-@@ -80,22 +82,6 @@ static char *gid_to_name(gid_t gid)
+ static struct idlist *add_to_list(struct idlist **root, id_t id, char *name,
+ id_t id2, uint16 flags)
+@@ -84,22 +90,6 @@ static char *gid_to_name(gid_t gid)
-- node = add_to_list(&uidlist, (int)id, name, (int)id2);
+- node = add_to_list(&uidlist, id, name, id2, 0);
-- rprintf(FINFO, "uid %d(%s) maps to %d\n",
-- (int)id, name ? name : "", (int)id2);
+- rprintf(FINFO, "uid %u(%s) maps to %u\n",
+- (unsigned)id, name ? name : "", (unsigned)id2);
-- if (!am_root && !is_in_group(id2))
-+ if (idmap_ptr == &gidmap && !am_root && !is_in_group(id2))
- id2 = GID_NONE;
-- node = add_to_list(&gidlist, (int)id, name, (int)id2);
-+ node = add_to_list(idmap_ptr, id, *name ? name : NULL, id2);
+- node = add_to_list(&gidlist, id, name, id2,
+- !am_root && !is_in_group(id2) ? FLAG_SKIP_GROUP : 0);
++ node = add_to_list(idmap_ptr, id, *name ? name : NULL, id2,
++ !am_root && idmap_ptr == &gidmap
++ && !is_in_group(id2) ? FLAG_SKIP_GROUP : 0);
-- rprintf(FINFO, "gid %d(%s) maps to %d\n",
-- (int)id, name ? name : "", (int)id2);
-+ rprintf(FINFO, "%sid %d(%s) maps to %d\n",
-+ idmap_ptr == &uidmap ? "u" : "g", id, name, id2);
+- rprintf(FINFO, "gid %u(%s) maps to %u\n",
+- (unsigned)id, name ? name : "", (unsigned)id2);
++ rprintf(FINFO, "%sid %u(%s) maps to %u\n",
++ idmap_ptr == &uidmap ? "u" : "g",
++ (unsigned)id, name, (unsigned)id2);
- return id2;
-@@ -192,12 +195,9 @@ static gid_t recv_add_gid(gid_t id, char
+ return node;
+@@ -195,12 +200,9 @@ static struct idlist *recv_add_gid(gid_t
-@@ -208,7 +208,7 @@ uid_t match_uid(uid_t uid)
- return last_out = (uid_t)list->id2;
+@@ -208,10 +210,13 @@ uid_t match_uid(uid_t uid)
+
+ for (list = uidlist; list; list = list->next) {
+ if (list->id == uid)
+- return last_out = list->id2;
++ break;
-+ return last_out = (uid_t)recv_add_id(&uidmap, (int)uid, NULL);
++ if (!list)
++ list = recv_add_id(&uidmap, uid, NULL);
++
++ return last_out = list->id2;
- gid_t match_gid(gid_t gid)
-@@ -229,7 +229,7 @@ gid_t match_gid(gid_t gid)
- return last_out = (gid_t)list->id2;
+ gid_t match_gid(gid_t gid, uint16 *flags_ptr)
+@@ -227,7 +232,7 @@ gid_t match_gid(gid_t gid, uint16 *flags
+ break;
+ }
+ if (!list)
+- list = recv_add_gid(gid, NULL);
++ list = recv_add_id(&gidmap, gid, NULL);
+ last = list;
-- return last_out = recv_add_gid(gid, NULL);
-+ return last_out = (gid_t)recv_add_id(&gidmap, (int)gid, NULL);
- }
-
- /* Add a uid to the list of uids. Only called on sending side. */
-@@ -311,7 +311,7 @@ uid_t recv_user_name(int f, uid_t uid)
+@@ -316,7 +321,7 @@ uid_t recv_user_name(int f, uid_t uid)
-- return recv_add_uid(uid, name); /* node keeps name's memory */
-+ return (uid_t)recv_add_id(&uidmap, (int)uid, name); /* node keeps name's memory */
+- node = recv_add_uid(uid, name); /* node keeps name's memory */
++ node = recv_add_id(&uidmap, uid, name); /* node keeps name's memory */
+ return node->id2;
- gid_t recv_group_name(int f, gid_t gid)
-@@ -321,7 +321,7 @@ gid_t recv_group_name(int f, gid_t gid)
+@@ -328,7 +333,7 @@ gid_t recv_group_name(int f, gid_t gid,
-- return recv_add_gid(gid, name); /* node keeps name's memory */
-+ return (gid_t)recv_add_id(&gidmap, (int)gid, name); /* node keeps name's memory */
- }
-
- /* recv a complete uid/gid mapping from the peer and map the uid/gid
-@@ -344,15 +344,88 @@ void recv_uid_list(int f, struct file_li
+- node = recv_add_gid(gid, name); /* node keeps name's memory */
++ node = recv_add_id(&gidmap, gid, name); /* node keeps name's memory */
+ if (flags_ptr && node->flags & FLAG_SKIP_GROUP)
+ *flags_ptr |= FLAG_SKIP_GROUP;
+ return node->id2;
+@@ -355,17 +360,96 @@ void recv_id_list(int f, struct file_lis
/* Now convert all the uids/gids from sender values to our values. */
#ifdef SUPPORT_ACLS
- if (preserve_acls && !numeric_ids)
/* Now convert all the uids/gids from sender values to our values. */
#ifdef SUPPORT_ACLS
- if (preserve_acls && !numeric_ids)
match_acl_ids();
#endif
- if (am_root && preserve_uid && !numeric_ids) {
+ if (am_root && preserve_uid && (!numeric_ids || usermap)) {
match_acl_ids();
#endif
- if (am_root && preserve_uid && !numeric_ids) {
+ if (am_root && preserve_uid && (!numeric_ids || usermap)) {
}
- if (preserve_gid && (!am_root || !numeric_ids)) {
+ if (preserve_gid && (!am_root || !numeric_ids || groupmap)) {
}
- if (preserve_gid && (!am_root || !numeric_ids)) {
+ if (preserve_gid && (!am_root || !numeric_ids || groupmap)) {
- for (i = 0; i < flist->count; i++)
- F_GROUP(flist->files[i]) = match_gid(F_GID(flist->files[i]));
+ for (i = 0; i < flist->used; i++) {
+ F_GROUP(flist->files[i]) = match_gid(F_GROUP(flist->files[i]),
+ &flist->files[i]->flags);
+ }
+ struct idlist **idmap_ptr = usernames ? &uidmap : &gidmap;
+ struct idlist **idlist_ptr = usernames ? &uidlist : &gidlist;
+ char *colon, *end, *cp = map + strlen(map);
+ struct idlist **idmap_ptr = usernames ? &uidmap : &gidmap;
+ struct idlist **idlist_ptr = usernames ? &uidlist : &gidlist;
+ char *colon, *end, *cp = map + strlen(map);
+ usernames ? "user" : "group", cp);
+ exit_cleanup(RERR_SYNTAX);
+ }
+ usernames ? "user" : "group", cp);
+ exit_cleanup(RERR_SYNTAX);
+ }
-+ } else if (strpbrk(cp, "*[?"))
-+ id1 = -2;
-+ else
-+ id1 = -1;
++ } else if (strpbrk(cp, "*[?")) {
++ flags = NFLAGS_WILD_NAME_MATCH;
++ id1 = 0;
++ } else {
++ flags = NFLAGS_NAME_MATCH;
++ id1 = 0;
++ }
+
+ if (isDigit(colon+1)) {
+ if (strspn(colon+1, "0123456789") != (size_t)(end - colon - 1)) {
+
+ if (isDigit(colon+1)) {
+ if (strspn(colon+1, "0123456789") != (size_t)(end - colon - 1)) {
-+ add_to_list(idmap_ptr, id1, id1 < 0 ? cp : NULL, id2);
-+ if (numeric_ids && id2 >= 0)
-+ add_to_list(idlist_ptr, id1, NULL, id2);
++ add_to_list(idmap_ptr, id1, flags ? cp : NULL, id2, flags);
++ if (numeric_ids && !flags)
++ add_to_list(idlist_ptr, id1, NULL, id2, flags);