The latest patches.
[rsync.git/patches.git] / fileflags.diff
index f2ccc59342366aff4dce330b2c5f0b13fe34680e..1e51944def18a820def5552c7bead558dab87cd5 100644 (file)
@@ -7,7 +7,7 @@ To use this patch, run these commands for a successful build:
     ./configure                         (optional if already run)
     make
 
-based-on: 55b2a06812e39f15f52e92b979600cb82be210cb
+based-on: f9e29dfb0912f2689ad10a7ba14ebb3ed43cf153
 diff --git a/compat.c b/compat.c
 --- a/compat.c
 +++ b/compat.c
@@ -27,8 +27,8 @@ diff --git a/compat.c b/compat.c
  extern int xfer_flags_as_varint;
  extern int need_messages_from_generator;
  extern int delete_mode, delete_before, delete_during, delete_after;
-@@ -80,7 +82,7 @@ int do_negotiated_strings = 0;
- int xmit_id0_names = 0;
+@@ -86,7 +88,7 @@ struct name_num_item *xattr_sum_nni;
+ int xattr_sum_len = 0;
  
  /* These index values are for the file-list's extra-attribute array. */
 -int pathname_ndx, depth_ndx, atimes_ndx, crtimes_ndx, uid_ndx, gid_ndx, acls_ndx, xattrs_ndx, unsort_ndx;
@@ -36,7 +36,7 @@ diff --git a/compat.c b/compat.c
  
  int receiver_symlink_times = 0; /* receiver can set the time on a symlink */
  int sender_symlink_iconv = 0; /* sender should convert symlink content */
-@@ -574,6 +576,8 @@ void setup_protocol(int f_out,int f_in)
+@@ -588,6 +590,8 @@ void setup_protocol(int f_out,int f_in)
                uid_ndx = ++file_extra_cnt;
        if (preserve_gid)
                gid_ndx = ++file_extra_cnt;
@@ -45,7 +45,7 @@ diff --git a/compat.c b/compat.c
        if (preserve_acls && !am_sender)
                acls_ndx = ++file_extra_cnt;
        if (preserve_xattrs)
-@@ -737,6 +741,10 @@ void setup_protocol(int f_out,int f_in)
+@@ -751,6 +755,10 @@ void setup_protocol(int f_out,int f_in)
                        fprintf(stderr, "Both rsync versions must be at least 3.2.0 for --crtimes.\n");
                        exit_cleanup(RERR_PROTOCOL);
                }
@@ -112,7 +112,7 @@ diff --git a/flist.c b/flist.c
  extern int delete_during;
  extern int missing_args;
  extern int eol_nulls;
-@@ -385,6 +386,9 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
+@@ -388,6 +389,9 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
        static time_t crtime;
  #endif
        static mode_t mode;
@@ -122,7 +122,7 @@ diff --git a/flist.c b/flist.c
  #ifdef SUPPORT_HARD_LINKS
        static int64 dev;
  #endif
-@@ -428,6 +432,14 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
+@@ -431,6 +435,14 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
                xflags |= XMIT_SAME_MODE;
        else
                mode = file->mode;
