A couple parsing improvements and a new test case added to
[rsync/rsync-patches.git] / owner-group-mod.diff
index 19f1e7c..d75cf3d 100644 (file)
@@ -5,72 +5,77 @@ groups, even if they weren't returned by getgroups().  E.g.:
 
     rsync -avoogg host:/from/ /to/
 
---- orig/compat.c      2004-07-21 23:59:35
-+++ compat.c   2004-09-09 01:59:08
-@@ -28,8 +28,11 @@
+--- orig/compat.c      2005-11-14 21:24:47
++++ compat.c   2005-12-03 01:28:51
+@@ -28,11 +28,14 @@
  int remote_protocol = 0;
  
  extern int verbose;
 +extern int am_root;
  extern int am_server;
  extern int am_sender;
+ extern int inplace;
+ extern int fuzzy_basis;
+ extern int read_batch;
 +extern int preserve_uid;
 +extern int preserve_gid;
- extern int read_batch;
  extern int checksum_seed;
+ extern int basis_dir_cnt;
  extern int protocol_version;
-@@ -81,4 +84,11 @@ void setup_protocol(int f_out,int f_in)
+@@ -107,4 +110,11 @@ void setup_protocol(int f_out,int f_in)
        } else {
                checksum_seed = read_int(f_in);
        }
 +
 +      if (am_root) {
 +              if (preserve_uid)
-+                      preserve_uid = 2;
++                      preserve_uid = 3;
 +              if (preserve_gid)
-+                      preserve_gid = 2;
++                      preserve_gid = 3;
 +      }
  }
