X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c55fb5e1d639d72a16604c6e0153e19d04ef0d78..afccb3d3263b4867eb0a22cf29a3bb75f4cf0d71:/generator.c diff --git a/generator.c b/generator.c index df2434f5..e7c1ef7d 100644 --- a/generator.c +++ b/generator.c @@ -71,7 +71,6 @@ extern int io_error; extern int flist_eof; extern int allowed_lull; extern int sock_f_out; -extern int ignore_timeout; extern int protocol_version; extern int file_total; extern int fuzzy_basis; @@ -91,7 +90,6 @@ extern int max_delete; extern int force_delete; extern int one_file_system; extern int skipped_deletes; -extern struct stats stats; extern dev_t filesystem_dev; extern mode_t orig_umask; extern uid_t our_uid; @@ -291,7 +289,7 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev) rprintf(FINFO, "delete_in_dir(%s)\n", fbuf); if (allowed_lull) - maybe_send_keepalive(); + maybe_send_keepalive(time(NULL), MSK_ALLOW_FLUSH); if (io_error && !ignore_errors) { if (already_warned) @@ -392,7 +390,7 @@ static void do_delete_pass(void) int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp) { -#if !defined HAVE_LUTIMES || !defined HAVE_UTIMES +#ifndef CAN_SET_SYMLINK_TIMES if (S_ISLNK(file->mode)) { ; } else @@ -417,7 +415,7 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp) if (preserve_acls && !S_ISLNK(file->mode)) { if (!ACL_READY(*sxp)) get_acl(fname, sxp); - if (set_acl(NULL, file, sxp) == 0) + if (set_acl(NULL, file, sxp, file->mode)) return 0; } #endif @@ -440,7 +438,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre if (statret >= 0) { /* A from-dest-dir statret can == 1! */ int keep_time = !preserve_times ? 0 : S_ISDIR(file->mode) ? preserve_times > 1 : -#if defined HAVE_LUTIMES && defined HAVE_UTIMES +#ifdef CAN_SET_SYMLINK_TIMES 1; #else !S_ISLNK(file->mode); @@ -476,7 +474,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre if (preserve_acls && !S_ISLNK(file->mode)) { if (!ACL_READY(*sxp)) get_acl(fnamecmp, sxp); - if (set_acl(NULL, file, sxp) == 0) + if (set_acl(NULL, file, sxp, file->mode)) iflags |= ITEM_REPORT_ACL; } #endif @@ -516,7 +514,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre #endif } else if (ndx >= 0) { enum logcode code = logfile_format_has_i ? FINFO : FCLIENT; - log_item(code, file, &stats, iflags, xname); + log_item(code, file, iflags, xname); } } } @@ -874,12 +872,15 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx, char *cmpbuf, stat_x *sxp, int itemizing, enum logcode code) { - char lnk[MAXPATHLEN]; int best_match = -1; int match_level = 0; enum nonregtype type; uint32 *devp; - int len, j = 0; +#ifdef SUPPORT_LINKS + char lnk[MAXPATHLEN]; + int len; +#endif + int j = 0; #ifndef SUPPORT_LINKS if (S_ISLNK(file->mode)) @@ -919,11 +920,13 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx, if (!IS_DEVICE(sxp->st.st_mode)) continue; break; -#ifdef SUPPORT_LINKS case TYPE_SYMLINK: +#ifdef SUPPORT_LINKS if (!S_ISLNK(sxp->st.st_mode)) continue; break; +#else + return -1; #endif } if (match_level < 1) { @@ -939,14 +942,16 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx, if (sxp->st.st_rdev != MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp))) continue; break; -#ifdef SUPPORT_LINKS case TYPE_SYMLINK: - if ((len = readlink(cmpbuf, lnk, MAXPATHLEN-1)) <= 0) +#ifdef SUPPORT_LINKS + if ((len = do_readlink(cmpbuf, lnk, MAXPATHLEN-1)) <= 0) continue; lnk[len] = '\0'; if (strcmp(lnk, F_SYMLINK(file)) != 0) continue; break; +#else + return -1; #endif } if (match_level < 2) { @@ -1362,7 +1367,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, int len; if (S_ISLNK(sx.st.st_mode) - && (len = readlink(fname, lnk, MAXPATHLEN-1)) > 0 + && (len = do_readlink(fname, lnk, MAXPATHLEN-1)) > 0 && strncmp(lnk, sl, len) == 0 && sl[len] == '\0') { /* The link is pointing to the right place. */ set_file_attrs(fname, file, &sx, NULL, maybe_ATTRS_REPORT); @@ -1886,6 +1891,7 @@ static void touch_up_dirs(struct file_list *flist, int ndx) static int counter = 0; struct file_struct *file; char *fname; + BOOL fix_dir_perms; int i, start, end; if (ndx < 0) { @@ -1906,21 +1912,23 @@ static void touch_up_dirs(struct file_list *flist, int ndx) rprintf(FINFO, "touch_up_dirs: %s (%d)\n", NS(fname), i); } + /* Be sure not to retouch permissions with --fake-super. */ + fix_dir_perms = !am_root && !(file->mode & S_IWUSR); if (!F_IS_ACTIVE(file) || file->flags & FLAG_MISSING_DIR - || (!need_retouch_dir_times && file->mode & S_IWUSR)) + || !(need_retouch_dir_times || fix_dir_perms)) continue; fname = f_name(file, NULL); - if (!(file->mode & S_IWUSR)) + if (fix_dir_perms) do_chmod(fname, file->mode); if (need_retouch_dir_times) { STRUCT_STAT st; if (link_stat(fname, &st, 0) == 0 && cmp_time(st.st_mtime, file->modtime) != 0) - set_modtime(fname, file->modtime, file->mode); + set_modtime(fname, file->modtime, F_MOD_NSEC(file), file->mode); } if (counter >= loopchk_limit) { if (allowed_lull) - maybe_send_keepalive(); + maybe_send_keepalive(time(NULL), MSK_ALLOW_FLUSH); else maybe_flush_socket(0); counter = 0; @@ -2067,12 +2075,6 @@ void generate_files(int f_out, const char *local_name) : "enabled"); } - /* Since we often fill up the outgoing socket and then just sit around - * waiting for the other 2 processes to do their thing, we don't want - * to exit on a timeout. If the data stops flowing, the receiver will - * notice that and let us know via the redo pipe (or its closing). */ - ignore_timeout = 1; - dflt_perms = (ACCESSPERMS & ~orig_umask); do { @@ -2126,7 +2128,7 @@ void generate_files(int f_out, const char *local_name) if (i + cur_flist->ndx_start >= next_loopchk) { if (allowed_lull) - maybe_send_keepalive(); + maybe_send_keepalive(time(NULL), MSK_ALLOW_FLUSH); else maybe_flush_socket(0); next_loopchk += loopchk_limit;