@@ -137,7 +137,7 @@ diff --git a/flist.c b/flist.c
  
        if (preserve_devices && IS_DEVICE(mode)) {
                if (protocol_version < 28) {
-@@ -589,6 +601,10 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
+@@ -592,6 +604,10 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
  #endif
        if (!(xflags & XMIT_SAME_MODE))
                write_int(f, to_wire_mode(mode));
@@ -148,7 +148,7 @@ diff --git a/flist.c b/flist.c
        if (atimes_ndx && !S_ISDIR(mode) && !(xflags & XMIT_SAME_ATIME))
                write_varlong(f, atime, 4);
        if (preserve_uid && !(xflags & XMIT_SAME_UID)) {
-@@ -683,6 +699,9 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
+@@ -686,6 +702,9 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
        static time_t crtime;
  #endif
        static mode_t mode;
@@ -158,7 +158,7 @@ diff --git a/flist.c b/flist.c
  #ifdef SUPPORT_HARD_LINKS
        static int64 dev;
  #endif
-@@ -799,6 +818,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
+@@ -803,6 +822,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
  #ifdef SUPPORT_CRTIMES
                        if (crtimes_ndx)
                                crtime = F_CRTIME(first);
@@ -169,7 +169,7 @@ diff --git a/flist.c b/flist.c
  #endif
                        if (preserve_uid)
                                uid = F_OWNER(first);
-@@ -871,6 +894,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
+@@ -876,6 +899,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
  
        if (chmod_modes && !S_ISLNK(mode) && mode)
                mode = tweak_mode(mode, chmod_modes);
@@ -180,7 +180,7 @@ diff --git a/flist.c b/flist.c
  
        if (preserve_uid && !(xflags & XMIT_SAME_UID)) {
                if (protocol_version < 30)
-@@ -1029,6 +1056,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
+@@ -1057,6 +1084,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
        }
  #endif
        file->mode = mode;
@@ -191,7 +191,7 @@ diff --git a/flist.c b/flist.c
        if (preserve_uid)
                F_OWNER(file) = uid;
        if (preserve_gid) {
-@@ -1430,6 +1461,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1470,6 +1501,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
        }
  #endif
        file->mode = st.st_mode;
@@ -205,7 +205,7 @@ diff --git a/flist.c b/flist.c
 diff --git a/generator.c b/generator.c
 --- a/generator.c
 +++ b/generator.c
-@@ -43,10 +43,12 @@ extern int write_devices;
+@@ -43,10 +43,12 @@ extern int preserve_devices;
  extern int preserve_specials;
  extern int preserve_hard_links;
  extern int preserve_executability;
@@ -241,7 +241,7 @@ diff --git a/generator.c b/generator.c
  #ifdef SUPPORT_ACLS
                if (preserve_acls && !S_ISLNK(file->mode)) {
                        if (!ACL_READY(*sxp))
-@@ -1451,6 +1462,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1454,6 +1465,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                if (!preserve_perms) { /* See comment in non-dir code below. */
                        file->mode = dest_mode(file->mode, sx.st.st_mode, dflt_perms, statret == 0);
                }
@@ -252,7 +252,7 @@ diff --git a/generator.c b/generator.c
                if (statret != 0 && basis_dir[0] != NULL) {
                        int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &sx, itemizing, code);
                        if (j == -2) {
-@@ -1493,10 +1508,15 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1496,10 +1511,15 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                 * readable and writable permissions during the time we are
                 * putting files within them.  This is then restored to the
                 * former permissions after the transfer is done. */
@@ -269,7 +269,7 @@ diff --git a/generator.c b/generator.c
                                rsyserr(FERROR_XFER, errno,
                                        "failed to modify permissions on %s",
                                        full_fname(fname));
-@@ -1531,6 +1551,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1534,6 +1554,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                int exists = statret == 0 && stype != FT_DIR;
                file->mode = dest_mode(file->mode, sx.st.st_mode, dflt_perms, exists);
        }
@@ -280,7 +280,7 @@ diff --git a/generator.c b/generator.c
  
  #ifdef SUPPORT_HARD_LINKS
        if (preserve_hard_links && F_HLINK_NOT_FIRST(file)
-@@ -2102,17 +2126,25 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
+@@ -2107,17 +2131,25 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
                        continue;
                fname = f_name(file, NULL);
                if (fix_dir_perms)
@@ -367,7 +367,7 @@ diff --git a/main.c b/main.c
 diff --git a/options.c b/options.c
 --- a/options.c
 +++ b/options.c
-@@ -53,6 +53,7 @@ int preserve_hard_links = 0;
+@@ -56,6 +56,7 @@ int preserve_hard_links = 0;
  int preserve_acls = 0;
  int preserve_xattrs = 0;
  int preserve_perms = 0;
@@ -375,7 +375,7 @@ diff --git a/options.c b/options.c
  int preserve_executability = 0;
  int preserve_devices = 0;
  int preserve_specials = 0;
-@@ -94,6 +95,7 @@ int msgs2stderr = 2; /* Default: send errors to stderr for local & remote-shell
+@@ -98,6 +99,7 @@ int msgs2stderr = 2; /* Default: send errors to stderr for local & remote-shell
  int saw_stderr_opt = 0;
  int allow_8bit_chars = 0;
  int force_delete = 0;
@@ -383,7 +383,7 @@ diff --git a/options.c b/options.c
  int io_timeout = 0;
  int prune_empty_dirs = 0;
  int use_qsort = 0;
-@@ -618,6 +620,8 @@ static struct poptOption long_options[] = {
+@@ -622,6 +624,8 @@ static struct poptOption long_options[] = {
    {"perms",           'p', POPT_ARG_VAL,    &preserve_perms, 1, 0, 0 },
    {"no-perms",         0,  POPT_ARG_VAL,    &preserve_perms, 0, 0, 0 },
    {"no-p",             0,  POPT_ARG_VAL,    &preserve_perms, 0, 0, 0 },
@@ -392,7 +392,7 @@ diff --git a/options.c b/options.c
    {"executability",   'E', POPT_ARG_NONE,   &preserve_executability, 0, 0, 0 },
    {"acls",            'A', POPT_ARG_NONE,   0, 'A', 0, 0 },
    {"no-acls",          0,  POPT_ARG_VAL,    &preserve_acls, 0, 0, 0 },
-@@ -715,6 +719,12 @@ static struct poptOption long_options[] = {
+@@ -720,6 +724,12 @@ static struct poptOption long_options[] = {
    {"remove-source-files",0,POPT_ARG_VAL,    &remove_source_files, 1, 0, 0 },
    {"force",            0,  POPT_ARG_VAL,    &force_delete, 1, 0, 0 },
    {"no-force",         0,  POPT_ARG_VAL,    &force_delete, 0, 0, 0 },
@@ -405,7 +405,7 @@ diff --git a/options.c b/options.c
    {"ignore-errors",    0,  POPT_ARG_VAL,    &ignore_errors, 1, 0, 0 },
    {"no-ignore-errors", 0,  POPT_ARG_VAL,    &ignore_errors, 0, 0, 0 },
    {"max-delete",       0,  POPT_ARG_INT,    &max_delete, 0, 0, 0 },
-@@ -1005,6 +1015,14 @@ static void set_refuse_options(void)
+@@ -1015,6 +1025,14 @@ static void set_refuse_options(void)
  #ifndef SUPPORT_CRTIMES
        parse_one_refuse_match(0, "crtimes", list_end);
  #endif
@@ -420,7 +420,7 @@ diff --git a/options.c b/options.c
  
        /* Now we use the descrip values to actually mark the options for refusal. */
        for (op = long_options; op != list_end; op++) {
-@@ -2685,6 +2703,9 @@ void server_options(char **args, int *argc_p)
+@@ -2712,6 +2730,9 @@ void server_options(char **args, int *argc_p)
        if (xfer_dirs && !recurse && delete_mode && am_sender)
                args[ac++] = "--no-r";
  
@@ -430,7 +430,7 @@ diff --git a/options.c b/options.c
        if (do_compression && do_compression_level != CLVL_NOT_SPECIFIED) {
                if (asprintf(&arg, "--compress-level=%d", do_compression_level) < 0)
                        goto oom;
-@@ -2780,6 +2801,16 @@ void server_options(char **args, int *argc_p)
+@@ -2807,6 +2828,16 @@ void server_options(char **args, int *argc_p)
                        args[ac++] = "--delete-excluded";
                if (force_delete)
                        args[ac++] = "--force";
@@ -450,7 +450,7 @@ diff --git a/options.c b/options.c
 diff --git a/rsync.1.md b/rsync.1.md
 --- a/rsync.1.md
 +++ b/rsync.1.md
-@@ -366,6 +366,7 @@ has its own detailed description later in this man page.
+@@ -410,6 +410,7 @@ has its own detailed description later in this manpage.
  --keep-dirlinks, -K      treat symlinked dir on receiver as dir
  --hard-links, -H         preserve hard links
  --perms, -p              preserve permissions
@@ -458,7 +458,7 @@ diff --git a/rsync.1.md b/rsync.1.md
  --executability, -E      preserve executability
  --chmod=CHMOD            affect file and/or directory permissions
  --acls, -A               preserve ACLs (implies --perms)
-@@ -406,7 +407,10 @@ has its own detailed description later in this man page.
+@@ -451,7 +452,10 @@ has its own detailed description later in this manpage.
  --ignore-missing-args    ignore missing source args without error
  --delete-missing-args    delete missing source args from destination
  --ignore-errors          delete even if there are I/O errors
@@ -470,7 +470,7 @@ diff --git a/rsync.1.md b/rsync.1.md
  --max-delete=NUM         don't delete more than NUM files
  --max-size=SIZE          don't transfer any file larger than SIZE
  --min-size=SIZE          don't transfer any file smaller than SIZE
-@@ -738,6 +742,7 @@ your home directory (remove the '=' for that).
+@@ -795,6 +799,7 @@ expand it.
      recursion and want to preserve almost everything.  Be aware that it does
      **not** include preserving ACLs (`-A`), xattrs (`-X`), atimes (`-U`),
      crtimes (`-N`), nor the finding and preserving of hardlinks (`-H`).
@@ -478,7 +478,7 @@ diff --git a/rsync.1.md b/rsync.1.md
  
      The only exception to the above equivalence is when [`--files-from`](#opt)
      is specified, in which case [`-r`](#opt) is not implied.
-@@ -1198,7 +1203,7 @@ your home directory (remove the '=' for that).
+@@ -1254,7 +1259,7 @@ expand it.
      Without this option, if the sending side has replaced a directory with a
      symlink to a directory, the receiving side will delete anything that is in
      the way of the new symlink, including a directory hierarchy (as long as
@@ -487,7 +487,7 @@ diff --git a/rsync.1.md b/rsync.1.md
  
      See also [`--keep-dirlinks`](#opt) for an analogous option for the
      receiving side.
-@@ -1393,6 +1398,37 @@ your home directory (remove the '=' for that).
+@@ -1449,6 +1454,37 @@ expand it.
      those used by [`--fake-super`](#opt)) unless you repeat the option (e.g. `-XX`).
      This "copy all xattrs" mode cannot be used with [`--fake-super`](#opt).
  
@@ -525,7 +525,7 @@ diff --git a/rsync.1.md b/rsync.1.md
  0.  `--chmod=CHMOD`
  
      This option tells rsync to apply one or more comma-separated "chmod" modes
-@@ -1888,8 +1924,8 @@ your home directory (remove the '=' for that).
+@@ -1969,8 +2005,8 @@ expand it.
      [`--ignore-missing-args`](#opt) option a step farther: each missing arg
      will become a deletion request of the corresponding destination file on the
      receiving side (should it exist).  If the destination file is a non-empty
@@ -536,7 +536,7 @@ diff --git a/rsync.1.md b/rsync.1.md
      independent of any other type of delete processing.
  
      The missing source files are represented by special file-list entries which
-@@ -1900,14 +1936,14 @@ your home directory (remove the '=' for that).
+@@ -1981,14 +2017,14 @@ expand it.
      Tells [`--delete`](#opt) to go ahead and delete files even when there are
      I/O errors.
  
@@ -554,7 +554,7 @@ diff --git a/rsync.1.md b/rsync.1.md
      [`--recursive`](#opt) option was also enabled.
  
  0.  `--max-delete=NUM`
-@@ -2904,7 +2940,7 @@ your home directory (remove the '=' for that).
+@@ -3046,7 +3082,7 @@ expand it.
      also turns on the output of other verbose messages).
  
      The "%i" escape has a cryptic output that is 11 letters long.  The general
@@ -701,7 +701,7 @@ diff --git a/rsync.h b/rsync.h
  #define ITEM_REPORT_CRTIME (1<<10)
  #define ITEM_BASIS_TYPE_FOLLOWS (1<<11)
  #define ITEM_XNAME_FOLLOWS (1<<12)
-@@ -590,6 +592,31 @@ typedef unsigned int size_t;
+@@ -593,6 +595,31 @@ typedef unsigned int size_t;
  #define SUPPORT_CRTIMES 1
  #endif
  
@@ -733,15 +733,15 @@ diff --git a/rsync.h b/rsync.h
  /* Find a variable that is either exactly 32-bits or longer.
   * If some code depends on 32-bit truncation, it will need to
   * take special action in a "#if SIZEOF_INT32 > 4" section. */
-@@ -821,6 +848,7 @@ extern int pathname_ndx;
+@@ -824,6 +851,7 @@ extern int pathname_ndx;
  extern int depth_ndx;
  extern int uid_ndx;
  extern int gid_ndx;
 +extern int fileflags_ndx;
  extern int acls_ndx;
  extern int xattrs_ndx;
-@@ -875,6 +903,11 @@ extern int xattrs_ndx;
+ extern int file_sum_extra_cnt;
+@@ -879,6 +907,11 @@ extern int file_sum_extra_cnt;
  /* When the associated option is on, all entries will have these present: */
  #define F_OWNER(f) REQ_EXTRA(f, uid_ndx)->unum
  #define F_GROUP(f) REQ_EXTRA(f, gid_ndx)->unum
@@ -952,10 +952,10 @@ diff --git a/t_stub.c b/t_stub.c
  int module_dirlen = 0;
 +int force_change = 0;
 +int preserve_acls = 0;
- int preserve_mtimes = 0;
  int preserve_xattrs = 0;
  int preserve_perms = 0;
-@@ -112,3 +114,23 @@ filter_rule_list daemon_filter_list;
+ int preserve_executability = 0;
+@@ -111,3 +113,23 @@ filter_rule_list daemon_filter_list;
  {
        return cst ? 0 : 0;
  }
@@ -998,7 +998,7 @@ diff --git a/testsuite/rsync.fns b/testsuite/rsync.fns
 diff --git a/usage.c b/usage.c
 --- a/usage.c
 +++ b/usage.c
-@@ -137,6 +137,11 @@ static void print_info_flags(enum logcode f)
+@@ -138,6 +138,11 @@ static void print_info_flags(enum logcode f)
  #endif
                        "crtimes",
  
@@ -1013,7 +1013,7 @@ diff --git a/usage.c b/usage.c
 diff --git a/util1.c b/util1.c
 --- a/util1.c
 +++ b/util1.c
-@@ -35,6 +35,7 @@ extern int preserve_mtimes;
+@@ -34,6 +34,7 @@ extern int relative_paths;
  extern int preserve_xattrs;
  extern int omit_link_times;
  extern int preallocate_files;
@@ -1021,7 +1021,7 @@ diff --git a/util1.c b/util1.c
  extern char *module_dir;
  extern unsigned int module_dirlen;
  extern char *partial_dir;
-@@ -117,6 +118,33 @@ void print_child_argv(const char *prefix, char **cmd)
+@@ -116,6 +117,33 @@ void print_child_argv(const char *prefix, char **cmd)
        rprintf(FCLIENT, " (%d args)\n", cnt);
  }
  
@@ -1055,7 +1055,7 @@ diff --git a/util1.c b/util1.c
  /* This returns 0 for success, 1 for a symlink if symlink time-setting
   * is not possible, or -1 for any other error. */
  int set_times(const char *fname, STRUCT_STAT *stp)
-@@ -144,6 +172,10 @@ int set_times(const char *fname, STRUCT_STAT *stp)
+@@ -143,6 +171,10 @@ int set_times(const char *fname, STRUCT_STAT *stp)
  #include "case_N.h"
                if (do_utimensat(fname, stp) == 0)
                        break;
@@ -1066,7 +1066,7 @@ diff --git a/util1.c b/util1.c
                if (errno != ENOSYS)
                        return -1;
                switch_step++;
-@@ -153,6 +185,10 @@ int set_times(const char *fname, STRUCT_STAT *stp)
+@@ -152,6 +184,10 @@ int set_times(const char *fname, STRUCT_STAT *stp)
  #include "case_N.h"
                if (do_lutimes(fname, stp) == 0)
                        break;
@@ -1077,7 +1077,7 @@ diff --git a/util1.c b/util1.c
                if (errno != ENOSYS)
                        return -1;
                switch_step++;
-@@ -174,6 +210,10 @@ int set_times(const char *fname, STRUCT_STAT *stp)
+@@ -173,6 +209,10 @@ int set_times(const char *fname, STRUCT_STAT *stp)
                if (do_utime(fname, stp) == 0)
                        break;
  #endif
@@ -1091,7 +1091,7 @@ diff --git a/util1.c b/util1.c
 diff --git a/xattrs.c b/xattrs.c
 --- a/xattrs.c
 +++ b/xattrs.c
-@@ -1091,7 +1091,7 @@ int set_xattr(const char *fname, const struct file_struct *file, const char *fna
+@@ -1086,7 +1086,7 @@ int set_xattr(const char *fname, const struct file_struct *file, const char *fna
         && !S_ISLNK(sxp->st.st_mode)
  #endif
         && access(fname, W_OK) < 0
@@ -1100,7 +1100,7 @@ diff --git a/xattrs.c b/xattrs.c
                added_write_perm = 1;
  
        ndx = F_XATTR(file);
-@@ -1099,7 +1099,7 @@ int set_xattr(const char *fname, const struct file_struct *file, const char *fna
+@@ -1094,7 +1094,7 @@ int set_xattr(const char *fname, const struct file_struct *file, const char *fna
        lst = &glst->xa_items;
        int return_value = rsync_xal_set(fname, lst, fnamecmp, sxp);
        if (added_write_perm) /* remove the temporary write permission */
@@ -1109,7 +1109,7 @@ diff --git a/xattrs.c b/xattrs.c
        return return_value;
  }
  
-@@ -1216,7 +1216,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
+@@ -1211,7 +1211,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
        mode = (fst.st_mode & _S_IFMT) | (fmode & ACCESSPERMS)
             | (S_ISDIR(fst.st_mode) ? 0700 : 0600);
        if (fst.st_mode != mode)