Commit | Line | Data |
---|---|---|
6c4bd5ab WD |
1 | This patch implements an idiom where two -o options cause rsync |
2 | to try to set the owner information even if we're not running as | |
3 | UID 0. Similarly, two -g options cause rsync to try to set all | |
4 | groups, even if they weren't returned by getgroups(). E.g.: | |
5 | ||
6 | rsync -avoogg host:/from/ /to/ | |
7 | ||
8f72c7ae WD |
8 | --- orig/compat.c 2005-03-09 18:53:55 |
9 | +++ compat.c 2005-03-11 11:25:46 | |
1d15f8d9 WD |
10 | @@ -28,11 +28,14 @@ |
11 | int remote_protocol = 0; | |
6c4bd5ab WD |
12 | |
13 | extern int verbose; | |
14 | +extern int am_root; | |
15 | extern int am_server; | |
16 | extern int am_sender; | |
8f72c7ae | 17 | extern int inplace; |
09fb8f03 | 18 | extern int fuzzy_basis; |
6c4bd5ab | 19 | extern int read_batch; |
09fb8f03 WD |
20 | +extern int preserve_uid; |
21 | +extern int preserve_gid; | |
8f72c7ae WD |
22 | extern int checksum_seed; |
23 | extern int basis_dir_cnt; | |
6c4bd5ab | 24 | extern int protocol_version; |
8f72c7ae | 25 | @@ -106,4 +109,11 @@ void setup_protocol(int f_out,int f_in) |
6c4bd5ab WD |
26 | } else { |
27 | checksum_seed = read_int(f_in); | |
28 | } | |
29 | + | |
30 | + if (am_root) { | |
31 | + if (preserve_uid) | |
32 | + preserve_uid = 2; | |
33 | + if (preserve_gid) | |
34 | + preserve_gid = 2; | |
35 | + } | |
36 | } | |
489b0a72 WD |
37 | --- orig/options.c 2005-08-27 21:11:26 |
38 | +++ options.c 2005-08-27 21:26:04 | |
39 | @@ -390,10 +390,10 @@ static struct poptOption long_options[] | |
40 | {"no-t", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 }, | |
ae5a2ebc | 41 | {"omit-dir-times", 'O', POPT_ARG_VAL, &omit_dir_times, 2, 0, 0 }, |
489b0a72 WD |
42 | {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 }, |
43 | - {"owner", 'o', POPT_ARG_VAL, &preserve_uid, 1, 0, 0 }, | |
44 | + {"owner", 'o', POPT_ARG_NONE, 0, 'o', 0, 0 }, | |
45 | {"no-owner", 0, POPT_ARG_VAL, &preserve_uid, 0, 0, 0 }, | |
46 | {"no-o", 0, POPT_ARG_VAL, &preserve_uid, 0, 0, 0 }, | |
47 | - {"group", 'g', POPT_ARG_VAL, &preserve_gid, 1, 0, 0 }, | |
48 | + {"group", 'g', POPT_ARG_NONE, 0, 'g', 0, 0 }, | |
49 | {"no-group", 0, POPT_ARG_VAL, &preserve_gid, 0, 0, 0 }, | |
50 | {"no-g", 0, POPT_ARG_VAL, &preserve_gid, 0, 0, 0 }, | |
51 | {"devices", 'D', POPT_ARG_VAL, &preserve_devices, 1, 0, 0 }, | |
52 | @@ -812,7 +812,8 @@ int parse_arguments(int *argc, const cha | |
53 | #endif | |
54 | preserve_perms = 1; | |
55 | preserve_times = 1; | |
56 | - preserve_gid = 1; | |
57 | + preserve_uid |= 1; | |
58 | + preserve_gid |= 1; | |
59 | preserve_uid = 1; | |
60 | preserve_devices = 1; | |
61 | break; | |
62 | @@ -821,6 +822,14 @@ int parse_arguments(int *argc, const cha | |
6c4bd5ab WD |
63 | usage(FINFO); |
64 | exit_cleanup(0); | |
65 | ||
66 | + case 'o': | |
67 | + preserve_uid++; | |
68 | + break; | |
69 | + | |
70 | + case 'g': | |
71 | + preserve_gid++; | |
72 | + break; | |
73 | + | |
74 | case 'v': | |
75 | verbose++; | |
76 | break; | |
489b0a72 | 77 | @@ -1329,10 +1338,16 @@ void server_options(char **args,int *arg |
1d15f8d9 | 78 | |
6c4bd5ab WD |
79 | if (preserve_hard_links) |
80 | argstr[x++] = 'H'; | |
81 | - if (preserve_uid) | |
82 | + if (preserve_uid) { | |
83 | argstr[x++] = 'o'; | |
84 | - if (preserve_gid) | |
85 | + if (preserve_uid > 1) | |
86 | + argstr[x++] = 'o'; | |
87 | + } | |
88 | + if (preserve_gid) { | |
89 | argstr[x++] = 'g'; | |
90 | + if (preserve_gid > 1) | |
91 | + argstr[x++] = 'g'; | |
92 | + } | |
93 | if (preserve_devices) | |
94 | argstr[x++] = 'D'; | |
95 | if (preserve_times) | |
489b0a72 | 96 | --- orig/rsync.c 2005-07-27 23:31:12 |
a7219d20 | 97 | +++ rsync.c 2005-02-01 10:46:04 |
c968d24c | 98 | @@ -27,7 +27,6 @@ extern int dry_run; |
1d15f8d9 | 99 | extern int daemon_log_format_has_i; |
6c4bd5ab | 100 | extern int preserve_times; |
9a21ad72 | 101 | extern int omit_dir_times; |
6c4bd5ab | 102 | -extern int am_root; |
a7219d20 | 103 | extern int am_server; |
6c4bd5ab WD |
104 | extern int am_sender; |
105 | extern int am_generator; | |
489b0a72 WD |
106 | @@ -82,7 +81,7 @@ int set_perms(char *fname,struct file_st |
107 | updated = 1; | |
6c4bd5ab WD |
108 | } |
109 | ||
110 | - change_uid = am_root && preserve_uid && st->st_uid != file->uid; | |
111 | + change_uid = preserve_uid > 1 && st->st_uid != file->uid; | |
112 | change_gid = preserve_gid && file->gid != GID_NONE | |
113 | && st->st_gid != file->gid; | |
09fb8f03 | 114 | #if !defined HAVE_LCHOWN && !defined CHOWN_MODIFIES_SYMLINK |
8f72c7ae | 115 | --- orig/uidlist.c 2005-02-14 00:53:44 |
6c4bd5ab WD |
116 | +++ uidlist.c 2004-09-09 01:59:08 |
117 | @@ -35,7 +35,6 @@ extern int verbose; | |
118 | extern int preserve_uid; | |
119 | extern int preserve_gid; | |
120 | extern int numeric_ids; | |
121 | -extern int am_root; | |
122 | ||
123 | struct idlist { | |
124 | struct idlist *next; | |
125 | @@ -177,7 +176,7 @@ static struct idlist *recv_add_gid(int i | |
126 | int id2 = name ? map_gid(id, name) : id; | |
127 | struct idlist *node; | |
128 | ||
129 | - if (!am_root && !is_in_group(id2)) | |
130 | + if (preserve_gid < 2 && !is_in_group(id2)) | |
131 | id2 = GID_NONE; | |
132 | node = add_to_list(&gidlist, id, name, id2); | |
133 | ||
134 | @@ -339,11 +338,11 @@ void recv_uid_list(int f, struct file_li | |
135 | ||
136 | /* now convert the uid/gid of all files in the list to the mapped | |
137 | * uid/gid */ | |
138 | - if (am_root && preserve_uid && !numeric_ids) { | |
139 | + if (preserve_uid > 1 && !numeric_ids) { | |
140 | for (i = 0; i < flist->count; i++) | |
141 | flist->files[i]->uid = match_uid(flist->files[i]->uid); | |
142 | } | |
143 | - if (preserve_gid && (!am_root || !numeric_ids)) { | |
144 | + if (preserve_gid && (preserve_gid < 2 || !numeric_ids)) { | |
145 | for (i = 0; i < flist->count; i++) | |
146 | flist->files[i]->gid = match_gid(flist->files[i]->gid); | |
147 | } |