---- orig/options.c     2004-09-18 01:49:33
-+++ options.c  2004-09-09 01:59:08
-@@ -358,8 +358,8 @@ static struct poptOption long_options[] 
-   {"no-whole-file",    0,  POPT_ARG_VAL,    &whole_file, 0, 0, 0 },
-   {"copy-unsafe-links", 0, POPT_ARG_NONE,   &copy_unsafe_links, 0, 0, 0 },
-   {"perms",           'p', POPT_ARG_NONE,   &preserve_perms, 0, 0, 0 },
--  {"owner",           'o', POPT_ARG_NONE,   &preserve_uid, 0, 0, 0 },
--  {"group",           'g', POPT_ARG_NONE,   &preserve_gid, 0, 0, 0 },
-+  {"owner",           'o', POPT_ARG_NONE,   0,               'o', 0, 0 },
-+  {"group",           'g', POPT_ARG_NONE,   0,               'g', 0, 0 },
-   {"devices",         'D', POPT_ARG_NONE,   &preserve_devices, 0, 0, 0 },
-   {"times",           't', POPT_ARG_NONE,   &preserve_times, 0, 0, 0 },
-   {"checksum",        'c', POPT_ARG_NONE,   &always_checksum, 0, 0, 0 },
-@@ -568,6 +568,14 @@ int parse_arguments(int *argc, const cha
+--- orig/options.c     2005-11-15 18:21:22
++++ options.c  2005-12-03 01:28:45
+@@ -404,10 +404,10 @@ static struct poptOption long_options[] 
+   {"no-t",             0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
+   {"omit-dir-times",  'O', POPT_ARG_VAL,    &omit_dir_times, 2, 0, 0 },
+   {"modify-window",    0,  POPT_ARG_INT,    &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
+-  {"owner",           'o', POPT_ARG_VAL,    &preserve_uid, 1, 0, 0 },
++  {"owner",           'o', POPT_ARG_NONE,   0, 'o', 0, 0 },
+   {"no-owner",         0,  POPT_ARG_VAL,    &preserve_uid, 0, 0, 0 },
+   {"no-o",             0,  POPT_ARG_VAL,    &preserve_uid, 0, 0, 0 },
+-  {"group",           'g', POPT_ARG_VAL,    &preserve_gid, 1, 0, 0 },
++  {"group",           'g', POPT_ARG_NONE,   0, 'g', 0, 0 },
+   {"no-group",         0,  POPT_ARG_VAL,    &preserve_gid, 0, 0, 0 },
+   {"no-g",             0,  POPT_ARG_VAL,    &preserve_gid, 0, 0, 0 },
+   {"devices",         'D', POPT_ARG_VAL,    &preserve_devices, 1, 0, 0 },
+@@ -872,8 +872,8 @@ int parse_arguments(int *argc, const cha
+ #endif
+                       preserve_perms = 1;
+                       preserve_times = 1;
+-                      preserve_gid = 1;
+-                      preserve_uid = 1;
++                      preserve_uid |= 1;
++                      preserve_gid |= 1;
+                       preserve_devices = 1;
+                       break;
+@@ -881,6 +881,14 @@ int parse_arguments(int *argc, const cha
                        usage(FINFO);
                        exit_cleanup(0);
  
 +              case 'o':
-+                      preserve_uid++;
++                      preserve_uid += 2;
 +                      break;
 +
 +              case 'g':
-+                      preserve_gid++;
++                      preserve_gid += 2;
 +                      break;
 +
                case 'v':
                        verbose++;
                        break;
-@@ -707,8 +715,8 @@ int parse_arguments(int *argc, const cha
- #endif
-               preserve_perms = 1;
-               preserve_times = 1;
--              preserve_gid = 1;
--              preserve_uid = 1;
-+              preserve_uid |= 1;
-+              preserve_gid |= 1;
-               preserve_devices = 1;
-       }
-@@ -934,10 +942,16 @@ void server_options(char **args,int *arg
+@@ -1432,10 +1440,16 @@ void server_options(char **args,int *arg
  
        if (preserve_hard_links)
                argstr[x++] = 'H';
@@ -78,38 +83,38 @@ groups, even if they weren't returned by getgroups().  E.g.:
 +      if (preserve_uid) {
                argstr[x++] = 'o';
 -      if (preserve_gid)
-+              if (preserve_uid > 1)
++              if (preserve_uid > 2)
 +                      argstr[x++] = 'o';
 +      }
 +      if (preserve_gid) {
                argstr[x++] = 'g';
-+              if (preserve_gid > 1)
++              if (preserve_gid > 2)
 +                      argstr[x++] = 'g';
 +      }
        if (preserve_devices)
                argstr[x++] = 'D';
        if (preserve_times)
---- orig/rsync.c       2004-09-07 21:45:30
-+++ rsync.c    2004-09-09 01:59:08
-@@ -25,7 +25,6 @@
- extern int verbose;
- extern int dry_run;
+--- orig/rsync.c       2005-07-27 23:31:12
++++ rsync.c    2005-12-03 01:29:17
+@@ -27,7 +27,6 @@ extern int dry_run;
+ extern int daemon_log_format_has_i;
  extern int preserve_times;
+ extern int omit_dir_times;
 -extern int am_root;
+ extern int am_server;
  extern int am_sender;
  extern int am_generator;
- extern int preserve_uid;
-@@ -158,7 +157,7 @@ int set_perms(char *fname,struct file_st
-               updated = 1;
+@@ -82,7 +81,7 @@ int set_perms(char *fname,struct file_st
+                       updated = 1;
        }
  
 -      change_uid = am_root && preserve_uid && st->st_uid != file->uid;
-+      change_uid = preserve_uid > 1 && st->st_uid != file->uid;
++      change_uid = preserve_uid > 2 && st->st_uid != file->uid;
        change_gid = preserve_gid && file->gid != GID_NONE
                && st->st_gid != file->gid;
-       if (change_uid || change_gid) {
---- orig/uidlist.c     2004-04-29 19:37:25
-+++ uidlist.c  2004-09-09 01:59:08
+ #if !defined HAVE_LCHOWN && !defined CHOWN_MODIFIES_SYMLINK
+--- orig/uidlist.c     2005-11-10 16:58:36
++++ uidlist.c  2005-12-03 01:29:52
 @@ -35,7 +35,6 @@ extern int verbose;
  extern int preserve_uid;
  extern int preserve_gid;
@@ -123,21 +128,21 @@ groups, even if they weren't returned by getgroups().  E.g.:
        struct idlist *node;
  
 -      if (!am_root && !is_in_group(id2))
-+      if (preserve_gid < 2 && !is_in_group(id2))
++      if (preserve_gid < 3 && !is_in_group(id2))
                id2 = GID_NONE;
        node = add_to_list(&gidlist, id, name, id2);
  
-@@ -339,11 +338,11 @@ void recv_uid_list(int f, struct file_li
+@@ -338,11 +337,11 @@ void recv_uid_list(int f, struct file_li
  
        /* now convert the uid/gid of all files in the list to the mapped
         * uid/gid */
 -      if (am_root && preserve_uid && !numeric_ids) {
-+      if (preserve_uid > 1 && !numeric_ids) {
++      if (preserve_uid > 2 && !numeric_ids) {
                for (i = 0; i < flist->count; i++)
                        flist->files[i]->uid = match_uid(flist->files[i]->uid);
        }
 -      if (preserve_gid && (!am_root || !numeric_ids)) {
-+      if (preserve_gid && (preserve_gid < 2 || !numeric_ids)) {
++      if (preserve_gid && (preserve_gid < 3 || !numeric_ids)) {
                for (i = 0; i < flist->count; i++)
                        flist->files[i]->gid = match_gid(flist->files[i]->gid);
        }