Fixed failing hunks.
[rsync/rsync-patches.git] / xattrs.diff
index 9334471..39239b0 100644 (file)
@@ -36,68 +36,25 @@ TODO:
 +      lib/permstring.o lib/pool_alloc.o lib/sysacls.o lib/sysxattr.o @LIBOBJS@
  ZLIBOBJ=zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o \
        zlib/trees.o zlib/zutil.o zlib/adler32.o zlib/compress.o zlib/crc32.o
- OBJS1=rsync.o generator.o receiver.o cleanup.o sender.o exclude.o util.o \
-       main.o checksum.o match.o syscall.o log.o backup.o
- OBJS2=options.o flist.o io.o compat.o hlink.o token.o uidlist.o socket.o \
+ OBJS1=flist.o rsync.o generator.o receiver.o cleanup.o sender.o exclude.o \
+       util.o main.o checksum.o match.o syscall.o log.o backup.o
+ OBJS2=options.o io.o compat.o hlink.o token.o uidlist.o socket.o \
 -      fileio.o batch.o clientname.o chmod.o acls.o
 +      fileio.o batch.o clientname.o chmod.o acls.o xattr.o
  OBJS3=progress.o pipe.o
  DAEMON_OBJ = params.o loadparm.o clientserver.o access.o connection.o authenticate.o
  popt_OBJS=popt/findme.o  popt/popt.o  popt/poptconfig.o \
