}
--- old/generator.c
+++ new/generator.c
-@@ -36,6 +36,7 @@ extern int recurse;
+@@ -35,6 +35,7 @@ extern int do_progress;
extern int relative_paths;
extern int implied_dirs;
extern int keep_dirlinks;
extern int preserve_links;
extern int preserve_devices;
extern int preserve_specials;
-@@ -85,6 +86,7 @@ extern long block_size; /* "long" becaus
+@@ -84,6 +85,7 @@ extern long block_size; /* "long" becaus
extern int max_delete;
extern int force_delete;
extern int one_file_system;
extern struct stats stats;
extern dev_t filesystem_dev;
extern char *backup_dir;
-@@ -317,22 +319,27 @@ static void do_delete_pass(struct file_l
+@@ -316,22 +318,27 @@ static void do_delete_pass(struct file_l
rprintf(FINFO, " \r");
}
int32 iflags, uchar fnamecmp_type, char *xname)
{
if (statret >= 0) { /* A from-dest-dir statret can == 1! */
-@@ -340,19 +347,23 @@ void itemize(struct file_struct *file, i
+@@ -339,19 +346,23 @@ void itemize(struct file_struct *file, i
: S_ISDIR(file->mode) ? !omit_dir_times
: !S_ISLNK(file->mode);
} else
iflags |= ITEM_IS_NEW;
-@@ -603,7 +614,7 @@ void check_for_finished_hlinks(int itemi
+@@ -604,7 +615,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 save_ignore_times = ignore_times;
-@@ -617,7 +628,7 @@ static int try_dests_reg(struct file_str
+@@ -618,7 +629,7 @@ static int try_dests_reg(struct file_str
do {
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
continue;
switch (match_level) {
case 0:
-@@ -625,16 +636,20 @@ static int try_dests_reg(struct file_str
+@@ -626,16 +637,20 @@ static int try_dests_reg(struct file_str
match_level = 1;
/* FALL THROUGH */
case 1:
continue;
best_match = j;
match_level = 3;
-@@ -651,14 +666,14 @@ static int try_dests_reg(struct file_str
+@@ -652,14 +667,14 @@ static int try_dests_reg(struct file_str
if (j != best_match) {
j = best_match;
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
cmpbuf, 1,
itemizing && verbose > 1,
code) < 0)
-@@ -667,8 +682,13 @@ static int try_dests_reg(struct file_str
+@@ -668,8 +683,13 @@ static int try_dests_reg(struct file_str
hard_link_cluster(file, ndx, itemizing, code);
} else
#endif
+ itemize(file, ndx, 0, sxp, 0, 0, NULL);
+ }
if (verbose > 1 && maybe_ATTRS_REPORT) {
- code = logfile_format_has_i || dry_run ? FNAME : FINFO;
- rprintf(code, "%s is uptodate\n", fname);
+ rprintf(FCLIENT, "%s is uptodate\n", fname);
+ }
@@ -685,8 +705,13 @@ static int try_dests_reg(struct file_str
}
return -1;
+#endif
}
if (verbose > 1 && maybe_ATTRS_REPORT) {
- code = logfile_format_has_i || dry_run ? FNAME : FINFO;
-@@ -776,6 +814,7 @@ static int try_dests_non(struct file_str
+ rprintf(FCLIENT, "%s is uptodate\n", fname);
+@@ -775,6 +813,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
-@@ -797,7 +836,8 @@ static void recv_generator(char *fname,
+@@ -796,7 +835,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;
-@@ -848,6 +888,9 @@ static void recv_generator(char *fname,
- dry_run--;
- missing_below = -1;
+@@ -852,6 +892,9 @@ static void recv_generator(char *fname,
+ } else if (!dry_run)
+ return;
}
+#ifdef SUPPORT_ACLS
+ sx.acc_acl = sx.def_acl = NULL;
if (dry_run > 1) {
statret = -1;
stat_errno = ENOENT;
-@@ -855,7 +898,7 @@ static void recv_generator(char *fname,
+@@ -859,7 +902,7 @@ static void recv_generator(char *fname,
char *dn = file->dirname ? file->dirname : ".";
if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
if (relative_paths && !implied_dirs
&& create_directory_path(fname) < 0) {
rsyserr(FERROR, errno,
"recv_generator: mkdir %s failed",
-@@ -867,6 +910,10 @@ static void recv_generator(char *fname,
+@@ -871,6 +914,10 @@ static void recv_generator(char *fname,
}
if (fuzzy_basis)
need_fuzzy_dirlist = 1;
}
parent_dirname = dn;
-@@ -875,7 +922,7 @@ static void recv_generator(char *fname,
+@@ -879,7 +926,7 @@ static void recv_generator(char *fname,
need_fuzzy_dirlist = 0;
}
keep_dirlinks && S_ISDIR(file->mode));
stat_errno = errno;
}
-@@ -893,8 +940,9 @@ static void recv_generator(char *fname,
+@@ -897,8 +944,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)) {
-@@ -903,8 +951,8 @@ static void recv_generator(char *fname,
+@@ -907,8 +955,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. */
return;
statret = -1;
}
-@@ -913,7 +961,11 @@ static void recv_generator(char *fname,
+@@ -917,7 +965,11 @@ static void recv_generator(char *fname,
dry_run++;
}
if (itemizing && f_out != -1) {
statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL);
}
if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) {
-@@ -925,19 +977,19 @@ static void recv_generator(char *fname,
- full_fname(fname));
+@@ -937,19 +989,19 @@ static void recv_generator(char *fname,
+ return;
}
}
- if (set_file_attrs(fname, file, statret ? NULL : &st, 0)
if (preserve_links && S_ISLNK(file->mode)) {
#ifdef SUPPORT_LINKS
-@@ -955,7 +1007,7 @@ static void recv_generator(char *fname,
+@@ -967,7 +1019,7 @@ static void recv_generator(char *fname,
char lnk[MAXPATHLEN];
int len;
&& (len = readlink(fname, lnk, MAXPATHLEN-1)) > 0) {
lnk[len] = 0;
/* A link already pointing to the
-@@ -963,10 +1015,10 @@ static void recv_generator(char *fname,
+@@ -975,10 +1027,10 @@ static void recv_generator(char *fname,
* required. */
if (strcmp(lnk, file->u.link) == 0) {
if (itemizing) {
maybe_ATTRS_REPORT);
if (preserve_hard_links
&& file->link_u.links) {
-@@ -979,9 +1031,9 @@ static void recv_generator(char *fname,
+@@ -991,9 +1043,9 @@ static void recv_generator(char *fname,
}
/* Not the right symlink (or not a symlink), so
* delete it. */
statret = -1;
} else if (basis_dir[0] != NULL) {
if (try_dests_non(file, fname, ndx, itemizing,
-@@ -997,7 +1049,7 @@ static void recv_generator(char *fname,
+@@ -1009,7 +1061,7 @@ static void recv_generator(char *fname,
}
}
if (preserve_hard_links && file->link_u.links
itemizing, code, HL_SKIP))
return;
if (do_symlink(file->u.link,fname) != 0) {
-@@ -1006,7 +1058,7 @@ static void recv_generator(char *fname,
+@@ -1018,7 +1070,7 @@ static void recv_generator(char *fname,
} else {
set_file_attrs(fname, file, NULL, 0);
if (itemizing) {
ITEM_LOCAL_CHANGE, 0, NULL);
}
if (code && verbose) {
-@@ -1040,18 +1092,22 @@ static void recv_generator(char *fname,
+@@ -1052,18 +1104,22 @@ static void recv_generator(char *fname,
itemizing = code = 0;
}
}
statret = -1;
if (verbose > 2) {
rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
-@@ -1064,7 +1120,7 @@ static void recv_generator(char *fname,
+@@ -1076,7 +1132,7 @@ static void recv_generator(char *fname,
} else {
set_file_attrs(fname, file, NULL, 0);
if (itemizing) {
ITEM_LOCAL_CHANGE, 0, NULL);
}
if (code && verbose)
-@@ -1076,12 +1132,12 @@ static void recv_generator(char *fname,
+@@ -1088,12 +1144,12 @@ static void recv_generator(char *fname,
}
} else {
if (itemizing)
}
if (!S_ISREG(file->mode)) {
-@@ -1115,7 +1171,7 @@ static void recv_generator(char *fname,
+@@ -1127,7 +1183,7 @@ static void recv_generator(char *fname,
}
if (update_only && statret == 0
if (verbose > 1)
rprintf(FINFO, "%s is newer\n", fname);
return;
-@@ -1124,18 +1180,18 @@ static void recv_generator(char *fname,
+@@ -1136,18 +1192,18 @@ static void recv_generator(char *fname,
fnamecmp = fname;
fnamecmp_type = FNAMECMP_FNAME;
if (j != -1) {
fnamecmp = fnamecmpbuf;
fnamecmp_type = j;
-@@ -1144,7 +1200,7 @@ static void recv_generator(char *fname,
+@@ -1156,7 +1212,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
-@@ -1163,7 +1219,7 @@ static void recv_generator(char *fname,
+@@ -1175,7 +1231,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;
-@@ -1172,7 +1228,7 @@ static void recv_generator(char *fname,
+@@ -1184,7 +1240,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)
-@@ -1182,31 +1238,44 @@ static void recv_generator(char *fname,
+@@ -1194,31 +1250,44 @@ static void recv_generator(char *fname,
return;
}
fnamecmp = partialptr;
fnamecmp_type = FNAMECMP_PARTIAL_DIR;
statret = 0;
-@@ -1230,17 +1299,21 @@ static void recv_generator(char *fname,
+@@ -1242,17 +1311,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);
-@@ -1251,7 +1324,7 @@ static void recv_generator(char *fname,
+@@ -1263,7 +1336,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) {
-@@ -1259,14 +1332,14 @@ static void recv_generator(char *fname,
+@@ -1271,14 +1344,14 @@ static void recv_generator(char *fname,
full_fname(backupptr));
free(back_file);
close(fd);
}
if (verbose > 2)
-@@ -1284,24 +1357,32 @@ static void recv_generator(char *fname,
+@@ -1296,24 +1369,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);
-@@ -1314,6 +1395,13 @@ static void recv_generator(char *fname,
+@@ -1326,6 +1407,13 @@ static void recv_generator(char *fname,
}
close(fd);
}
void generate_files(int f_out, struct file_list *flist, char *local_name)
-@@ -1373,6 +1461,8 @@ void generate_files(int f_out, struct fi
+@@ -1385,6 +1473,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;
+int sys_acl_free_qualifier(void *qual, SMB_ACL_TAG_T tagtype);
--- old/log.c
+++ new/log.c
-@@ -594,8 +594,10 @@ static void log_formatted(enum logcode c
+@@ -582,8 +582,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';
/* Note that this field may not have type ino_t. It depends
* on the complicated interaction between largefile feature
-@@ -299,6 +305,9 @@ void usage(enum logcode F)
+@@ -282,7 +288,7 @@ void usage(enum logcode F)
+ rprintf(F," -v, --verbose increase verbosity\n");
+ rprintf(F," -q, --quiet suppress non-error messages\n");
+ rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n");
+- rprintf(F," -a, --archive archive mode; same as -rlptgoD (no -H)\n");
++ rprintf(F," -a, --archive archive mode; same as -rlptgoD (no -H, -A)\n");
+ 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");
+@@ -303,6 +309,9 @@ void usage(enum logcode F)
rprintf(F," -H, --hard-links preserve hard links\n");
rprintf(F," -p, --perms preserve permissions\n");
rprintf(F," -E, --executability preserve the file's executability\n");
rprintf(F," --chmod=CHMOD change destination permissions\n");
rprintf(F," -o, --owner preserve owner (super-user only)\n");
rprintf(F," -g, --group preserve group\n");
-@@ -416,6 +425,9 @@ static struct poptOption long_options[]
+@@ -421,6 +430,9 @@ static struct poptOption long_options[]
{"no-perms", 0, POPT_ARG_VAL, &preserve_perms, 0, 0, 0 },
{"no-p", 0, POPT_ARG_VAL, &preserve_perms, 0, 0, 0 },
{"executability", 'E', POPT_ARG_NONE, &preserve_executability, 0, 0, 0 },
default:
/* A large opt value means that set_refuse_options()
* turned this option off. */
-@@ -1529,6 +1559,10 @@ void server_options(char **args,int *arg
+@@ -1528,6 +1558,10 @@ void server_options(char **args,int *arg
if (preserve_hard_links)
argstr[x++] = 'H';
/* We now check to see if we are writing file "inplace" */
--- old/rsync.c
+++ new/rsync.c
-@@ -33,6 +33,7 @@
+@@ -32,6 +32,7 @@
+
extern int verbose;
extern int dry_run;
- extern int logfile_format_has_i;
+extern int preserve_acls;
extern int preserve_perms;
extern int preserve_executability;
extern int preserve_times;
-@@ -101,7 +102,8 @@ void free_sums(struct sum_struct *s)
+@@ -100,7 +101,8 @@ void free_sums(struct sum_struct *s)
/* This is only called when we aren't preserving permissions. Figure out what
* the permissions should be and return them merged back into the mode. */
{
/* If the file already exists, we'll return the local permissions,
* possibly tweaked by the --executability option. */
-@@ -116,55 +118,63 @@ mode_t dest_mode(mode_t flist_mode, mode
+@@ -115,55 +117,63 @@ mode_t dest_mode(mode_t flist_mode, mode
cur_mode |= (cur_mode & 0444) >> 2;
}
} else
;
else
#endif
-@@ -174,43 +184,55 @@ int set_file_attrs(char *fname, struct f
+@@ -173,43 +183,55 @@ int set_file_attrs(char *fname, struct f
rprintf(FINFO,
"set uid of %s from %ld to %ld\n",
fname,
}
if (ret == 0) /* ret == 1 if symlink could not be set */
updated = 1;
-@@ -224,6 +246,11 @@ int set_file_attrs(char *fname, struct f
+@@ -222,6 +244,11 @@ int set_file_attrs(char *fname, struct f
else
- rprintf(code, "%s is uptodate\n", fname);
+ rprintf(FCLIENT, "%s is uptodate\n", fname);
}
+ cleanup:
+#ifdef SUPPORT_ACLS
/* We have replacement versions of these if they're missing. */
--- old/rsync.yo
+++ new/rsync.yo
+@@ -300,7 +300,7 @@ to the detailed description below for a
+ -v, --verbose increase verbosity
+ -q, --quiet suppress non-error messages
+ -c, --checksum skip based on checksum, not mod-time & size
+- -a, --archive archive mode; same as -rlptgoD (no -H)
++ -a, --archive archive mode; same as -rlptgoD (no -H, -A)
+ --no-OPTION turn off an implied OPTION (e.g. --no-D)
+ -r, --recursive recurse into directories
+ -R, --relative use relative path names
@@ -321,6 +321,7 @@ to the detailed description below for a
-H, --hard-links preserve hard links
-p, --perms preserve permissions
--chmod=CHMOD change destination permissions
-o, --owner preserve owner (super-user only)
-g, --group preserve group
-@@ -745,7 +746,9 @@ quote(itemize(
+@@ -746,7 +747,9 @@ quote(itemize(
permissions, though the bf(--executability) option might change just
the execute permission for the file.
it() New files get their "normal" permission bits set to the source
their special permission bits disabled except in the case where a new
directory inherits a setgid bit from its parent directory.
))
-@@ -776,9 +779,11 @@ The preservation of the destination's se
+@@ -777,9 +780,11 @@ The preservation of the destination's se
directories when bf(--perms) is off was added in rsync 2.6.7. Older rsync
versions erroneously preserved the three special permission bits for
newly-created files when bf(--perms) was off, while overriding the
dit(bf(-E, --executability)) This option causes rsync to preserve the
executability (or non-executability) of regular files when bf(--perms) is
-@@ -796,6 +801,15 @@ quote(itemize(
+@@ -797,6 +802,15 @@ quote(itemize(
If bf(--perms) is enabled, this option is ignored.
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
-@@ -1377,8 +1391,8 @@ if the receiving rsync is at least versi
+@@ -1378,8 +1392,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.
-@@ -1427,7 +1441,11 @@ quote(itemize(
+@@ -1428,7 +1442,11 @@ quote(itemize(
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).