X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/195ca26e0b49d761dda367bea5c7b09829bd7128..686ce3aa4f643829bdde0d9908228adb6b541f6d:/acls.diff diff --git a/acls.diff b/acls.diff index 17d4bfd..94a7cd0 100644 --- a/acls.diff +++ b/acls.diff @@ -9,7 +9,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. --- old/Makefile.in +++ new/Makefile.in -@@ -25,15 +25,15 @@ VERSION=@VERSION@ +@@ -26,15 +26,15 @@ VERSION=@VERSION@ .SUFFIXES: .SUFFIXES: .c .o @@ -1218,7 +1218,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. robust_unlink(fname); /* Just in case... */ --- old/configure.in +++ new/configure.in -@@ -490,6 +490,11 @@ if test x"$ac_cv_func_strcasecmp" = x"no +@@ -515,6 +515,11 @@ if test x"$ac_cv_func_strcasecmp" = x"no AC_CHECK_LIB(resolv, strcasecmp) fi @@ -1230,7 +1230,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. 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. -@@ -754,6 +759,78 @@ AC_SUBST(OBJ_RESTORE) +@@ -779,6 +784,78 @@ AC_SUBST(OBJ_RESTORE) AC_SUBST(CC_SHOBJ_FLAG) AC_SUBST(BUILD_POPT) @@ -1430,7 +1430,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. extern int preserve_links; extern int preserve_devices; extern int preserve_specials; -@@ -84,6 +85,7 @@ extern long block_size; /* "long" becaus +@@ -85,6 +86,7 @@ extern long block_size; /* "long" becaus extern int max_delete; extern int force_delete; extern int one_file_system; @@ -1438,7 +1438,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. extern struct stats stats; extern dev_t filesystem_dev; extern char *backup_dir; -@@ -316,22 +318,27 @@ static void do_delete_pass(struct file_l +@@ -317,22 +319,27 @@ static void do_delete_pass(struct file_l rprintf(FINFO, " \r"); } @@ -1471,7 +1471,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. int32 iflags, uchar fnamecmp_type, char *xname) { if (statret >= 0) { /* A from-dest-dir statret can == 1! */ -@@ -339,19 +346,23 @@ void itemize(struct file_struct *file, i +@@ -340,19 +347,23 @@ void itemize(struct file_struct *file, i : S_ISDIR(file->mode) ? !omit_dir_times : !S_ISLNK(file->mode); @@ -1500,7 +1500,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } else iflags |= ITEM_IS_NEW; -@@ -604,7 +615,7 @@ void check_for_finished_hlinks(int itemi +@@ -605,7 +616,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, @@ -1508,8 +1508,8 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + char *cmpbuf, statx *sxp, int itemizing, int maybe_ATTRS_REPORT, enum logcode code) { - int save_ignore_times = ignore_times; -@@ -618,7 +629,7 @@ static int try_dests_reg(struct file_str + int best_match = -1; +@@ -614,7 +625,7 @@ static int try_dests_reg(struct file_str do { pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname); @@ -1518,7 +1518,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. continue; switch (match_level) { case 0: -@@ -626,16 +637,20 @@ static int try_dests_reg(struct file_str +@@ -622,16 +633,20 @@ static int try_dests_reg(struct file_str match_level = 1; /* FALL THROUGH */ case 1: @@ -1542,7 +1542,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. continue; best_match = j; match_level = 3; -@@ -652,14 +667,14 @@ static int try_dests_reg(struct file_str +@@ -646,14 +661,14 @@ static int try_dests_reg(struct file_str if (j != best_match) { j = best_match; pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname); @@ -1559,8 +1559,8 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. cmpbuf, 1, itemizing && verbose > 1, code) < 0) -@@ -668,8 +683,13 @@ static int try_dests_reg(struct file_str - hard_link_cluster(file, ndx, itemizing, code); +@@ -665,8 +680,13 @@ static int try_dests_reg(struct file_str + } } else #endif - if (itemizing) @@ -1575,7 +1575,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. 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 +@@ -682,8 +702,13 @@ static int try_dests_reg(struct file_str } return -1; } @@ -1591,7 +1591,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. set_file_attrs(fname, file, NULL, 0); if (maybe_ATTRS_REPORT && ((!itemizing && verbose && match_level == 2) -@@ -710,13 +735,18 @@ static int try_dests_non(struct file_str +@@ -707,13 +732,18 @@ static int try_dests_non(struct file_str enum logcode code) { char fnamebuf[MAXPATHLEN]; @@ -1613,7 +1613,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. continue; if (S_ISLNK(file->mode)) { #ifdef SUPPORT_LINKS -@@ -729,10 +759,10 @@ static int try_dests_non(struct file_str +@@ -726,10 +756,10 @@ static int try_dests_non(struct file_str #endif continue; } else if (IS_SPECIAL(file->mode)) { @@ -1626,7 +1626,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. continue; } else { rprintf(FERROR, -@@ -763,7 +793,15 @@ static int try_dests_non(struct file_str +@@ -760,7 +790,15 @@ static int try_dests_non(struct file_str int changes = compare_dest ? 0 : ITEM_LOCAL_CHANGE + (link_dest ? ITEM_XNAME_FOLLOWS : 0); char *lp = link_dest ? "" : NULL; @@ -1643,7 +1643,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if (verbose > 1 && maybe_ATTRS_REPORT) { rprintf(FCLIENT, "%s is uptodate\n", fname); -@@ -775,6 +813,7 @@ static int try_dests_non(struct file_str +@@ -772,6 +810,7 @@ static int try_dests_non(struct file_str } static int phase = 0; @@ -1651,7 +1651,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. /* 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 -@@ -796,7 +835,8 @@ static void recv_generator(char *fname, +@@ -793,7 +832,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; @@ -1661,7 +1661,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. struct file_struct *back_file = NULL; int statret, real_ret, stat_errno; char *fnamecmp, *partialptr, *backupptr = NULL; -@@ -852,6 +892,9 @@ static void recv_generator(char *fname, +@@ -849,6 +889,9 @@ static void recv_generator(char *fname, } else if (!dry_run) return; } @@ -1671,16 +1671,16 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (dry_run > 1) { statret = -1; stat_errno = ENOENT; -@@ -859,7 +902,7 @@ static void recv_generator(char *fname, +@@ -856,7 +899,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 -- && safe_stat(dn, &st) < 0 -+ && safe_stat(dn, &sx.st) < 0 +- && do_stat(dn, &st) < 0 ++ && do_stat(dn, &sx.st) < 0 && create_directory_path(fname) < 0) { rsyserr(FERROR, errno, "recv_generator: mkdir %s failed", -@@ -871,6 +914,10 @@ static void recv_generator(char *fname, +@@ -868,6 +911,10 @@ static void recv_generator(char *fname, } if (fuzzy_basis) need_fuzzy_dirlist = 1; @@ -1691,7 +1691,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } parent_dirname = dn; -@@ -879,7 +926,7 @@ static void recv_generator(char *fname, +@@ -876,7 +923,7 @@ static void recv_generator(char *fname, need_fuzzy_dirlist = 0; } @@ -1700,7 +1700,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. keep_dirlinks && S_ISDIR(file->mode)); stat_errno = errno; } -@@ -897,8 +944,9 @@ static void recv_generator(char *fname, +@@ -894,8 +941,9 @@ static void recv_generator(char *fname, * mode based on the local permissions and some heuristics. */ if (!preserve_perms) { int exists = statret == 0 @@ -1712,7 +1712,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if (S_ISDIR(file->mode)) { -@@ -907,8 +955,8 @@ static void recv_generator(char *fname, +@@ -904,8 +952,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. */ @@ -1723,26 +1723,26 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. return; statret = -1; } -@@ -917,7 +965,11 @@ static void recv_generator(char *fname, - dry_run++; - } - if (itemizing && f_out != -1) { -- itemize(file, ndx, statret, &st, +@@ -920,7 +968,11 @@ static void recv_generator(char *fname, + sr = -1; + new_root_dir = 0; + } +- itemize(file, ndx, sr, &st, +#ifdef SUPPORT_ACLS -+ if (preserve_acls && statret == 0) ++ if (preserve_acls && sr == 0) + get_acl(fname, &sx); +#endif -+ itemize(file, ndx, statret, &sx, - statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL); ++ itemize(file, ndx, sr, &sx, + sr ? ITEM_LOCAL_CHANGE : 0, 0, NULL); } if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) { -@@ -937,19 +989,19 @@ static void recv_generator(char *fname, +@@ -940,19 +992,19 @@ static void recv_generator(char *fname, return; } } - if (set_file_attrs(fname, file, statret ? NULL : &st, 0) + if (set_file_attrs(fname, file, statret ? NULL : &sx, 0) - && verbose && code && f_out != -1) + && verbose && code != FNONE && f_out != -1) rprintf(code, "%s/\n", fname); if (delete_during && f_out != -1 && !phase && dry_run < 2 && (file->flags & FLAG_DEL_HERE)) @@ -1761,7 +1761,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (preserve_links && S_ISLNK(file->mode)) { #ifdef SUPPORT_LINKS -@@ -967,7 +1019,7 @@ static void recv_generator(char *fname, +@@ -970,7 +1022,7 @@ static void recv_generator(char *fname, char lnk[MAXPATHLEN]; int len; @@ -1770,7 +1770,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. && (len = readlink(fname, lnk, MAXPATHLEN-1)) > 0) { lnk[len] = 0; /* A link already pointing to the -@@ -975,10 +1027,10 @@ static void recv_generator(char *fname, +@@ -978,10 +1030,10 @@ static void recv_generator(char *fname, * required. */ if (strcmp(lnk, file->u.link) == 0) { if (itemizing) { @@ -1783,7 +1783,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. maybe_ATTRS_REPORT); if (preserve_hard_links && file->link_u.links) { -@@ -993,9 +1045,9 @@ static void recv_generator(char *fname, +@@ -996,9 +1048,9 @@ static void recv_generator(char *fname, } /* Not the right symlink (or not a symlink), so * delete it. */ @@ -1795,7 +1795,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. statret = -1; } else if (basis_dir[0] != NULL) { if (try_dests_non(file, fname, ndx, itemizing, -@@ -1011,7 +1063,7 @@ static void recv_generator(char *fname, +@@ -1015,7 +1067,7 @@ static void recv_generator(char *fname, } } if (preserve_hard_links && file->link_u.links @@ -1804,7 +1804,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. itemizing, code, HL_SKIP)) return; if (do_symlink(file->u.link,fname) != 0) { -@@ -1020,7 +1072,7 @@ static void recv_generator(char *fname, +@@ -1024,7 +1076,7 @@ static void recv_generator(char *fname, } else { set_file_attrs(fname, file, NULL, 0); if (itemizing) { @@ -1812,9 +1812,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + itemize(file, ndx, statret, &sx, ITEM_LOCAL_CHANGE, 0, NULL); } - if (code && verbose) { -@@ -1051,18 +1103,22 @@ static void recv_generator(char *fname, - itemizing = code = 0; + if (code != FNONE && verbose) { +@@ -1056,18 +1108,22 @@ static void recv_generator(char *fname, + code = FNONE; } } +#ifdef SUPPORT_ACLS @@ -1844,7 +1844,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. statret = -1; if (verbose > 2) { rprintf(FINFO,"mknod(%s,0%o,0x%x)\n", -@@ -1075,7 +1131,7 @@ static void recv_generator(char *fname, +@@ -1080,7 +1136,7 @@ static void recv_generator(char *fname, } else { set_file_attrs(fname, file, NULL, 0); if (itemizing) { @@ -1852,8 +1852,8 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + itemize(file, ndx, statret, &sx, ITEM_LOCAL_CHANGE, 0, NULL); } - if (code && verbose) -@@ -1089,14 +1145,14 @@ static void recv_generator(char *fname, + if (code != FNONE && verbose) +@@ -1094,14 +1150,14 @@ static void recv_generator(char *fname, } } else { if (itemizing) @@ -1871,7 +1871,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if (!S_ISREG(file->mode)) { -@@ -1130,7 +1186,7 @@ static void recv_generator(char *fname, +@@ -1135,7 +1191,7 @@ static void recv_generator(char *fname, } if (update_only && statret == 0 @@ -1880,7 +1880,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (verbose > 1) rprintf(FINFO, "%s is newer\n", fname); return; -@@ -1139,20 +1195,20 @@ static void recv_generator(char *fname, +@@ -1144,20 +1200,20 @@ static void recv_generator(char *fname, fnamecmp = fname; fnamecmp_type = FNAMECMP_FNAME; @@ -1903,9 +1903,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. - return; + goto cleanup; } - if (j != -1) { + if (j >= 0) { fnamecmp = fnamecmpbuf; -@@ -1162,7 +1218,7 @@ static void recv_generator(char *fname, +@@ -1167,7 +1223,7 @@ static void recv_generator(char *fname, } real_ret = statret; @@ -1914,7 +1914,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (partial_dir && (partialptr = partial_dir_fname(fname)) != NULL && link_stat(partialptr, &partial_st, 0) == 0 -@@ -1181,7 +1237,7 @@ static void recv_generator(char *fname, +@@ -1186,7 +1242,7 @@ static void recv_generator(char *fname, rprintf(FINFO, "fuzzy basis selected for %s: %s\n", fname, fnamecmpbuf); } @@ -1923,7 +1923,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. statret = 0; fnamecmp = fnamecmpbuf; fnamecmp_type = FNAMECMP_FUZZY; -@@ -1190,7 +1246,7 @@ static void recv_generator(char *fname, +@@ -1195,7 +1251,7 @@ static void recv_generator(char *fname, if (statret != 0) { if (preserve_hard_links && file->link_u.links @@ -1932,7 +1932,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. itemizing, code, HL_SKIP)) return; if (stat_errno == ENOENT) -@@ -1200,39 +1256,52 @@ static void recv_generator(char *fname, +@@ -1205,39 +1261,52 @@ static void recv_generator(char *fname, return; } @@ -1992,7 +1992,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. fnamecmp = partialptr; fnamecmp_type = FNAMECMP_PARTIAL_DIR; statret = 0; -@@ -1256,17 +1325,21 @@ static void recv_generator(char *fname, +@@ -1261,17 +1330,21 @@ static void recv_generator(char *fname, pretend_missing: /* pretend the file didn't exist */ if (preserve_hard_links && file->link_u.links @@ -2017,7 +2017,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) { close(fd); -@@ -1277,7 +1350,7 @@ static void recv_generator(char *fname, +@@ -1282,7 +1355,7 @@ static void recv_generator(char *fname, full_fname(backupptr)); free(back_file); close(fd); @@ -2026,7 +2026,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if ((f_copy = do_open(backupptr, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0) { -@@ -1285,14 +1358,14 @@ static void recv_generator(char *fname, +@@ -1290,14 +1363,14 @@ static void recv_generator(char *fname, full_fname(backupptr)); free(back_file); close(fd); @@ -2043,7 +2043,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if (verbose > 2) -@@ -1310,24 +1383,32 @@ static void recv_generator(char *fname, +@@ -1315,24 +1388,32 @@ static void recv_generator(char *fname, iflags |= ITEM_BASIS_TYPE_FOLLOWS; if (fnamecmp_type == FNAMECMP_FUZZY) iflags |= ITEM_XNAME_FOLLOWS; @@ -2081,7 +2081,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (f_copy >= 0) { close(f_copy); -@@ -1340,6 +1421,13 @@ static void recv_generator(char *fname, +@@ -1345,6 +1426,13 @@ static void recv_generator(char *fname, } close(fd); @@ -2095,7 +2095,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } void generate_files(int f_out, struct file_list *flist, char *local_name) -@@ -1399,6 +1487,8 @@ void generate_files(int f_out, struct fi +@@ -1404,6 +1492,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; @@ -2154,16 +2154,16 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. enum logcode code, int skip) { #ifdef SUPPORT_HARD_LINKS -@@ -209,7 +214,7 @@ int hard_link_check(struct file_struct * +@@ -215,7 +220,7 @@ int hard_link_check(struct file_struct * || st2.st_ino != st3.st_ino) continue; statret = 1; - st = &st3; + sxp->st = st3; - if (verbose < 2 || !stdout_format_has_i) - itemizing = code = 0; - break; -@@ -217,12 +222,16 @@ int hard_link_check(struct file_struct * + if (verbose < 2 || !stdout_format_has_i) { + itemizing = 0; + code = FNONE; +@@ -225,12 +230,16 @@ int hard_link_check(struct file_struct * if (!unchanged_file(cmpbuf, file, &st3)) continue; statret = 1; @@ -2183,7 +2183,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. toname, &st2, itemizing, code); if (remove_source_files == 1 && do_xfers) { char numbuf[4]; -@@ -240,7 +249,7 @@ int hard_link_check(struct file_struct * +@@ -248,7 +257,7 @@ int hard_link_check(struct file_struct * #ifdef SUPPORT_HARD_LINKS int hard_link_one(struct file_struct *file, int ndx, char *fname, @@ -2192,7 +2192,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. int itemizing, enum logcode code) { if (do_link(toname, fname)) { -@@ -256,7 +265,11 @@ int hard_link_one(struct file_struct *fi +@@ -264,7 +273,11 @@ int hard_link_one(struct file_struct *fi } if (itemizing) { @@ -2205,7 +2205,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS, 0, terse ? "" : toname); } -@@ -273,11 +286,12 @@ void hard_link_cluster(struct file_struc +@@ -281,11 +294,12 @@ void hard_link_cluster(struct file_struc #ifdef SUPPORT_HARD_LINKS char hlink1[MAXPATHLEN]; char *hlink2; @@ -2220,7 +2220,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. return; if (!(file->flags & FLAG_HLINK_TOL)) { while (!(file->flags & FLAG_HLINK_EOL)) { -@@ -291,9 +305,13 @@ void hard_link_cluster(struct file_struc +@@ -299,9 +313,13 @@ void hard_link_cluster(struct file_struc if (file->F_HLINDEX != SKIPPED_LINK) continue; hlink2 = f_name(file, NULL); @@ -5518,7 +5518,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +int sys_acl_free_qualifier(void *qual, SMB_ACL_TAG_T tagtype); --- old/log.c +++ new/log.c -@@ -609,8 +609,10 @@ static void log_formatted(enum logcode c +@@ -615,8 +615,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'; @@ -5531,17 +5531,6 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (iflags & (ITEM_IS_NEW|ITEM_MISSING_DATA)) { char ch = iflags & ITEM_IS_NEW ? '+' : '?'; ---- old/mkproto.awk -+++ new/mkproto.awk -@@ -58,7 +58,7 @@ BEGIN { - next; - } - --!/^OFF_T|^size_t|^off_t|^pid_t|^unsigned|^mode_t|^DIR|^user|^int|^char|^uint|^uchar|^short|^struct|^BOOL|^void|^time|^const|^RETSIGTYPE/ { -+!/^OFF_T|^size_t|^off_t|^pid_t|^id_t|^unsigned|^mode_t|^DIR|^user|^int|^char|^uint|^uchar|^short|^struct|^BOOL|^void|^time|^const|^RETSIGTYPE/ { - next; - } - --- old/options.c +++ new/options.c @@ -47,6 +47,7 @@ int copy_dirlinks = 0; @@ -5592,16 +5581,16 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. 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"); +@@ -304,6 +310,9 @@ void usage(enum logcode F) rprintf(F," -p, --perms preserve permissions\n"); rprintf(F," -E, --executability preserve the file's executability\n"); + rprintf(F," --chmod=CHMOD affect file and/or directory permissions\n"); +#ifdef SUPPORT_ACLS + rprintf(F," -A, --acls preserve ACLs (implies --perms)\n"); +#endif - 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"); + rprintf(F," --devices preserve device files (super-user only)\n"); @@ -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 }, @@ -5612,7 +5601,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. {"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 }, -@@ -1084,6 +1096,24 @@ int parse_arguments(int *argc, const cha +@@ -1082,6 +1094,24 @@ int parse_arguments(int *argc, const cha usage(FINFO); exit_cleanup(0); @@ -5637,7 +5626,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. 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 +@@ -1523,6 +1553,10 @@ void server_options(char **args,int *arg if (preserve_hard_links) argstr[x++] = 'H'; @@ -5658,7 +5647,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. extern struct stats stats; extern char *stdout_format; extern char *tmpdir; -@@ -347,6 +348,10 @@ int recv_files(int f_in, struct file_lis +@@ -350,6 +351,10 @@ int recv_files(int f_in, struct file_lis int itemizing = am_server ? logfile_format_has_i : stdout_format_has_i; enum logcode log_code = log_before_transfer ? FLOG : FINFO; int max_phase = protocol_version >= 29 ? 2 : 1; @@ -5669,7 +5658,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. int i, recv_ok; if (verbose > 2) -@@ -543,7 +548,16 @@ int recv_files(int f_in, struct file_lis +@@ -553,7 +558,16 @@ int recv_files(int f_in, struct file_lis * mode based on the local permissions and some heuristics. */ if (!preserve_perms) { int exists = fd1 != -1; @@ -5686,7 +5675,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + dflt_perms, exists); } - /* We now check to see if we are writing file "inplace" */ + /* We now check to see if we are writing the file "inplace" */ --- old/rsync.c +++ new/rsync.c @@ -32,6 +32,7 @@ @@ -5701,21 +5690,23 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. /* 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. */ --mode_t dest_mode(mode_t flist_mode, mode_t cur_mode, int exists) -+mode_t dest_mode(mode_t flist_mode, mode_t cur_mode, int dflt_perms, +-mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int exists) ++mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int dflt_perms, + int exists) { + int new_mode; /* If the file already exists, we'll return the local permissions, - * possibly tweaked by the --executability option. */ -@@ -115,55 +117,63 @@ mode_t dest_mode(mode_t flist_mode, mode - cur_mode |= (cur_mode & 0444) >> 2; +@@ -117,56 +119,65 @@ mode_t dest_mode(mode_t flist_mode, mode + new_mode |= (new_mode & 0444) >> 2; } - } else -- cur_mode = flist_mode & ACCESSPERMS & ~orig_umask; -+ cur_mode = flist_mode & ACCESSPERMS & dflt_perms; - if (daemon_chmod_modes && !S_ISLNK(flist_mode)) - cur_mode = tweak_mode(cur_mode, daemon_chmod_modes); - return (flist_mode & ~CHMOD_BITS) | (cur_mode & CHMOD_BITS); + } else { +- /* Apply the umask and turn off special permissions. */ +- new_mode = flist_mode & (~CHMOD_BITS | (ACCESSPERMS & ~orig_umask)); ++ /* Apply destination default permissions and turn ++ * off special permissions. */ ++ new_mode = flist_mode & (~CHMOD_BITS | dflt_perms); + } + return new_mode; } -int set_file_attrs(char *fname, struct file_struct *file, STRUCT_STAT *st, @@ -5726,6 +5717,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. - STRUCT_STAT st2; + statx sx2; int change_uid, change_gid; + mode_t new_mode = file->mode; - if (!st) { + if (!sxp) { @@ -5741,12 +5733,12 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +#ifdef SUPPORT_ACLS + sx2.acc_acl = sx2.def_acl = NULL; +#endif - if (!preserve_perms && S_ISDIR(file->mode) + if (!preserve_perms && S_ISDIR(new_mode) - && st->st_mode & S_ISGID) { + && sx2.st.st_mode & S_ISGID) { /* We just created this directory and its setgid * bit is on, so make sure it stays on. */ - file->mode |= S_ISGID; + new_mode |= S_ISGID; } + sxp = &sx2; } @@ -5785,7 +5777,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. ; else #endif -@@ -173,43 +183,55 @@ int set_file_attrs(char *fname, struct f +@@ -176,45 +187,57 @@ int set_file_attrs(char *fname, struct f rprintf(FINFO, "set uid of %s from %ld to %ld\n", fname, @@ -5826,6 +5818,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. updated = 1; } + if (daemon_chmod_modes && !S_ISLNK(new_mode)) + new_mode = tweak_mode(new_mode, daemon_chmod_modes); ++ +#ifdef SUPPORT_ACLS + /* It's OK to call set_acl() now, even for a dir, as the generator + * will enable owner-writability using chmod, if necessary. @@ -5838,11 +5833,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +#endif + #ifdef HAVE_CHMOD -- if ((st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) { -- int ret = do_chmod(fname, file->mode); -+ if ((sxp->st.st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) { -+ mode_t mode = file->mode; -+ int ret = do_chmod(fname, mode); +- if ((st->st_mode & CHMOD_BITS) != (new_mode & CHMOD_BITS)) { ++ if ((sxp->st.st_mode & CHMOD_BITS) != (new_mode & CHMOD_BITS)) { + int ret = do_chmod(fname, new_mode); if (ret < 0) { rsyserr(FERROR, errno, "failed to set permissions on %s", @@ -5852,7 +5845,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if (ret == 0) /* ret == 1 if symlink could not be set */ updated = 1; -@@ -222,6 +244,11 @@ int set_file_attrs(char *fname, struct f +@@ -227,6 +250,11 @@ int set_file_attrs(char *fname, struct f else rprintf(FCLIENT, "%s is uptodate\n", fname); } @@ -5866,7 +5859,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. --- old/rsync.h +++ new/rsync.h -@@ -486,6 +486,15 @@ struct idev { +@@ -492,6 +492,15 @@ struct idev { #define IN_LOOPBACKNET 127 #endif @@ -5882,7 +5875,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. #define GID_NONE ((gid_t)-1) #define HL_CHECK_MASTER 0 -@@ -646,6 +655,17 @@ struct stats { +@@ -653,6 +662,17 @@ struct stats { struct chmod_mode_struct; @@ -5900,9 +5893,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. #include "byteorder.h" #include "lib/mdfour.h" #include "lib/wildmatch.h" -@@ -661,6 +681,16 @@ struct chmod_mode_struct; - +@@ -669,6 +689,16 @@ struct chmod_mode_struct; #define UNUSED(x) x __attribute__((__unused__)) + #define NORETURN __attribute__((__noreturn__)) +typedef struct { + STRUCT_STAT st; @@ -5928,15 +5921,15 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. --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 +@@ -322,6 +322,7 @@ to the detailed description below for a -p, --perms preserve permissions -E, --executability preserve executability + --chmod=CHMOD affect file and/or directory permissions + -A, --acls preserve ACLs (implies -p) [non-standard] - --chmod=CHMOD change destination permissions -o, --owner preserve owner (super-user only) -g, --group preserve group -@@ -746,7 +747,9 @@ quote(itemize( + --devices preserve device files (super-user only) +@@ -745,7 +746,9 @@ quote(itemization( 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 @@ -5947,7 +5940,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. their special permission bits disabled except in the case where a new directory inherits a setgid bit from its parent directory. )) -@@ -777,9 +780,11 @@ The preservation of the destination's se +@@ -776,9 +779,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 @@ -5962,7 +5955,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. dit(bf(-E, --executability)) This option causes rsync to preserve the executability (or non-executability) of regular files when bf(--perms) is -@@ -797,6 +802,15 @@ quote(itemize( +@@ -796,6 +801,15 @@ quote(itemization( If bf(--perms) is enabled, this option is ignored. @@ -5978,7 +5971,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. 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 +@@ -1381,8 +1395,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). @@ -5989,7 +5982,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. 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( +@@ -1431,7 +1445,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). @@ -6286,17 +6279,6 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + +#endif /* No ACLs. */ +#endif /* _SMB_ACLS_H */ ---- old/t_stub.c -+++ new/t_stub.c -@@ -78,3 +78,8 @@ struct filter_list_struct server_filter_ - { - return NULL; - } -+ -+ const char *who_am_i(void) -+{ -+ return "test"; -+} --- old/testsuite/acls.test +++ new/testsuite/acls.test @@ -0,0 +1,34 @@ @@ -6457,10 +6439,11 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. sed -e '/block2\.5/d' \ --- old/testsuite/itemize.test +++ new/testsuite/itemize.test -@@ -29,14 +29,14 @@ ln "$fromdir/foo/config1" "$fromdir/foo/ +@@ -29,15 +29,15 @@ ln "$fromdir/foo/config1" "$fromdir/foo/ $RSYNC -iplr "$fromdir/" "$todir/" \ | tee "$outfile" cat <"$chkfile" +-cd+++++++ ./ -cd+++++++ bar/ -cd+++++++ bar/baz/ ->f+++++++ bar/baz/rsync @@ -6469,6 +6452,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. ->f+++++++ foo/config2 ->f+++++++ foo/extra -cL+++++++ foo/sym -> ../bar/baz/rsync ++cd+++++++++ ./ +cd+++++++++ bar/ +cd+++++++++ bar/baz/ +>f+++++++++ bar/baz/rsync @@ -6480,7 +6464,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed" -@@ -48,10 +48,10 @@ chmod 601 "$fromdir/foo/config2" +@@ -49,10 +49,10 @@ chmod 601 "$fromdir/foo/config2" $RSYNC -iplrH "$fromdir/" "$todir/" \ | tee "$outfile" cat <"$chkfile" @@ -6495,7 +6479,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed" -@@ -68,11 +68,11 @@ chmod 777 "$todir/bar/baz/rsync" +@@ -69,11 +69,11 @@ chmod 777 "$todir/bar/baz/rsync" $RSYNC -iplrtc "$fromdir/" "$todir/" \ | tee "$outfile" cat <"$chkfile" @@ -6512,7 +6496,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed" -@@ -97,15 +97,15 @@ $RSYNC -ivvplrtH "$fromdir/" "$todir/" \ +@@ -98,15 +98,15 @@ $RSYNC -ivvplrtH "$fromdir/" "$todir/" \ | tee "$outfile" filter_outfile cat <"$chkfile" @@ -6537,7 +6521,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 5 failed" -@@ -124,8 +124,8 @@ touch "$todir/foo/config2" +@@ -125,8 +125,8 @@ touch "$todir/foo/config2" $RSYNC -iplrtH "$fromdir/" "$todir/" \ | tee "$outfile" cat <"$chkfile" @@ -6548,11 +6532,11 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 7 failed" -@@ -134,15 +134,15 @@ $RSYNC -ivvplrtH --copy-dest="$lddir" "$ +@@ -135,15 +135,15 @@ $RSYNC -ivvplrtH --copy-dest=../ld "$fro | tee "$outfile" filter_outfile cat <"$chkfile" --.d..t.... ./ +-cd+++++++ ./ -cd+++++++ bar/ -cd+++++++ bar/baz/ -cf bar/baz/rsync @@ -6561,7 +6545,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. -cf foo/config2 -hf foo/extra => foo/config1 -cL..T.... foo/sym -> ../bar/baz/rsync -+.d..t...... ./ ++cd+++++++++ ./ +cd+++++++++ bar/ +cd+++++++++ bar/baz/ +cf bar/baz/rsync @@ -6573,16 +6557,16 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 8 failed" -@@ -150,11 +150,11 @@ rm -rf "$todir" - $RSYNC -iplrtH --copy-dest="$lddir" "$fromdir/" "$todir/" \ +@@ -151,11 +151,11 @@ rm -rf "$todir" + $RSYNC -iplrtH --copy-dest=../ld "$fromdir/" "$todir/" \ | tee "$outfile" cat <"$chkfile" --.d..t.... ./ +-cd+++++++ ./ -cd+++++++ bar/ -cd+++++++ bar/baz/ -cd+++++++ foo/ -hf foo/extra => foo/config1 -+.d..t...... ./ ++cd+++++++++ ./ +cd+++++++++ bar/ +cd+++++++++ bar/baz/ +cd+++++++++ foo/ @@ -6590,11 +6574,11 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 9 failed" -@@ -181,15 +181,15 @@ $RSYNC -ivvplrtH --link-dest="$lddir" "$ +@@ -182,15 +182,15 @@ $RSYNC -ivvplrtH --link-dest="$lddir" "$ | tee "$outfile" filter_outfile cat <"$chkfile" --.d..t.... ./ +-cd+++++++ ./ -cd+++++++ bar/ -cd+++++++ bar/baz/ -hf bar/baz/rsync @@ -6603,7 +6587,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. -hf foo/config2 -hf foo/extra => foo/config1 -hL foo/sym -> ../bar/baz/rsync -+.d..t...... ./ ++cd+++++++++ ./ +cd+++++++++ bar/ +cd+++++++++ bar/baz/ +hf bar/baz/rsync @@ -6615,26 +6599,41 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 11 failed" -@@ -197,10 +197,10 @@ rm -rf "$todir" - $RSYNC -iplrtH --link-dest="$lddir" "$fromdir/" "$todir/" \ +@@ -198,10 +198,10 @@ rm -rf "$todir" + $RSYNC -iplrtH --dry-run --link-dest=../ld "$fromdir/" "$todir/" \ | tee "$outfile" cat <"$chkfile" --.d..t.... ./ +-cd+++++++ ./ -cd+++++++ bar/ -cd+++++++ bar/baz/ -cd+++++++ foo/ -+.d..t...... ./ ++cd+++++++++ ./ +cd+++++++++ bar/ +cd+++++++++ bar/baz/ +cd+++++++++ foo/ EOT diff $diffopt "$chkfile" "$outfile" || test_fail "test 12 failed" -@@ -228,14 +228,14 @@ filter_outfile +@@ -209,10 +209,10 @@ rm -rf "$todir" + $RSYNC -iplrtH --link-dest=../ld "$fromdir/" "$todir/" \ + | tee "$outfile" + cat <"$chkfile" +-cd+++++++ ./ +-cd+++++++ bar/ +-cd+++++++ bar/baz/ +-cd+++++++ foo/ ++cd+++++++++ ./ ++cd+++++++++ bar/ ++cd+++++++++ bar/baz/ ++cd+++++++++ foo/ + EOT + diff $diffopt "$chkfile" "$outfile" || test_fail "test 13 failed" + +@@ -240,14 +240,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 <"$chkfile" --.d..t.... ./ +-cd+++++++ ./ -cd+++++++ bar/ -cd+++++++ bar/baz/ -.f bar/baz/rsync @@ -6642,7 +6641,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. -.f foo/config1 -.f foo/config2 -.L foo/sym -> ../bar/baz/rsync -+.d..t...... ./ ++cd+++++++++ ./ +cd+++++++++ bar/ +cd+++++++++ bar/baz/ +.f bar/baz/rsync @@ -6651,22 +6650,22 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +.f foo/config2 +.L foo/sym -> ../bar/baz/rsync EOT - diff $diffopt "$chkfile" "$outfile" || test_fail "test 14 failed" + diff $diffopt "$chkfile" "$outfile" || test_fail "test 15 failed" -@@ -243,10 +243,10 @@ rm -rf "$todir" +@@ -255,10 +255,10 @@ rm -rf "$todir" $RSYNC -iplrtH --compare-dest="$lddir" "$fromdir/" "$todir/" \ | tee "$outfile" cat <"$chkfile" --.d..t.... ./ +-cd+++++++ ./ -cd+++++++ bar/ -cd+++++++ bar/baz/ -cd+++++++ foo/ -+.d..t...... ./ ++cd+++++++++ ./ +cd+++++++++ bar/ +cd+++++++++ bar/baz/ +cd+++++++++ foo/ EOT - diff $diffopt "$chkfile" "$outfile" || test_fail "test 15 failed" + diff $diffopt "$chkfile" "$outfile" || test_fail "test 16 failed" --- old/uidlist.c +++ new/uidlist.c @@ -6733,7 +6732,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. for (i = 0; i < flist->count; i++) --- old/util.c +++ new/util.c -@@ -1548,3 +1548,31 @@ int bitbag_next_bit(struct bitbag *bb, i +@@ -1468,3 +1468,31 @@ int bitbag_next_bit(struct bitbag *bb, i return -1; }