---- old/acls.c
-+++ new/acls.c
-@@ -30,6 +30,7 @@ extern int read_only;
- extern int list_only;
- extern int orig_umask;
- extern int preserve_acls;
-+extern int preserve_xattrs;
- extern unsigned int file_struct_len;
- /* === ACL structures === */
-@@ -741,6 +742,10 @@ void receive_acl(struct file_struct *fil
-       type = SMB_ACL_TYPE_ACCESS;
-       racl_list = &access_acl_list;
-       ndx_ptr = (char*)file + file_struct_len;
-+#ifdef SUPPORT_XATTRS
-+      if (preserve_xattrs)
-+              ndx_ptr += 4;
-+#endif
-       do {
-               char tag = read_byte(f);
-               int ndx;
-@@ -800,6 +805,10 @@ void cache_acl(struct file_struct *file,
-       racl = sxp->acc_acl;
-       racl_list = &access_acl_list;
-       ndx_ptr = (char*)file + file_struct_len;
-+#ifdef SUPPORT_XATTRS
-+      if (preserve_xattrs)
-+              ndx_ptr += 4;
-+#endif
-       do {
-               if (!racl)
-                       ndx = -1;
-@@ -920,6 +929,10 @@ int set_acl(const char *fname, const str
-       type = SMB_ACL_TYPE_ACCESS;
-       ndx_ptr = (char*)file + file_struct_len;
-+#ifdef SUPPORT_XATTRS
-+      if (preserve_xattrs)
-+              ndx_ptr += 4;
-+#endif
-       do {
-               acl_duo *duo_item;
-               BOOL eq;
 --- old/backup.c
 +++ new/backup.c
-@@ -30,6 +30,7 @@ extern char *backup_dir;
+@@ -24,6 +24,7 @@
+ extern int verbose;
  extern int am_root;
  extern int preserve_acls;
 +extern int preserve_xattrs;
  extern int preserve_devices;
  extern int preserve_specials;
  extern int preserve_links;
-@@ -136,6 +137,9 @@ static int make_bak_dir(char *fullpath)
+@@ -135,6 +136,9 @@ static int make_bak_dir(char *fullpath)
  #ifdef SUPPORT_ACLS
                                sx.acc_acl = sx.def_acl = NULL;
  #endif
@@ -107,7 +64,7 @@ TODO:
                                if (!(file = make_file(rel, NULL, NULL, 0, NO_FILTERS)))
                                        continue;
  #ifdef SUPPORT_ACLS
-@@ -144,6 +148,12 @@ static int make_bak_dir(char *fullpath)
+@@ -143,6 +147,12 @@ static int make_bak_dir(char *fullpath)
                                        cache_acl(file, &sx);
                                }
  #endif
@@ -120,7 +77,7 @@ TODO:
                                set_file_attrs(fullpath, file, NULL, 0);
                                free(file);
                        }
-@@ -195,6 +205,9 @@ static int keep_backup(char *fname)
+@@ -194,6 +204,9 @@ static int keep_backup(const char *fname
  #ifdef SUPPORT_ACLS
        sx.acc_acl = sx.def_acl = NULL;
  #endif
@@ -130,7 +87,7 @@ TODO:
  
        if (!(file = make_file(fname, NULL, NULL, 0, NO_FILTERS)))
                return 1; /* the file could have disappeared */
-@@ -208,6 +221,12 @@ static int keep_backup(char *fname)
+@@ -209,6 +222,12 @@ static int keep_backup(const char *fname
                cache_acl(file, &sx);
        }
  #endif
@@ -143,9 +100,20 @@ TODO:
  
        /* Check to see if this is a device file, or link */
        if ((am_root && preserve_devices && IS_DEVICE(file->mode))
+--- old/compat.c
++++ new/compat.c
+@@ -50,6 +50,8 @@ void setup_protocol(int f_out,int f_in)
+               preserve_gid = ++flist_extra_cnt;
+       if (preserve_acls && !am_sender)
+               preserve_acls = ++flist_extra_cnt;
++      if (preserve_xattrs && !am_sender)
++              preserve_xattrs = ++flist_extra_cnt;
+       if (remote_protocol == 0) {
+               if (!read_batch)
 --- old/configure.in
 +++ new/configure.in
-@@ -856,6 +856,40 @@ samba_cv_HAVE_ACL_GET_PERM_NP=yes,samba_
+@@ -878,6 +878,40 @@ samba_cv_HAVE_ACL_GET_PERM_NP=yes,samba_
    AC_MSG_RESULT(no)
  )
  
@@ -188,7 +156,7 @@ TODO:
  
 --- old/flist.c
 +++ new/flist.c
-@@ -41,6 +41,7 @@ extern int one_file_system;
+@@ -42,6 +42,7 @@ extern int one_file_system;
  extern int copy_dirlinks;
  extern int keep_dirlinks;
  extern int preserve_acls;
@@ -196,43 +164,7 @@ TODO:
  extern int preserve_links;
  extern int preserve_hard_links;
  extern int preserve_devices;
-@@ -498,7 +499,7 @@ static struct file_struct *receive_file_
-       char thisname[MAXPATHLEN];
-       unsigned int l1 = 0, l2 = 0;
-       int alloc_len, basename_len, dirname_len, linkname_len, sum_len;
--#ifdef SUPPORT_ACLS
-+#if defined SUPPORT_ACLS || defined SUPPORT_XATTRS
-       int xtra_len;
- #endif
-       OFF_T file_length;
-@@ -610,10 +611,16 @@ static struct file_struct *receive_file_
-               xtra_len = (S_ISDIR(mode) ? 2 : 1) * 4;
-       else
-               xtra_len = 0;
-+#elif defined SUPPORT_XATTRS
-+      xtra_len = 0;
-+#endif
-+#ifdef SUPPORT_XATTRS
-+      if (preserve_xattrs)
-+              xtra_len += 4;
- #endif
-       alloc_len = file_struct_len + dirname_len + basename_len
--#ifdef SUPPORT_ACLS
-+#if defined SUPPORT_ACLS || defined SUPPORT_XATTRS
-                 + xtra_len
- #endif
-                 + linkname_len + sum_len;
-@@ -622,7 +629,7 @@ static struct file_struct *receive_file_
-       file = (struct file_struct *)bp;
-       memset(bp, 0, file_struct_len);
-       bp += file_struct_len;
--#ifdef SUPPORT_ACLS
-+#if defined SUPPORT_ACLS || defined SUPPORT_XATTRS
-       bp += xtra_len;
- #endif
-@@ -723,6 +730,10 @@ static struct file_struct *receive_file_
+@@ -812,6 +813,10 @@ static struct file_struct *recv_file_ent
        if (preserve_acls)
                receive_acl(file, f);
  #endif
@@ -243,7 +175,7 @@ TODO:
  
        return file;
  }
-@@ -974,7 +985,7 @@ static struct file_struct *send_file_nam
+@@ -1082,7 +1087,7 @@ static struct file_struct *send_file_nam
                                          unsigned short flags)
  {
        struct file_struct *file;
@@ -252,12 +184,12 @@ TODO:
        statx sx;
  #endif
  
-@@ -994,6 +1005,13 @@ static struct file_struct *send_file_nam
+@@ -1102,6 +1107,13 @@ static struct file_struct *send_file_nam
                        return NULL;
        }
  #endif
 +#ifdef SUPPORT_XATTRS
-+      if (preserve_xattrs) {
++      if (preserve_xattrs && f >= 0) {
 +              sx.xattr = NULL;
 +              if (get_xattr(fname, &sx) < 0)
 +                      return NULL;
@@ -266,22 +198,13 @@ TODO:
  
        maybe_emit_filelist_progress(flist->count + flist_count_offset);
  
-@@ -1006,11 +1024,19 @@ static struct file_struct *send_file_nam
+@@ -1113,6 +1125,10 @@ static struct file_struct *send_file_nam
                if (preserve_acls)
                        send_acl(&sx, f);
  #endif
 +#ifdef SUPPORT_XATTRS
 +              if (preserve_xattrs)
 +                      send_xattr(&sx, f);
-+#endif
-       } else {
- #ifdef SUPPORT_ACLS
-               if (preserve_acls)
-                       free_acl(&sx);
- #endif
-+#ifdef SUPPORT_XATTRS
-+              if (preserve_xattrs)
-+                      free_xattr(&sx);
 +#endif
        }
        return file;
@@ -463,7 +386,7 @@ TODO:
  int preserve_perms = 0;
  int preserve_executability = 0;
  int preserve_devices = 0;
-@@ -201,6 +202,7 @@ static void print_rsync_version(enum log
+@@ -200,6 +201,7 @@ static void print_rsync_version(enum log
        char const *have_inplace = "no ";
        char const *hardlinks = "no ";
        char const *acls = "no ";
@@ -471,7 +394,7 @@ TODO:
        char const *links = "no ";
        char const *ipv6 = "no ";
        STRUCT_STAT *dumstat;
-@@ -220,7 +222,9 @@ static void print_rsync_version(enum log
+@@ -219,7 +221,9 @@ static void print_rsync_version(enum log
  #ifdef SUPPORT_ACLS
        acls = "";
  #endif
@@ -482,18 +405,18 @@ TODO:
  #ifdef SUPPORT_LINKS
        links = "";
  #endif
-@@ -236,8 +240,8 @@ static void print_rsync_version(enum log
-       rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, %shard links, %ssymlinks,\n",
-               (int) (sizeof (OFF_T) * 8), got_socketpair, hardlinks, links);
+@@ -238,8 +242,8 @@ static void print_rsync_version(enum log
+               (int)(sizeof (int64) * 8));
+       rprintf(f, "    %ssocketpairs, %shardlinks, %ssymlinks, %sIPv6, batchfiles, %sinplace,\n",
+               got_socketpair, hardlinks, links, ipv6, have_inplace);
+-      rprintf(f, "    %sappend, %sACLs\n",
+-              have_inplace, acls);
++      rprintf(f, "    %sappend, %sACLs, %sxattrs\n",
++              have_inplace, acls, xattrs);
  
--      rprintf(f, "              batchfiles, %sinplace, %sIPv6, %sACLs,\n",
--              have_inplace, ipv6, acls);
-+      rprintf(f, "              batchfiles, %sinplace, %sIPv6, %sACLs, %sxattrs,\n",
-+              have_inplace, ipv6, acls, xattrs);
-       /* Note that this field may not have type ino_t.  It depends
-        * on the complicated interaction between largefile feature
-@@ -289,7 +293,7 @@ void usage(enum logcode F)
+ #ifdef MAINTAINER_MODE
+       rprintf(f, "Panic Action: \"%s\"\n", get_panic_action());
+@@ -285,7 +289,7 @@ void usage(enum logcode F)
    rprintf(F," -q, --quiet                 suppress non-error messages\n");
    rprintf(F,"     --no-motd               suppress daemon-mode MOTD (see manpage caveat)\n");
    rprintf(F," -c, --checksum              skip based on checksum, not mod-time & size\n");
@@ -502,7 +425,7 @@ TODO:
    rprintf(F,"     --no-OPTION             turn off an implied OPTION (e.g. --no-D)\n");
    rprintf(F," -r, --recursive             recurse into directories\n");
    rprintf(F," -R, --relative              use relative path names\n");
-@@ -314,6 +318,9 @@ void usage(enum logcode F)
+@@ -310,6 +314,9 @@ void usage(enum logcode F)
  #ifdef SUPPORT_ACLS
    rprintf(F," -A, --acls                  preserve ACLs (implies --perms)\n");
  #endif
@@ -512,7 +435,7 @@ TODO:
    rprintf(F," -o, --owner                 preserve owner (super-user only)\n");
    rprintf(F," -g, --group                 preserve group\n");
    rprintf(F,"     --devices               preserve device files (super-user only)\n");
-@@ -436,6 +443,9 @@ static struct poptOption long_options[] 
+@@ -433,6 +440,9 @@ static struct poptOption long_options[] 
    {"acls",            'A', POPT_ARG_NONE,   0, 'A', 0, 0 },
    {"no-acls",          0,  POPT_ARG_VAL,    &preserve_acls, 0, 0, 0 },
    {"no-A",             0,  POPT_ARG_VAL,    &preserve_acls, 0, 0, 0 },
@@ -522,7 +445,7 @@ TODO:
    {"times",           't', POPT_ARG_VAL,    &preserve_times, 1, 0, 0 },
    {"no-times",         0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
    {"no-t",             0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
-@@ -1117,6 +1127,17 @@ int parse_arguments(int *argc, const cha
+@@ -1115,6 +1125,17 @@ int parse_arguments(int *argc, const cha
                        return 0;
  #endif
  
@@ -540,7 +463,7 @@ TODO:
  
                default:
                        /* A large opt value means that set_refuse_options()
-@@ -1563,6 +1584,10 @@ void server_options(char **args,int *arg
+@@ -1562,6 +1583,10 @@ void server_options(char **args,int *arg
        if (preserve_acls)
                argstr[x++] = 'A';
  #endif
@@ -561,7 +484,7 @@ TODO:
  extern int preserve_perms;
  extern int preserve_executability;
  extern int preserve_times;
-@@ -218,6 +219,10 @@ int set_file_attrs(char *fname, struct f
+@@ -271,6 +272,10 @@ int set_file_attrs(char *fname, struct f
        if (daemon_chmod_modes && !S_ISLNK(new_mode))
                new_mode = tweak_mode(new_mode, daemon_chmod_modes);
  
@@ -574,7 +497,7 @@ TODO:
         * will enable owner-writability using chmod, if necessary.
 --- old/rsync.h
 +++ new/rsync.h
-@@ -500,6 +500,10 @@ struct idev {
+@@ -511,6 +511,10 @@ struct idev_node {
  #define ACLS_NEED_MASK 1
  #endif
  
@@ -584,8 +507,16 @@ TODO:
 +
  #define GID_NONE ((gid_t)-1)
  
- #define HL_CHECK_MASTER       0
-@@ -694,6 +698,9 @@ typedef struct {
+ union file_extras {
+@@ -563,6 +567,7 @@ extern int preserve_gid;
+ #define F_UID(f) REQ_EXTRA(f, preserve_uid)->unum
+ #define F_GID(f) REQ_EXTRA(f, preserve_gid)->unum
+ #define F_ACL(f) REQ_EXTRA(f, preserve_acls)->unum
++#define F_XATTR(f) REQ_EXTRA(f, preserve_xattrs)->unum
+ /* These items are per-entry optional and mutally exclusive: */
+ #define F_HL_GNUM(f) OPT_EXTRA(f, LEN64_BUMP(f))->num
+@@ -738,6 +743,9 @@ typedef struct {
      struct rsync_acl *acc_acl; /* access ACL */
      struct rsync_acl *def_acl; /* default ACL */
  #endif
@@ -614,9 +545,9 @@ TODO:
   -o, --owner                 preserve owner (super-user only)
   -g, --group                 preserve group
       --devices               preserve device files (super-user only)
-@@ -818,6 +819,11 @@ version makes it incompatible with sendi
- rsync unless you double the bf(--acls) option (e.g. bf(-AA)).  This
doubling is not needed when pulling files from an older rsync.
+@@ -818,6 +819,11 @@ The ACL-sending protocol used by this ve
+ the patch that was shipped with 2.6.8.  Sending ACLs to an older version
of the ACL patch is not supported.
  
 +dit(bf(-X, --xattrs)) This option causes rsync to update the remote
 +extended attributes to be the same as the local ones.  This will work
@@ -660,6 +591,7 @@ TODO:
 +extern int am_root;
 +extern int read_only;
 +extern int list_only;
++extern int preserve_xattrs;
 +extern unsigned int file_struct_len;
 +
 +#define RSYNC_XAL_INITIAL 5
@@ -919,7 +851,6 @@ TODO:
 +void receive_xattr(struct file_struct *file, int f)
 +{
 +      static item_list temp_xattr = EMPTY_ITEM_LIST;
-+      char *ndx_ptr = (char*)file + file_struct_len;
 +      int ndx, tag = read_byte(f);
 +
 +      if (tag == 'X') {
@@ -929,8 +860,10 @@ TODO:
 +                      rsync_xa *rxa;
 +                      size_t name_len = read_int(f);
 +                      size_t datum_len = read_int(f);
-+                      size_t extra_len = am_root < 0 ? RPRE_LEN : 0;
-+#ifndef HAVE_LINUX_XATTRS
++#ifdef HAVE_LINUX_XATTRS
++                      size_t extra_len = 0;
++#else
++                      size_t extra_len = am_root ? RPRE_LEN : 0;
 +                      if (datum_len + extra_len < datum_len)
 +                              out_of_memory("receive_xattr"); /* overflow */
 +#endif
@@ -985,14 +918,13 @@ TODO:
 +              exit_cleanup(RERR_STREAMIO);
 +      }
 +
-+      SIVAL(ndx_ptr, 0, ndx);
++      F_XATTR(file) = ndx;
 +}
 +
 +/* Turn the xattr data in statx into cached xattr data, setting the index
 + * values in the file struct. */
 +void cache_xattr(struct file_struct *file, statx *sxp)
 +{
-+      char *ndx_ptr = (char*)file + file_struct_len;
 +      int ndx;
 +
 +      if (!sxp->xattr)
@@ -1003,7 +935,7 @@ TODO:
 +              rsync_xal_store(sxp->xattr); /* adds item to rsync_xal_l */
 +      free_xattr(sxp);
 +
-+      SIVAL(ndx_ptr, 0, ndx);
++      F_XATTR(file) = ndx;
 +}
 +
 +static int rsync_xal_set(const char *fname, item_list *xalp)
@@ -1028,7 +960,6 @@ TODO:
 +int set_xattr(const char *fname, const struct file_struct *file, UNUSED(statx *sxp))
 +{
 +      int ndx;
-+      char *ndx_ptr = (char*)file + file_struct_len;
 +      item_list *lst = rsync_xal_l.items;
 +
 +      if (dry_run)
@@ -1039,7 +970,7 @@ TODO:
 +              return -1;
 +      }
 +
-+      ndx = IVAL(ndx_ptr, 0);
++      ndx = F_XATTR(file);
 +      return rsync_xal_set(fname, lst + ndx); /* TODO:  This needs to return 1 if no xattrs changed! */
 +}
 +