X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/af7eb67accc33f120054901cc7608bf4666c0c54..88f7513df3fca996d2669285ddb48a362a9a9825:/acls.diff diff --git a/acls.diff b/acls.diff index d9e1fef..d8b5419 100644 --- a/acls.diff +++ b/acls.diff @@ -30,7 +30,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. popt_OBJS=popt/findme.o popt/popt.o popt/poptconfig.o \ --- old/acls.c +++ new/acls.c -@@ -0,0 +1,1099 @@ +@@ -0,0 +1,1093 @@ +/* + * Handle passing Access Control Lists between systems. + * @@ -160,9 +160,6 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +{ + racl->user_obj = (mode >> 6) & 7; + racl->group_obj = (mode >> 3) & 7; -+#ifdef ACLS_NEED_MASK -+ racl->mask = (mode >> 3) & 7; -+#endif + racl->other = mode & 7; +} + @@ -185,19 +182,19 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + +static BOOL rsync_acl_equal(const rsync_acl *racl1, const rsync_acl *racl2) +{ -+ return (racl1->user_obj == racl2->user_obj -+ && racl1->group_obj == racl2->group_obj -+ && racl1->mask == racl2->mask -+ && racl1->other == racl2->other -+ && ida_entries_equal(&racl1->users, &racl2->users) -+ && ida_entries_equal(&racl1->groups, &racl2->groups)); ++ return racl1->user_obj == racl2->user_obj ++ && racl1->group_obj == racl2->group_obj ++ && racl1->mask == racl2->mask ++ && racl1->other == racl2->other ++ && ida_entries_equal(&racl1->users, &racl2->users) ++ && ida_entries_equal(&racl1->groups, &racl2->groups); +} + +/* Are the extended (non-permission-bit) entries equal? If so, the rest of + * the ACL will be handled by the normal mode-preservation code. This is + * only meaningful for access ACLs! Note: the 1st arg is a fully-populated + * rsync_acl, but the 2nd parameter can be a condensed rsync_acl, which means -+ * that it might have several of its perm objects set to NO_ENTRY. */ ++ * that it might have several of its permission objects set to NO_ENTRY. */ +static BOOL rsync_acl_equal_enough(const rsync_acl *racl1, + const rsync_acl *racl2, mode_t m) +{ @@ -289,7 +286,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + +/* === System ACLs === */ + -+/* Unpack system acl -> rsync acl verbatim. Return whether we succeeded. */ ++/* Unpack system ACL -> rsync ACL verbatim. Return whether we succeeded. */ +static BOOL unpack_smb_acl(rsync_acl *racl, SMB_ACL_T sacl) +{ + static item_list temp_ida_list = EMPTY_ITEM_LIST; @@ -380,7 +377,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + sort_ida_entries(&racl->groups); + +#ifdef ACLS_NEED_MASK -+ if (!racl->users.count && !racl->groups.count) { ++ if (!racl->users.count && !racl->groups.count && racl->mask != NO_ENTRY) { + /* Throw away a superfluous mask, but mask off the + * group perms with it first. */ + racl->group_obj &= racl->mask; @@ -427,7 +424,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + return -1; +} + -+/* Pack rsync acl -> system acl verbatim. Return whether we succeeded. */ ++/* Pack rsync ACL -> system ACL verbatim. Return whether we succeeded. */ +static BOOL pack_smb_acl(SMB_ACL_T *smb_acl, const rsync_acl *racl) +{ +#ifdef ACLS_NEED_MASK @@ -522,7 +519,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + return *match; +} + -+/* Return the ACL(s) for the given filename. */ ++/* Return the Access Control List for the given filename. */ +int get_acl(const char *fname, statx *sxp) +{ + SMB_ACL_TYPE_T type; @@ -570,7 +567,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + +/* The general strategy with the tag_type <-> character mapping is that + * lowercase implies that no qualifier follows, where uppercase does. -+ * A similar idiom for the acl type (access or default) itself, but ++ * A similar idiom for the ACL type (access or default) itself, but + * lowercase in this instance means there's no ACL following, so the + * ACL is a repeat, so the receiver should reuse the last of the same + * type ACL. */ @@ -594,7 +591,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + } +} + -+/* Send an rsync acl over the file descriptor. */ ++/* Send an rsync ACL over the file descriptor. */ +static void send_rsync_acl(int f, const rsync_acl *racl) +{ + size_t count = count_racl_entries(racl); @@ -647,9 +644,6 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + sxp->def_acl = racl; + } + -+ /* Discard a superfluous mask. */ -+ if (racl->mask != NO_ENTRY && !racl->users.count && !racl->groups.count) -+ racl->mask = NO_ENTRY; + /* Avoid sending values that can be inferred from other data, + * but only when preserve_acls == 1 (it is 2 when we must be + * backward compatible with older acls.diff versions). */ @@ -868,7 +862,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + + if (S_ISDIR(mode)) { + /* If the sticky bit is going on, it's not safe to allow all -+ * the new ACLs to go into effect before it gets set. */ ++ * the new ACL to go into effect before it gets set. */ +#ifdef SMB_ACL_LOSES_SPECIAL_MODE_BITS + if (mode & S_ISVTX) + mode &= ~0077; @@ -877,7 +871,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + mode &= ~0077; + } else { + /* If setuid or setgid is going off, it's not safe to allow all -+ * the new ACLs to go into effect before they get cleared. */ ++ * the new ACL to go into effect before they get cleared. */ + if ((old_mode & S_ISUID && !(mode & S_ISUID)) + || (old_mode & S_ISGID && !(mode & S_ISGID))) + mode &= ~0077; @@ -938,12 +932,12 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + +/* Set ACL on indicated filename. + * -+ * This sets extended access ACL entries and default ACLs. If convenient, -+ * it sets permission bits along with the access ACLs and signals having ++ * This sets extended access ACL entries and default ACL. If convenient, ++ * it sets permission bits along with the access ACL and signals having + * done so by modifying sxp->st.st_mode. + * + * Returns 1 for unchanged, 0 for changed, -1 for failed. Call this -+ * with fname set to NULL to just check if the ACLs are unchanged. */ ++ * with fname set to NULL to just check if the ACL is unchanged. */ +int set_acl(const char *fname, const struct file_struct *file, statx *sxp) +{ + int unchanged = 1; @@ -1030,7 +1024,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +static int enum_ida_index = 0; +static size_t enum_racl_index = 0; + -+/* This returns the next tag_type id from the given acl for the next entry, ++/* This returns the next tag_type id from the given ACL for the next entry, + * or it returns 0 if there are no more tag_type ids in the acl. */ +static id_t *next_ace_id(SMB_ACL_TAG_T tag_type, const rsync_acl *racl) +{ @@ -1334,7 +1328,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. #ifdef SUPPORT_LINKS if (preserve_links && S_ISLNK(f->mode)) { rprintf(FINFO, "%s %11.0f %s %s -> %s\n", -@@ -499,6 +502,9 @@ static struct file_struct *receive_file_ +@@ -491,6 +494,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; @@ -1344,7 +1338,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. OFF_T file_length; char *basename, *dirname, *bp; struct file_struct *file; -@@ -602,13 +608,27 @@ static struct file_struct *receive_file_ +@@ -594,13 +600,27 @@ static struct file_struct *receive_file_ sum_len = always_checksum && S_ISREG(mode) ? MD4_SUM_LENGTH : 0; @@ -1372,7 +1366,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. file->modtime = modtime; file->length = file_length; -@@ -701,6 +721,11 @@ static struct file_struct *receive_file_ +@@ -693,6 +713,11 @@ static struct file_struct *receive_file_ read_buf(f, sum, checksum_len); } @@ -1384,7 +1378,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. return file; } -@@ -950,6 +975,9 @@ static struct file_struct *send_file_nam +@@ -942,6 +967,9 @@ static struct file_struct *send_file_nam unsigned short flags) { struct file_struct *file; @@ -1394,7 +1388,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. file = make_file(fname, flist, stp, flags, f == -2 ? SERVER_FILTERS : ALL_FILTERS); -@@ -959,6 +987,15 @@ static struct file_struct *send_file_nam +@@ -951,6 +979,15 @@ static struct file_struct *send_file_nam if (chmod_modes && !S_ISLNK(file->mode)) file->mode = tweak_mode(file->mode, chmod_modes); @@ -1410,7 +1404,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. maybe_emit_filelist_progress(flist->count + flist_count_offset); flist_expand(flist); -@@ -966,6 +1003,15 @@ static struct file_struct *send_file_nam +@@ -958,6 +995,15 @@ static struct file_struct *send_file_nam if (file->basename[0]) { flist->files[flist->count++] = file; send_file_entry(file, f); @@ -1436,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; -@@ -87,6 +88,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; @@ -1444,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; -@@ -319,22 +321,27 @@ static void do_delete_pass(struct file_l +@@ -317,22 +319,27 @@ static void do_delete_pass(struct file_l rprintf(FINFO, " \r"); } @@ -1477,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! */ -@@ -342,19 +349,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); @@ -1506,7 +1500,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } else iflags |= ITEM_IS_NEW; -@@ -605,7 +616,7 @@ void check_for_finished_hlinks(int itemi +@@ -603,7 +614,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, @@ -1515,7 +1509,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. int maybe_ATTRS_REPORT, enum logcode code) { int save_ignore_times = ignore_times; -@@ -620,7 +631,7 @@ static int try_dests_reg(struct file_str +@@ -617,7 +628,7 @@ static int try_dests_reg(struct file_str do { pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname); @@ -1524,7 +1518,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. continue; switch (match_level) { case 0: -@@ -628,16 +639,20 @@ static int try_dests_reg(struct file_str +@@ -625,16 +636,20 @@ static int try_dests_reg(struct file_str match_level = 1; /* FALL THROUGH */ case 1: @@ -1542,13 +1536,13 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +#endif + if (!unchanged_attrs(file, sxp)) continue; - if (always_checksum + if (always_checksum && preserve_times - && cmp_time(stp->st_mtime, file->modtime)) + && cmp_time(sxp->st.st_mtime, file->modtime)) continue; best_match = j; match_level = 3; -@@ -655,22 +670,27 @@ static int try_dests_reg(struct file_str +@@ -651,14 +666,14 @@ static int try_dests_reg(struct file_str if (j != best_match) { j = best_match; pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname); @@ -1557,20 +1551,21 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. match_level = 0; } - #ifdef HAVE_LINK if (match_level == 3 && !copy_dest) { + #ifdef SUPPORT_HARD_LINKS if (link_dest) { - if (hard_link_one(file, ndx, fname, 0, stp, + if (hard_link_one(file, ndx, fname, 0, sxp, cmpbuf, 1, itemizing && verbose > 1, code) < 0) - goto try_a_copy; - if (preserve_hard_links && file->link_u.links) +@@ -667,8 +682,13 @@ static int try_dests_reg(struct file_str hard_link_cluster(file, ndx, itemizing, code); -- } else if (itemizing) + } else + #endif +- if (itemizing) - itemize(file, ndx, 0, stp, 0, 0, NULL); -+ } else if (itemizing) { ++ if (itemizing) { +#ifdef SUPPORT_ACLS + if (preserve_acls && !ACL_READY(*sxp)) + get_acl(fname, sxp); @@ -1578,9 +1573,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. + itemize(file, ndx, 0, sxp, 0, 0, NULL); + } if (verbose > 1 && maybe_ATTRS_REPORT) { - code = daemon_log_format_has_i || dry_run + code = logfile_format_has_i || dry_run ? FCLIENT : FINFO; -@@ -689,8 +709,13 @@ static int try_dests_reg(struct file_str +@@ -686,8 +706,13 @@ static int try_dests_reg(struct file_str } return -1; } @@ -1596,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) -@@ -715,13 +740,18 @@ static int try_dests_non(struct file_str +@@ -712,13 +737,18 @@ static int try_dests_non(struct file_str enum logcode code) { char fnamebuf[MAXPATHLEN]; @@ -1618,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 -@@ -734,10 +764,10 @@ static int try_dests_non(struct file_str +@@ -731,10 +761,10 @@ static int try_dests_non(struct file_str #endif continue; } else if (IS_SPECIAL(file->mode)) { @@ -1631,7 +1626,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. continue; } else { rprintf(FERROR, -@@ -766,7 +796,15 @@ static int try_dests_non(struct file_str +@@ -765,7 +795,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; @@ -1647,8 +1642,8 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +#endif } if (verbose > 1 && maybe_ATTRS_REPORT) { - code = daemon_log_format_has_i || dry_run -@@ -780,6 +818,7 @@ static int try_dests_non(struct file_str + code = logfile_format_has_i || dry_run +@@ -779,6 +817,7 @@ static int try_dests_non(struct file_str } static int phase = 0; @@ -1656,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 -@@ -801,7 +840,8 @@ static void recv_generator(char *fname, +@@ -800,7 +839,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; @@ -1666,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, +@@ -851,6 +891,9 @@ static void recv_generator(char *fname, dry_run--; missing_below = -1; } @@ -1676,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, +@@ -858,7 +901,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 -- && do_stat(dn, &st) < 0 -+ && do_stat(dn, &sx.st) < 0 +- && safe_stat(dn, &st) < 0 ++ && safe_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, +@@ -870,6 +913,10 @@ static void recv_generator(char *fname, } if (fuzzy_basis) need_fuzzy_dirlist = 1; @@ -1696,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, +@@ -878,7 +925,7 @@ static void recv_generator(char *fname, need_fuzzy_dirlist = 0; } @@ -1705,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, +@@ -896,8 +943,9 @@ static void recv_generator(char *fname, * mode based on the local permissions and some heuristics. */ if (!preserve_perms) { int exists = statret == 0 @@ -1717,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, +@@ -906,8 +954,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. */ @@ -1728,7 +1723,7 @@ 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, +@@ -916,7 +964,11 @@ static void recv_generator(char *fname, dry_run++; } if (itemizing && f_out != -1) { @@ -1741,7 +1736,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL); } if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) { -@@ -929,19 +981,19 @@ static void recv_generator(char *fname, +@@ -928,19 +980,19 @@ static void recv_generator(char *fname, full_fname(fname)); } } @@ -1766,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 -@@ -963,7 +1015,7 @@ static void recv_generator(char *fname, +@@ -958,7 +1010,7 @@ static void recv_generator(char *fname, char lnk[MAXPATHLEN]; int len; @@ -1775,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 -@@ -971,10 +1023,10 @@ static void recv_generator(char *fname, +@@ -966,10 +1018,10 @@ static void recv_generator(char *fname, * required. */ if (strcmp(lnk, file->u.link) == 0) { if (itemizing) { @@ -1788,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) { -@@ -987,9 +1039,9 @@ static void recv_generator(char *fname, +@@ -982,9 +1034,9 @@ static void recv_generator(char *fname, } /* Not the right symlink (or not a symlink), so * delete it. */ @@ -1800,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, -@@ -1005,7 +1057,7 @@ static void recv_generator(char *fname, +@@ -1000,7 +1052,7 @@ static void recv_generator(char *fname, } } if (preserve_hard_links && file->link_u.links @@ -1809,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) { -@@ -1014,7 +1066,7 @@ static void recv_generator(char *fname, +@@ -1009,7 +1061,7 @@ static void recv_generator(char *fname, } else { set_file_attrs(fname, file, NULL, 0); if (itemizing) { @@ -1818,7 +1813,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. ITEM_LOCAL_CHANGE, 0, NULL); } if (code && verbose) { -@@ -1048,18 +1100,22 @@ static void recv_generator(char *fname, +@@ -1043,18 +1095,22 @@ static void recv_generator(char *fname, itemizing = code = 0; } } @@ -1849,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", -@@ -1072,7 +1128,7 @@ static void recv_generator(char *fname, +@@ -1067,7 +1123,7 @@ static void recv_generator(char *fname, } else { set_file_attrs(fname, file, NULL, 0); if (itemizing) { @@ -1858,7 +1853,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. ITEM_LOCAL_CHANGE, 0, NULL); } if (code && verbose) -@@ -1084,12 +1140,12 @@ static void recv_generator(char *fname, +@@ -1079,12 +1135,12 @@ static void recv_generator(char *fname, } } else { if (itemizing) @@ -1874,7 +1869,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if (!S_ISREG(file->mode)) { -@@ -1123,7 +1179,7 @@ static void recv_generator(char *fname, +@@ -1118,7 +1174,7 @@ static void recv_generator(char *fname, } if (update_only && statret == 0 @@ -1883,7 +1878,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; -@@ -1132,18 +1188,18 @@ static void recv_generator(char *fname, +@@ -1127,18 +1183,18 @@ static void recv_generator(char *fname, fnamecmp = fname; fnamecmp_type = FNAMECMP_FNAME; @@ -1906,7 +1901,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (j != -1) { fnamecmp = fnamecmpbuf; fnamecmp_type = j; -@@ -1152,7 +1208,7 @@ static void recv_generator(char *fname, +@@ -1147,7 +1203,7 @@ static void recv_generator(char *fname, } real_ret = statret; @@ -1915,7 +1910,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 -@@ -1171,7 +1227,7 @@ static void recv_generator(char *fname, +@@ -1166,7 +1222,7 @@ static void recv_generator(char *fname, rprintf(FINFO, "fuzzy basis selected for %s: %s\n", fname, fnamecmpbuf); } @@ -1924,7 +1919,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. statret = 0; fnamecmp = fnamecmpbuf; fnamecmp_type = FNAMECMP_FUZZY; -@@ -1180,7 +1236,7 @@ static void recv_generator(char *fname, +@@ -1175,7 +1231,7 @@ static void recv_generator(char *fname, if (statret != 0) { if (preserve_hard_links && file->link_u.links @@ -1933,7 +1928,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. itemizing, code, HL_SKIP)) return; if (stat_errno == ENOENT) -@@ -1190,31 +1246,44 @@ static void recv_generator(char *fname, +@@ -1185,31 +1241,44 @@ static void recv_generator(char *fname, return; } @@ -1984,7 +1979,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. fnamecmp = partialptr; fnamecmp_type = FNAMECMP_PARTIAL_DIR; statret = 0; -@@ -1238,17 +1307,21 @@ static void recv_generator(char *fname, +@@ -1233,17 +1302,21 @@ static void recv_generator(char *fname, pretend_missing: /* pretend the file didn't exist */ if (preserve_hard_links && file->link_u.links @@ -2009,7 +2004,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); -@@ -1259,7 +1332,7 @@ static void recv_generator(char *fname, +@@ -1254,7 +1327,7 @@ static void recv_generator(char *fname, full_fname(backupptr)); free(back_file); close(fd); @@ -2018,7 +2013,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) { -@@ -1267,14 +1340,14 @@ static void recv_generator(char *fname, +@@ -1262,14 +1335,14 @@ static void recv_generator(char *fname, full_fname(backupptr)); free(back_file); close(fd); @@ -2035,7 +2030,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. } if (verbose > 2) -@@ -1292,24 +1365,32 @@ static void recv_generator(char *fname, +@@ -1287,24 +1360,32 @@ static void recv_generator(char *fname, iflags |= ITEM_BASIS_TYPE_FOLLOWS; if (fnamecmp_type == FNAMECMP_FUZZY) iflags |= ITEM_XNAME_FOLLOWS; @@ -2073,7 +2068,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (f_copy >= 0) { close(f_copy); -@@ -1322,6 +1403,13 @@ static void recv_generator(char *fname, +@@ -1317,6 +1398,13 @@ static void recv_generator(char *fname, } close(fd); @@ -2087,7 +2082,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) -@@ -1381,6 +1469,8 @@ void generate_files(int f_out, struct fi +@@ -1376,6 +1464,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; @@ -5510,7 +5505,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 -@@ -603,8 +603,10 @@ static void log_formatted(enum logcode c +@@ -592,8 +592,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'; @@ -5544,7 +5539,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. int preserve_perms = 0; int preserve_executability = 0; int preserve_devices = 0; -@@ -194,6 +195,7 @@ static void print_rsync_version(enum log +@@ -198,6 +199,7 @@ static void print_rsync_version(enum log char const *got_socketpair = "no "; char const *have_inplace = "no "; char const *hardlinks = "no "; @@ -5552,7 +5547,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. char const *links = "no "; char const *ipv6 = "no "; STRUCT_STAT *dumstat; -@@ -210,6 +212,10 @@ static void print_rsync_version(enum log +@@ -214,6 +216,10 @@ static void print_rsync_version(enum log hardlinks = ""; #endif @@ -5563,7 +5558,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. #ifdef SUPPORT_LINKS links = ""; #endif -@@ -223,9 +229,9 @@ static void print_rsync_version(enum log +@@ -227,9 +233,9 @@ static void print_rsync_version(enum log rprintf(f, "Copyright (C) 1996-2006 by Andrew Tridgell, Wayne Davison, and others.\n"); rprintf(f, "\n"); rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, " @@ -5575,7 +5570,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. /* Note that this field may not have type ino_t. It depends * on the complicated interaction between largefile feature -@@ -295,6 +301,9 @@ void usage(enum logcode F) +@@ -299,6 +305,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"); @@ -5585,7 +5580,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. 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"); -@@ -410,6 +419,9 @@ static struct poptOption long_options[] +@@ -415,6 +424,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 }, @@ -5595,7 +5590,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 }, -@@ -1070,6 +1082,24 @@ int parse_arguments(int *argc, const cha +@@ -1080,6 +1092,24 @@ int parse_arguments(int *argc, const cha usage(FINFO); exit_cleanup(0); @@ -5620,7 +5615,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. */ -@@ -1504,6 +1534,10 @@ void server_options(char **args,int *arg +@@ -1526,6 +1556,10 @@ void server_options(char **args,int *arg if (preserve_hard_links) argstr[x++] = 'H'; @@ -5633,7 +5628,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. if (preserve_gid) --- old/receiver.c +++ new/receiver.c -@@ -48,6 +48,7 @@ extern int keep_partial; +@@ -47,6 +47,7 @@ extern int keep_partial; extern int checksum_seed; extern int inplace; extern int delay_updates; @@ -5641,9 +5636,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. extern struct stats stats; extern char *log_format; extern char *tmpdir; -@@ -346,6 +347,10 @@ int recv_files(int f_in, struct file_lis - int itemizing = am_daemon ? daemon_log_format_has_i - : !am_server && log_format_has_i; +@@ -344,6 +345,10 @@ int recv_files(int f_in, struct file_lis + int save_make_backups = make_backups; + int itemizing = am_server ? logfile_format_has_i : log_format_has_i; int max_phase = protocol_version >= 29 ? 2 : 1; + int dflt_perms = (ACCESSPERMS & ~orig_umask); +#ifdef SUPPORT_ACLS @@ -5652,7 +5647,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 +@@ -541,7 +546,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; @@ -5675,7 +5670,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. @@ -33,6 +33,7 @@ extern int verbose; extern int dry_run; - extern int daemon_log_format_has_i; + extern int logfile_format_has_i; +extern int preserve_acls; extern int preserve_perms; extern int preserve_executability; @@ -5849,7 +5844,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. --- old/rsync.h +++ new/rsync.h -@@ -485,6 +485,15 @@ struct idev { +@@ -486,6 +486,15 @@ struct idev { #define IN_LOOPBACKNET 127 #endif @@ -5865,7 +5860,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 -@@ -645,6 +654,17 @@ struct stats { +@@ -646,6 +655,17 @@ struct stats { struct chmod_mode_struct; @@ -5883,7 +5878,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. #include "byteorder.h" #include "lib/mdfour.h" #include "lib/wildmatch.h" -@@ -660,6 +680,16 @@ struct chmod_mode_struct; +@@ -661,6 +681,16 @@ struct chmod_mode_struct; #define UNUSED(x) x __attribute__((__unused__)) @@ -5910,7 +5905,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. --chmod=CHMOD change destination permissions -o, --owner preserve owner (super-user only) -g, --group preserve group -@@ -742,7 +743,9 @@ quote(itemize( +@@ -744,7 +745,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 @@ -5921,7 +5916,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. )) -@@ -773,9 +776,11 @@ The preservation of the destination's se +@@ -775,9 +778,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 @@ -5936,7 +5931,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 -@@ -793,6 +798,15 @@ quote(itemize( +@@ -795,6 +800,15 @@ quote(itemize( If bf(--perms) is enabled, this option is ignored. @@ -5952,7 +5947,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 -@@ -1372,8 +1386,8 @@ if the receiving rsync is at least versi +@@ -1376,8 +1390,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). @@ -5963,7 +5958,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. -@@ -1422,7 +1436,11 @@ quote(itemize( +@@ -1426,7 +1440,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). @@ -6262,7 +6257,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync. +#endif /* _SMB_ACLS_H */ --- old/t_stub.c +++ new/t_stub.c -@@ -78,3 +78,7 @@ struct filter_list_struct server_filter_ +@@ -79,3 +79,7 @@ struct filter_list_struct server_filter_ return NULL; } @@ -6706,7 +6701,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 -@@ -1446,3 +1446,31 @@ int bitbag_next_bit(struct bitbag *bb, i +@@ -1555,3 +1555,31 @@ int bitbag_next_bit(struct bitbag *bb, i return -1; }