char *rel = fullpath + backup_dir_len;
char *end = rel + strlen(rel);
char *p = end;
-@@ -126,13 +128,24 @@ static int make_bak_dir(char *fullpath)
+@@ -126,15 +128,24 @@ static int make_bak_dir(char *fullpath)
if (p >= rel) {
/* Try to transfer the directory settings of the
* actual dir that the files are coming from. */
full_fname(rel));
} else {
- do_lchown(fullpath, st.st_uid, st.st_gid);
+-#ifdef HAVE_CHMOD
- do_chmod(fullpath, st.st_mode);
+#ifdef SUPPORT_ACLS
+ sx.acc_acl = sx.def_acl = NULL;
+ get_acl(rel, &sx);
+ cache_acl(file, &sx);
+ }
-+#endif
+ #endif
+ set_file_attrs(fullpath, file, NULL, 0);
+ free(file);
}
}
*p = '/';
-@@ -170,15 +183,18 @@ static int robust_move(char *src, char *
+@@ -172,15 +183,18 @@ static int robust_move(char *src, char *
* We will move the file to be deleted into a parallel directory tree. */
static int keep_backup(char *fname)
{
if (!(file = make_file(fname, NULL, NULL, 0, NO_FILTERS)))
return 1; /* the file could have disappeared */
-@@ -186,6 +202,13 @@ static int keep_backup(char *fname)
+@@ -188,6 +202,13 @@ static int keep_backup(char *fname)
if (!(buf = get_backup_name(fname)))
return 0;
/* Check to see if this is a device file, or link */
if ((am_root && preserve_devices && IS_DEVICE(file->mode))
|| (preserve_specials && IS_SPECIAL(file->mode))) {
-@@ -254,7 +277,7 @@ static int keep_backup(char *fname)
+@@ -256,7 +277,7 @@ static int keep_backup(char *fname)
if (robust_move(fname, buf) != 0) {
rsyserr(FERROR, errno, "keep_backup failed: %s -> \"%s\"",
full_fname(fname), buf);
robust_unlink(fname); /* Just in case... */
--- old/configure.in
+++ new/configure.in
-@@ -515,6 +515,11 @@ if test x"$ac_cv_func_strcasecmp" = x"no
+@@ -537,6 +537,11 @@ if test x"$ac_cv_func_strcasecmp" = x"no
AC_CHECK_LIB(resolv, strcasecmp)
fi
dnl At the moment we don't test for a broken memcmp(), because all we
dnl need to do is test for equality, not comparison, and it seems that
dnl every platform has a memcmp that can do at least that.
-@@ -779,6 +784,78 @@ AC_SUBST(OBJ_RESTORE)
+@@ -801,6 +806,78 @@ AC_SUBST(OBJ_RESTORE)
AC_SUBST(CC_SHOBJ_FLAG)
AC_SUBST(BUILD_POPT)
extern int preserve_links;
extern int preserve_hard_links;
extern int preserve_devices;
-@@ -133,6 +134,8 @@ static void list_file_entry(struct file_
+@@ -135,6 +136,8 @@ static void list_file_entry(struct file_
permstring(permbuf, f->mode);
#ifdef SUPPORT_LINKS
if (preserve_links && S_ISLNK(f->mode)) {
rprintf(FINFO, "%s %11.0f %s %s -> %s\n",
-@@ -495,6 +498,9 @@ static struct file_struct *receive_file_
+@@ -497,6 +500,9 @@ 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;
OFF_T file_length;
char *basename, *dirname, *bp;
struct file_struct *file;
-@@ -598,13 +604,27 @@ static struct file_struct *receive_file_
+@@ -600,13 +606,27 @@ static struct file_struct *receive_file_
sum_len = always_checksum && S_ISREG(mode) ? MD4_SUM_LENGTH : 0;
file->modtime = modtime;
file->length = file_length;
-@@ -699,6 +719,11 @@ static struct file_struct *receive_file_
+@@ -701,6 +721,11 @@ static struct file_struct *receive_file_
read_buf(f, sum, checksum_len);
}
return file;
}
-@@ -949,6 +974,9 @@ static struct file_struct *send_file_nam
+@@ -958,6 +983,9 @@ static struct file_struct *send_file_nam
unsigned short flags)
{
struct file_struct *file;
file = make_file(fname, flist, stp, flags,
f == -2 ? SERVER_FILTERS : ALL_FILTERS);
-@@ -958,6 +986,15 @@ static struct file_struct *send_file_nam
+@@ -967,6 +995,15 @@ static struct file_struct *send_file_nam
if (chmod_modes && !S_ISLNK(file->mode))
file->mode = tweak_mode(file->mode, chmod_modes);
+#ifdef SUPPORT_ACLS
-+ if (preserve_acls) {
++ if (preserve_acls && f >= 0) {
+ sx.st.st_mode = file->mode;
+ sx.acc_acl = sx.def_acl = NULL;
+ if (get_acl(fname, &sx) < 0)
maybe_emit_filelist_progress(flist->count + flist_count_offset);
flist_expand(flist);
-@@ -965,6 +1002,15 @@ static struct file_struct *send_file_nam
+@@ -974,6 +1011,15 @@ static struct file_struct *send_file_nam
if (file->basename[0]) {
flist->files[flist->count++] = file;
send_file_entry(file, f);
+#ifdef SUPPORT_ACLS
-+ if (preserve_acls)
++ if (preserve_acls && f >= 0)
+ send_acl(&sx, f);
+#endif
+ } else {
+#ifdef SUPPORT_ACLS
-+ if (preserve_acls)
++ if (preserve_acls && f >= 0)
+ free_acl(&sx);
+#endif
}
extern struct stats stats;
extern dev_t filesystem_dev;
extern char *backup_dir;
-@@ -320,22 +322,27 @@ static void do_delete_pass(struct file_l
+@@ -379,22 +381,27 @@ static void do_delete_pass(struct file_l
rprintf(FINFO, " \r");
}
-void itemize(struct file_struct *file, int ndx, int statret, STRUCT_STAT *st,
+void itemize(struct file_struct *file, int ndx, int statret, statx *sxp,
- int32 iflags, uchar fnamecmp_type, char *xname)
+ int32 iflags, uchar fnamecmp_type, const char *xname)
{
if (statret >= 0) { /* A from-dest-dir statret can == 1! */
-@@ -343,20 +350,24 @@ void itemize(struct file_struct *file, i
+@@ -402,20 +409,24 @@ void itemize(struct file_struct *file, i
: S_ISDIR(file->mode) ? !omit_dir_times
: !S_ISLNK(file->mode);
} else
iflags |= ITEM_IS_NEW;
-@@ -609,7 +620,7 @@ void check_for_finished_hlinks(int itemi
+@@ -668,7 +679,7 @@ void check_for_finished_hlinks(int itemi
* handling the file, -1 if no dest-linking occurred, or a non-negative
* value if we found an alternate basis file. */
static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
int maybe_ATTRS_REPORT, enum logcode code)
{
int best_match = -1;
-@@ -618,7 +629,7 @@ static int try_dests_reg(struct file_str
+@@ -677,7 +688,7 @@ static int try_dests_reg(struct file_str
do {
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
continue;
switch (match_level) {
case 0:
-@@ -626,16 +637,20 @@ static int try_dests_reg(struct file_str
+@@ -685,16 +696,20 @@ static int try_dests_reg(struct file_str
match_level = 1;
/* FALL THROUGH */
case 1:
continue;
best_match = j;
match_level = 3;
-@@ -650,7 +665,7 @@ static int try_dests_reg(struct file_str
+@@ -709,7 +724,7 @@ static int try_dests_reg(struct file_str
if (j != best_match) {
j = best_match;
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
return -1;
}
-@@ -658,7 +673,7 @@ static int try_dests_reg(struct file_str
+@@ -717,7 +732,7 @@ static int try_dests_reg(struct file_str
#ifdef SUPPORT_HARD_LINKS
if (link_dest) {
int i = itemizing && (verbose > 1 || stdout_format_has_i > 1);
cmpbuf, 1, i, code) < 0)
goto try_a_copy;
if (preserve_hard_links && file->link_u.links) {
-@@ -668,8 +683,13 @@ static int try_dests_reg(struct file_str
+@@ -727,8 +742,13 @@ static int try_dests_reg(struct file_str
}
} else
#endif
if (verbose > 1 && maybe_ATTRS_REPORT) {
rprintf(FCLIENT, "%s is uptodate\n", fname);
}
-@@ -685,8 +705,13 @@ static int try_dests_reg(struct file_str
+@@ -744,8 +764,13 @@ static int try_dests_reg(struct file_str
}
return -1;
}
set_file_attrs(fname, file, NULL, 0);
if (maybe_ATTRS_REPORT
&& ((!itemizing && verbose && match_level == 2)
-@@ -707,7 +732,7 @@ static int try_dests_reg(struct file_str
+@@ -766,7 +791,7 @@ static int try_dests_reg(struct file_str
* handling the file, or -1 if no dest-linking occurred, or a non-negative
* value if we found an alternate basis file. */
static int try_dests_non(struct file_struct *file, char *fname, int ndx,
int maybe_ATTRS_REPORT, enum logcode code)
{
char lnk[MAXPATHLEN];
-@@ -739,24 +764,24 @@ static int try_dests_non(struct file_str
+@@ -798,24 +823,24 @@ static int try_dests_non(struct file_str
do {
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
continue;
break;
#endif
-@@ -770,7 +795,7 @@ static int try_dests_non(struct file_str
+@@ -829,7 +854,7 @@ static int try_dests_non(struct file_str
break;
case TYPE_SPECIAL:
case TYPE_DEVICE:
continue;
break;
#ifdef SUPPORT_LINKS
-@@ -787,7 +812,11 @@ static int try_dests_non(struct file_str
+@@ -846,7 +871,11 @@ static int try_dests_non(struct file_str
match_level = 2;
best_match = j;
}
match_level = 3;
best_match = j;
break;
-@@ -800,7 +829,7 @@ static int try_dests_non(struct file_str
+@@ -859,7 +888,7 @@ static int try_dests_non(struct file_str
if (j != best_match) {
j = best_match;
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
return -1;
}
-@@ -831,7 +860,15 @@ static int try_dests_non(struct file_str
+@@ -890,7 +919,15 @@ static int try_dests_non(struct file_str
: ITEM_LOCAL_CHANGE
+ (match_level == 3 ? ITEM_XNAME_FOLLOWS : 0);
char *lp = match_level == 3 ? "" : NULL;
}
if (verbose > 1 && maybe_ATTRS_REPORT) {
rprintf(FCLIENT, "%s%s is uptodate\n",
-@@ -844,6 +881,7 @@ static int try_dests_non(struct file_str
+@@ -903,6 +940,7 @@ static int try_dests_non(struct file_str
}
static int phase = 0;
/* Acts on the_file_list->file's ndx'th item, whose name is fname. If a dir,
* make sure it exists, and has the right permissions/timestamp info. For
-@@ -865,7 +903,8 @@ static void recv_generator(char *fname,
+@@ -924,7 +962,8 @@ static void recv_generator(char *fname,
static int need_fuzzy_dirlist = 0;
struct file_struct *fuzzy_file = NULL;
int fd = -1, f_copy = -1;
struct file_struct *back_file = NULL;
int statret, real_ret, stat_errno;
char *fnamecmp, *partialptr, *backupptr = NULL;
-@@ -921,6 +960,9 @@ static void recv_generator(char *fname,
+@@ -980,6 +1019,9 @@ static void recv_generator(char *fname,
} else if (!dry_run)
return;
}
if (dry_run > 1) {
statret = -1;
stat_errno = ENOENT;
-@@ -928,7 +970,7 @@ static void recv_generator(char *fname,
- char *dn = file->dirname ? file->dirname : ".";
+@@ -987,7 +1029,7 @@ static void recv_generator(char *fname,
+ const char *dn = file->dirname ? file->dirname : ".";
if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
if (relative_paths && !implied_dirs
- && do_stat(dn, &st) < 0
&& create_directory_path(fname) < 0) {
rsyserr(FERROR, errno,
"recv_generator: mkdir %s failed",
-@@ -940,6 +982,10 @@ static void recv_generator(char *fname,
+@@ -999,6 +1041,10 @@ static void recv_generator(char *fname,
}
if (fuzzy_basis)
need_fuzzy_dirlist = 1;
}
parent_dirname = dn;
-@@ -948,7 +994,7 @@ static void recv_generator(char *fname,
+@@ -1008,7 +1054,7 @@ static void recv_generator(char *fname,
need_fuzzy_dirlist = 0;
}
keep_dirlinks && S_ISDIR(file->mode));
stat_errno = errno;
}
-@@ -966,8 +1012,9 @@ static void recv_generator(char *fname,
+@@ -1026,8 +1072,9 @@ static void recv_generator(char *fname,
* mode based on the local permissions and some heuristics. */
if (!preserve_perms) {
int exists = statret == 0
}
if (S_ISDIR(file->mode)) {
-@@ -976,8 +1023,8 @@ static void recv_generator(char *fname,
+@@ -1036,8 +1083,8 @@ static void recv_generator(char *fname,
* file of that name and it is *not* a directory, then
* we need to delete it. If it doesn't exist, then
* (perhaps recursively) create it. */
- if (statret == 0 && !S_ISDIR(st.st_mode)) {
-- if (delete_item(fname, st.st_mode, del_opts) < 0)
+- if (delete_item(fname, st.st_mode, "directory", del_opts) != 0)
+ if (statret == 0 && !S_ISDIR(sx.st.st_mode)) {
-+ if (delete_item(fname, sx.st.st_mode, del_opts) < 0)
++ if (delete_item(fname, sx.st.st_mode, "directory", del_opts) != 0)
return;
statret = -1;
}
-@@ -986,14 +1033,14 @@ static void recv_generator(char *fname,
+@@ -1046,14 +1093,14 @@ static void recv_generator(char *fname,
dry_run++;
}
real_ret = statret;
itemizing, maybe_ATTRS_REPORT, code);
if (j == -2) {
itemizing = 0;
-@@ -1002,7 +1049,11 @@ static void recv_generator(char *fname,
+@@ -1062,7 +1109,11 @@ static void recv_generator(char *fname,
statret = 1;
}
if (itemizing && f_out != -1) {
statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL);
}
if (real_ret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) {
-@@ -1022,21 +1073,21 @@ static void recv_generator(char *fname,
+@@ -1082,21 +1133,21 @@ static void recv_generator(char *fname,
return;
}
}
if (preserve_links && S_ISLNK(file->mode)) {
#ifdef SUPPORT_LINKS
-@@ -1054,15 +1105,15 @@ static void recv_generator(char *fname,
+@@ -1114,15 +1165,15 @@ static void recv_generator(char *fname,
char lnk[MAXPATHLEN];
int len;
if (preserve_hard_links && file->link_u.links)
hard_link_cluster(file, ndx, itemizing, code);
if (remove_source_files == 1)
-@@ -1071,10 +1122,10 @@ static void recv_generator(char *fname,
+@@ -1131,10 +1182,10 @@ static void recv_generator(char *fname,
}
/* Not the right symlink (or not a symlink), so
* delete it. */
-- if (delete_item(fname, st.st_mode, del_opts) < 0)
-+ if (delete_item(fname, sx.st.st_mode, del_opts) < 0)
+- if (delete_item(fname, st.st_mode, "symlink", del_opts) != 0)
++ if (delete_item(fname, sx.st.st_mode, "symlink", del_opts) != 0)
return;
} else if (basis_dir[0] != NULL) {
- int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
itemizing, maybe_ATTRS_REPORT, code);
if (j == -2) {
#ifndef CAN_HARDLINK_SYMLINK
-@@ -1090,7 +1141,7 @@ static void recv_generator(char *fname,
+@@ -1150,7 +1201,7 @@ static void recv_generator(char *fname,
statret = 1;
}
if (preserve_hard_links && file->link_u.links
itemizing, code, HL_SKIP))
return;
if (do_symlink(file->u.link, fname) != 0) {
-@@ -1099,7 +1150,7 @@ static void recv_generator(char *fname,
+@@ -1159,7 +1210,7 @@ static void recv_generator(char *fname,
} else {
set_file_attrs(fname, file, NULL, 0);
if (itemizing) {
ITEM_LOCAL_CHANGE, 0, NULL);
}
if (code != FNONE && verbose)
-@@ -1119,25 +1170,30 @@ static void recv_generator(char *fname,
- if ((am_root && preserve_devices && IS_DEVICE(file->mode))
- || (preserve_specials && IS_SPECIAL(file->mode))) {
+@@ -1181,31 +1232,36 @@ static void recv_generator(char *fname,
if (statret == 0) {
-- if ((IS_DEVICE(file->mode) && !IS_DEVICE(st.st_mode))
-- || (IS_SPECIAL(file->mode) && !IS_SPECIAL(st.st_mode)))
-+ if ((IS_DEVICE(file->mode) && !IS_DEVICE(sx.st.st_mode))
-+ || (IS_SPECIAL(file->mode) && !IS_SPECIAL(sx.st.st_mode)))
- statret = -1;
-- else if ((st.st_mode & ~CHMOD_BITS) == (file->mode & ~CHMOD_BITS)
-- && st.st_rdev == file->u.rdev) {
-+ else if ((sx.st.st_mode & ~CHMOD_BITS) == (file->mode & ~CHMOD_BITS)
-+ && sx.st.st_rdev == file->u.rdev) {
+ char *t;
+ if (IS_DEVICE(file->mode)) {
+- if (!IS_DEVICE(st.st_mode))
++ if (!IS_DEVICE(sx.st.st_mode))
+ statret = -1;
+ t = "device file";
+ } else {
+- if (!IS_SPECIAL(st.st_mode))
++ if (!IS_SPECIAL(sx.st.st_mode))
+ statret = -1;
+ t = "special file";
+ }
+ if (statret == 0
+- && (st.st_mode & ~CHMOD_BITS) == (file->mode & ~CHMOD_BITS)
+- && st.st_rdev == file->u.rdev) {
++ && (sx.st.st_mode & ~CHMOD_BITS) == (file->mode & ~CHMOD_BITS)
++ && sx.st.st_rdev == file->u.rdev) {
/* The device or special file is identical. */
- if (itemizing)
- itemize(file, ndx, 0, &st, 0, 0, NULL);
- return;
+ goto cleanup;
}
-- if (delete_item(fname, st.st_mode, del_opts) < 0)
-+ if (delete_item(fname, sx.st.st_mode, del_opts) < 0)
+- if (delete_item(fname, st.st_mode, t, del_opts) != 0)
++ if (delete_item(fname, sx.st.st_mode, t, del_opts) != 0)
return;
} else if (basis_dir[0] != NULL) {
- int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
itemizing, maybe_ATTRS_REPORT, code);
if (j == -2) {
#ifndef CAN_HARDLINK_SPECIAL
-@@ -1153,7 +1209,7 @@ static void recv_generator(char *fname,
+@@ -1221,7 +1277,7 @@ static void recv_generator(char *fname,
statret = 1;
}
if (preserve_hard_links && file->link_u.links
itemizing, code, HL_SKIP))
return;
if (verbose > 2) {
-@@ -1166,7 +1222,11 @@ static void recv_generator(char *fname,
+@@ -1234,7 +1290,11 @@ static void recv_generator(char *fname,
} else {
set_file_attrs(fname, file, NULL, 0);
if (itemizing) {
ITEM_LOCAL_CHANGE, 0, NULL);
}
if (code != FNONE && verbose)
-@@ -1176,7 +1236,7 @@ static void recv_generator(char *fname,
+@@ -1244,7 +1304,7 @@ static void recv_generator(char *fname,
if (remove_source_files == 1)
goto return_with_success;
}
}
if (!S_ISREG(file->mode)) {
-@@ -1210,7 +1270,7 @@ static void recv_generator(char *fname,
+@@ -1278,7 +1338,7 @@ static void recv_generator(char *fname,
}
if (update_only && statret == 0
if (verbose > 1)
rprintf(FINFO, "%s is newer\n", fname);
return;
-@@ -1219,20 +1279,20 @@ static void recv_generator(char *fname,
+@@ -1287,20 +1347,20 @@ static void recv_generator(char *fname,
fnamecmp = fname;
fnamecmp_type = FNAMECMP_FNAME;
- if (statret == 0 && !S_ISREG(st.st_mode)) {
-- if (delete_item(fname, st.st_mode, del_opts) != 0)
+- if (delete_item(fname, st.st_mode, "regular file", del_opts) != 0)
+ if (statret == 0 && !S_ISREG(sx.st.st_mode)) {
-+ if (delete_item(fname, sx.st.st_mode, del_opts) != 0)
++ if (delete_item(fname, sx.st.st_mode, "regular file", del_opts) != 0)
return;
statret = -1;
stat_errno = ENOENT;
}
if (j >= 0) {
fnamecmp = fnamecmpbuf;
-@@ -1242,7 +1302,7 @@ static void recv_generator(char *fname,
+@@ -1310,7 +1370,7 @@ static void recv_generator(char *fname,
}
real_ret = statret;
if (partial_dir && (partialptr = partial_dir_fname(fname)) != NULL
&& link_stat(partialptr, &partial_st, 0) == 0
-@@ -1261,7 +1321,7 @@ static void recv_generator(char *fname,
+@@ -1329,7 +1389,7 @@ static void recv_generator(char *fname,
rprintf(FINFO, "fuzzy basis selected for %s: %s\n",
fname, fnamecmpbuf);
}
statret = 0;
fnamecmp = fnamecmpbuf;
fnamecmp_type = FNAMECMP_FUZZY;
-@@ -1270,7 +1330,7 @@ static void recv_generator(char *fname,
+@@ -1338,7 +1398,7 @@ static void recv_generator(char *fname,
if (statret != 0) {
if (preserve_hard_links && file->link_u.links
itemizing, code, HL_SKIP))
return;
if (stat_errno == ENOENT)
-@@ -1280,39 +1340,52 @@ static void recv_generator(char *fname,
+@@ -1348,39 +1408,52 @@ static void recv_generator(char *fname,
return;
}
fnamecmp = partialptr;
fnamecmp_type = FNAMECMP_PARTIAL_DIR;
statret = 0;
-@@ -1336,17 +1409,21 @@ static void recv_generator(char *fname,
+@@ -1404,17 +1477,21 @@ static void recv_generator(char *fname,
pretend_missing:
/* pretend the file didn't exist */
if (preserve_hard_links && file->link_u.links
}
if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) {
close(fd);
-@@ -1357,7 +1434,7 @@ static void recv_generator(char *fname,
+@@ -1425,7 +1502,7 @@ static void recv_generator(char *fname,
full_fname(backupptr));
free(back_file);
close(fd);
}
if ((f_copy = do_open(backupptr,
O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0) {
-@@ -1365,14 +1442,14 @@ static void recv_generator(char *fname,
+@@ -1433,14 +1510,14 @@ static void recv_generator(char *fname,
full_fname(backupptr));
free(back_file);
close(fd);
}
if (verbose > 2)
-@@ -1390,24 +1467,32 @@ static void recv_generator(char *fname,
+@@ -1458,24 +1535,32 @@ static void recv_generator(char *fname,
iflags |= ITEM_BASIS_TYPE_FOLLOWS;
if (fnamecmp_type == FNAMECMP_FUZZY)
iflags |= ITEM_XNAME_FOLLOWS;
if (f_copy >= 0) {
close(f_copy);
-@@ -1420,6 +1505,13 @@ static void recv_generator(char *fname,
+@@ -1488,6 +1573,13 @@ static void recv_generator(char *fname,
}
close(fd);
}
void generate_files(int f_out, struct file_list *flist, char *local_name)
-@@ -1479,6 +1571,8 @@ void generate_files(int f_out, struct fi
+@@ -1547,6 +1639,8 @@ void generate_files(int f_out, struct fi
* notice that and let us know via the redo pipe (or its closing). */
ignore_timeout = 1;
extern int make_backups;
extern int remove_source_files;
extern int stdout_format_has_i;
-@@ -147,15 +148,19 @@ void init_hard_links(void)
+@@ -146,15 +147,19 @@ void init_hard_links(void)
#ifdef SUPPORT_HARD_LINKS
static int maybe_hard_link(struct file_struct *file, int ndx,
ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS,
0, "");
}
-@@ -170,13 +175,13 @@ static int maybe_hard_link(struct file_s
+@@ -169,13 +174,13 @@ static int maybe_hard_link(struct file_s
return -1;
}
}
enum logcode code, int skip)
{
#ifdef SUPPORT_HARD_LINKS
-@@ -217,7 +222,7 @@ int hard_link_check(struct file_struct *
+@@ -216,7 +221,7 @@ int hard_link_check(struct file_struct *
|| st2.st_ino != st3.st_ino)
continue;
statret = 1;
if (verbose < 2 || !stdout_format_has_i) {
itemizing = 0;
code = FNONE;
-@@ -227,12 +232,16 @@ int hard_link_check(struct file_struct *
+@@ -226,12 +231,16 @@ int hard_link_check(struct file_struct *
if (!unchanged_file(cmpbuf, file, &st3))
continue;
statret = 1;
toname, &st2, itemizing, code);
if (remove_source_files == 1 && do_xfers) {
char numbuf[4];
-@@ -250,7 +259,7 @@ int hard_link_check(struct file_struct *
+@@ -249,7 +258,7 @@ int hard_link_check(struct file_struct *
#ifdef SUPPORT_HARD_LINKS
int hard_link_one(struct file_struct *file, int ndx, char *fname,
int itemizing, enum logcode code)
{
if (do_link(toname, fname)) {
-@@ -266,7 +275,11 @@ int hard_link_one(struct file_struct *fi
+@@ -265,7 +274,11 @@ int hard_link_one(struct file_struct *fi
}
if (itemizing) {
ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS, 0,
terse ? "" : toname);
}
-@@ -283,11 +296,12 @@ void hard_link_cluster(struct file_struc
+@@ -282,11 +295,12 @@ void hard_link_cluster(struct file_struc
#ifdef SUPPORT_HARD_LINKS
char hlink1[MAXPATHLEN];
char *hlink2;
return;
if (!(file->flags & FLAG_HLINK_TOL)) {
while (!(file->flags & FLAG_HLINK_EOL)) {
-@@ -301,9 +315,13 @@ void hard_link_cluster(struct file_struc
+@@ -300,9 +314,13 @@ void hard_link_cluster(struct file_struc
if (file->F_HLINDEX != SKIPPED_LINK)
continue;
hlink2 = f_name(file, NULL);
+#endif /* SUPPORT_ACLS */
--- old/log.c
+++ new/log.c
-@@ -606,8 +606,10 @@ static void log_formatted(enum logcode c
- n[5] = !(iflags & ITEM_REPORT_PERMS) ? '.' : 'p';
- n[6] = !(iflags & ITEM_REPORT_OWNER) ? '.' : 'o';
- n[7] = !(iflags & ITEM_REPORT_GROUP) ? '.' : 'g';
-- n[8] = '.';
-- n[9] = '\0';
-+ n[8] = !(iflags & ITEM_REPORT_ATIME) ? '.' : 'u';
-+ n[9] = !(iflags & ITEM_REPORT_ACL) ? '.' : 'a';
-+ n[10] = !(iflags & ITEM_REPORT_XATTR) ? '.' : 'x';
-+ n[11] = '\0';
+@@ -614,8 +614,10 @@ static void log_formatted(enum logcode c
+ c[5] = !(iflags & ITEM_REPORT_PERMS) ? '.' : 'p';
+ c[6] = !(iflags & ITEM_REPORT_OWNER) ? '.' : 'o';
+ c[7] = !(iflags & ITEM_REPORT_GROUP) ? '.' : 'g';
+- c[8] = '.';
+- c[9] = '\0';
++ c[8] = !(iflags & ITEM_REPORT_ATIME) ? '.' : 'u';
++ c[9] = !(iflags & ITEM_REPORT_ACL) ? '.' : 'a';
++ c[10] = !(iflags & ITEM_REPORT_XATTR) ? '.' : 'x';
++ c[11] = '\0';
if (iflags & (ITEM_IS_NEW|ITEM_MISSING_DATA)) {
char ch = iflags & ITEM_IS_NEW ? '+' : '?';
default:
/* A large opt value means that set_refuse_options()
* turned this option off. */
-@@ -1530,6 +1559,10 @@ void server_options(char **args,int *arg
+@@ -1531,6 +1560,10 @@ void server_options(char **args,int *arg
if (preserve_hard_links)
argstr[x++] = 'H';
#define GID_NONE ((gid_t)-1)
#define HL_CHECK_MASTER 0
-@@ -654,6 +662,17 @@ struct stats {
+@@ -656,6 +664,17 @@ struct stats {
struct chmod_mode_struct;
#include "byteorder.h"
#include "lib/mdfour.h"
#include "lib/wildmatch.h"
-@@ -667,6 +686,16 @@ struct chmod_mode_struct;
+@@ -669,6 +688,16 @@ struct chmod_mode_struct;
#define UNUSED(x) x __attribute__((__unused__))
#define NORETURN __attribute__((__noreturn__))
dit(bf(--chmod)) This option tells rsync to apply one or more
comma-separated "chmod" strings to the permission of the files in the
transfer. The resulting value is treated as though it was the permissions
-@@ -1389,8 +1403,8 @@ if the receiving rsync is at least versi
+@@ -1395,8 +1409,8 @@ if the receiving rsync is at least versi
with older versions of rsync, but that also turns on the output of other
verbose messages).
type of update being done, bf(X) is replaced by the file-type, and the
other letters represent attributes that may be output if they are being
modified.
-@@ -1439,7 +1453,11 @@ quote(itemization(
+@@ -1445,7 +1459,11 @@ quote(itemization(
sender's value (requires bf(--owner) and super-user privileges).
it() A bf(g) means the group is different and is being updated to the
sender's value (requires bf(--group) and the authority to set the group).
fi
--- old/testsuite/itemize.test
+++ new/testsuite/itemize.test
-@@ -33,15 +33,15 @@ rm -f "$fromdir/foo/sym.test"
+@@ -38,15 +38,15 @@ rm -f "$to2dir" "$to2dir.test"
$RSYNC -iplr "$fromdir/" "$todir/" \
| tee "$outfile"
cat <<EOT >"$chkfile"
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed"
-@@ -53,10 +53,10 @@ chmod 601 "$fromdir/foo/config2"
+@@ -58,10 +58,10 @@ chmod 601 "$fromdir/foo/config2"
$RSYNC -iplrH "$fromdir/" "$todir/" \
| tee "$outfile"
cat <<EOT >"$chkfile"
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed"
-@@ -73,11 +73,11 @@ chmod 777 "$todir/bar/baz/rsync"
+@@ -78,11 +78,11 @@ chmod 777 "$todir/bar/baz/rsync"
$RSYNC -iplrtc "$fromdir/" "$todir/" \
| tee "$outfile"
cat <<EOT >"$chkfile"
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed"
-@@ -102,15 +102,15 @@ $RSYNC -ivvplrtH "$fromdir/" "$todir/" \
+@@ -107,15 +107,15 @@ $RSYNC -ivvplrtH "$fromdir/" "$todir/" \
| tee "$outfile"
filter_outfile
cat <<EOT >"$chkfile"
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 5 failed"
-@@ -129,8 +129,8 @@ touch "$todir/foo/config2"
+@@ -134,8 +134,8 @@ touch "$todir/foo/config2"
$RSYNC -iplrtH "$fromdir/" "$todir/" \
| tee "$outfile"
cat <<EOT >"$chkfile"
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 7 failed"
-@@ -138,15 +138,15 @@ $RSYNC -ivvplrtH --copy-dest=../to "$fro
+@@ -143,15 +143,15 @@ $RSYNC -ivvplrtH --copy-dest=../to "$fro
| tee "$outfile"
filter_outfile
cat <<EOT >"$chkfile"
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 8 failed"
-@@ -154,7 +154,7 @@ rm -rf "$to2dir"
+@@ -159,7 +159,7 @@ rm -rf "$to2dir"
$RSYNC -iplrtH --copy-dest=../to "$fromdir/" "$to2dir/" \
| tee "$outfile"
cat <<EOT >"$chkfile"
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 9 failed"
-@@ -181,15 +181,15 @@ $RSYNC -ivvplrtH --link-dest="$todir" "$
+@@ -186,15 +186,15 @@ $RSYNC -ivvplrtH --link-dest="$todir" "$
| tee "$outfile"
filter_outfile
cat <<EOT >"$chkfile"
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 11 failed"
-@@ -231,14 +231,14 @@ filter_outfile
+@@ -236,14 +236,14 @@ filter_outfile
# TODO fix really-old problem when combining -H with --compare-dest:
# missing output for foo/extra hard-link (and it might not be updated)!
cat <<EOT >"$chkfile"