X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b293a7f62c8954050712534947e6567b18568691..7d059d4c37e8b21260b8a76db4e1d4c3e08b9aa5:/flist.c diff --git a/flist.c b/flist.c index 0b600acf..c46098fc 100644 --- a/flist.c +++ b/flist.c @@ -34,6 +34,7 @@ extern int do_progress; extern int am_root; extern int am_server; extern int am_daemon; +extern int am_sender; extern int always_checksum; extern int module_id; extern int ignore_errors; @@ -64,9 +65,6 @@ extern int delete_excluded; extern int orig_umask; extern int list_only; -extern int read_batch; -extern int write_batch; - extern struct exclude_list_struct exclude_list; extern struct exclude_list_struct server_exclude_list; extern struct exclude_list_struct local_exclude_list; @@ -534,7 +532,7 @@ void receive_file_entry(struct file_struct **fptr, unsigned short flags, static uid_t uid; static gid_t gid; static char lastname[MAXPATHLEN], *lastdir; - static int lastdir_len = -1; + static int lastdir_depth, lastdir_len = -1; char thisname[MAXPATHLEN]; unsigned int l1 = 0, l2 = 0; int alloc_len, basename_len, dirname_len, linkname_len, sum_len; @@ -573,10 +571,10 @@ void receive_file_entry(struct file_struct **fptr, unsigned short flags, strlcpy(lastname, thisname, MAXPATHLEN); - clean_fname(thisname); + clean_fname(thisname, 0); if (sanitize_paths) - sanitize_path(thisname, NULL); + sanitize_path(thisname, thisname, "", 0); if ((basename = strrchr(thisname, '/')) != NULL) { dirname_len = ++basename - thisname; /* counts future '\0' */ @@ -659,6 +657,8 @@ void receive_file_entry(struct file_struct **fptr, unsigned short flags, memcpy(bp, dirname, dirname_len - 1); bp += dirname_len; bp[-1] = '\0'; + if (sanitize_paths) + lastdir_depth = count_dir_elements(lastdir); } else if (dirname) file->dirname = dirname; @@ -674,7 +674,7 @@ void receive_file_entry(struct file_struct **fptr, unsigned short flags, file->u.link = bp; read_sbuf(f, bp, linkname_len - 1); if (sanitize_paths) - sanitize_path(bp, lastdir); + sanitize_path(bp, bp, "", lastdir_depth); bp += linkname_len; } #endif @@ -762,9 +762,9 @@ struct file_struct *make_file(char *fname, struct file_list *flist, rprintf(FINFO, "skipping overly long name: %s\n", fname); return NULL; } - clean_fname(thisname); + clean_fname(thisname, 0); if (sanitize_paths) - sanitize_path(thisname, NULL); + sanitize_path(thisname, thisname, "", 0); memset(sum, 0, SUM_LENGTH); @@ -950,9 +950,6 @@ void send_file_name(int f, struct file_list *flist, char *fname, flist_expand(flist); - if (write_batch) - file->flags |= FLAG_TOP_DIR; - if (file->basename[0]) { flist->files[flist->count++] = file; send_file_entry(file, f, base_flags); @@ -1065,7 +1062,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) "send_file_list"); if (f != -1) { - io_start_buffering_out(f); + io_start_buffering_out(); if (filesfrom_fd >= 0) { if (argv[0] && !push_dir(argv[0])) { rsyserr(FERROR, errno, "push_dir %s failed", @@ -1083,13 +1080,13 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) if (use_ff_fd) { if (read_filesfrom_line(filesfrom_fd, fname) == 0) break; - sanitize_path(fname, NULL); + sanitize_path(fname, fname, "", 0); } else { if (argc-- == 0) break; strlcpy(fname, *argv++, MAXPATHLEN); if (sanitize_paths) - sanitize_path(fname, NULL); + sanitize_path(fname, fname, "", 0); } l = strlen(fname); @@ -1231,8 +1228,6 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) io_end_buffering(); stats.flist_size = stats.total_written - start_write; stats.num_files = flist->count; - if (write_batch) - write_batch_flist_info(flist->count, flist->files); } if (verbose > 3) @@ -1301,13 +1296,11 @@ struct file_list *recv_file_list(int f) * protocol version 15 */ recv_uid_list(f, flist); - if (!read_batch) { - /* Recv the io_error flag */ - if (lp_ignore_errors(module_id) || ignore_errors) - read_int(f); - else - io_error |= read_int(f); - } + /* Recv the io_error flag */ + if (lp_ignore_errors(module_id) || ignore_errors) + read_int(f); + else + io_error |= read_int(f); } if (verbose > 3) @@ -1495,7 +1488,7 @@ static void output_flist(struct file_list *flist) for (i = 0; i < flist->count; i++) { file = flist->files[i]; - if (am_root && preserve_uid) + if ((am_root || am_sender) && preserve_uid) sprintf(uidbuf, " uid=%ld", (long)file->uid); else *uidbuf = '\0';