X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/73273075c8416fdfcc2b984981e9b4fccc1320eb..e844be4e7bfb2c0d9ea583cb4d507217f14ffa4d:/receiver.c diff --git a/receiver.c b/receiver.c index f91f4a1b..85086f65 100644 --- a/receiver.c +++ b/receiver.c @@ -21,6 +21,8 @@ #include "rsync.h" extern int verbose; +extern int log_before_transfer; +extern int itemize_changes; extern int delete_after; extern int csum_length; extern struct stats stats; @@ -48,6 +50,7 @@ extern int keep_partial; extern int checksum_seed; extern int inplace; extern int delay_updates; +extern char *log_format; extern struct filter_list_struct server_filter_list; @@ -303,6 +306,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, int next_gen_i = -1; int fd1,fd2; STRUCT_STAT st; + int iflags; char *fname, fbuf[MAXPATHLEN]; char template[MAXPATHLEN]; char fnametmp[MAXPATHLEN]; @@ -365,8 +369,24 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, } file = flist->files[i]; - if (S_ISDIR(file->mode)) { - rprintf(FERROR, "[%s] got index of directory: %d\n", + + if (protocol_version >= 29) { + iflags = read_short(f_in); + if (!(iflags & ITEM_UPDATING) || !S_ISREG(file->mode)) { + if (am_server) + ; /* do nothing */ + else if (itemize_changes + || iflags & ITEM_UPDATING + || (S_ISDIR(file->mode) + && iflags & ITEM_REPORT_TIME)) + log_recv(file, &stats, iflags); + continue; + } + } else + iflags = ITEM_UPDATING | ITEM_MISSING_DATA; + + if (!S_ISREG(file->mode)) { + rprintf(FERROR, "[%s] got index of non-regular file: %d\n", who_am_i(), i); exit_cleanup(RERR_PROTOCOL); } @@ -387,14 +407,12 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, if (verbose > 2) rprintf(FINFO, "recv_files(%s)\n", safe_fname(fname)); - if (dry_run) { - if (!am_server && verbose) /* log the transfer */ - rprintf(FINFO, "%s\n", safe_fname(fname)); + if (dry_run) { /* log the transfer */ + if (!am_server && log_format) + log_recv(file, &stats, iflags); continue; } - initial_stats = stats; - if (read_batch) { while (i > next_gen_i) { if (f_in_name >= 0 && next_gen_i >= 0) @@ -445,6 +463,8 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, } else fnamecmp = fname; + initial_stats = stats; + /* open the file */ fd1 = do_open(fnamecmp, O_RDONLY, 0); @@ -531,14 +551,18 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, cleanup_set(fnametmp, partialptr, file, fd1, fd2); } - if (!am_server && verbose) /* log the transfer */ + /* log the transfer */ + if (log_before_transfer) + log_recv(file, &initial_stats, iflags); + else if (!am_server && verbose && do_progress) rprintf(FINFO, "%s\n", safe_fname(fname)); /* recv file data */ recv_ok = receive_data(f_in, fnamecmp, fd1, st.st_size, fname, fd2, file->length); - log_recv(file, &initial_stats); + if (!log_before_transfer) + log_recv(file, &initial_stats, iflags); if (fd1 != -1) close(fd1);