X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/3e7934a5fb06dac717722c4d680d0c063dbf8d5f..ef20efcbb69274e423321d7ac27bfe868bca65aa:/receiver.c diff --git a/receiver.c b/receiver.c index 1779d175..b0a9ebd5 100644 --- a/receiver.c +++ b/receiver.c @@ -28,7 +28,6 @@ extern int do_progress; extern int log_before_transfer; extern int log_format_has_i; extern int daemon_log_format_has_i; -extern int delete_after; extern int csum_length; extern int read_batch; extern int batch_gen_fd; @@ -57,28 +56,6 @@ extern char *basis_dir[]; extern struct filter_list_struct server_filter_list; - -/* This deletes any files on the receiving side that are not present on the - * sending side. This is used by --delete-before and --delete-after. */ -void delete_files(struct file_list *flist) -{ - char fbuf[MAXPATHLEN]; - int j; - - for (j = 0; j < flist->count; j++) { - struct file_struct *file = flist->files[j]; - - if (!(file->flags & FLAG_DEL_HERE)) - continue; - - f_name_to(file, fbuf); - if (verbose > 1 && file->flags & FLAG_TOP_DIR) - rprintf(FINFO, "deleting in %s\n", safe_fname(fbuf)); - - delete_in_dir(flist, fbuf, file); - } -} - #define SLOT_SIZE (16*1024) /* Desired size in bytes */ #define PER_SLOT_BITS (SLOT_SIZE * 8) /* Number of bits per slot */ #define PER_SLOT_INTS (SLOT_SIZE / 4) /* Number of int32s per slot */ @@ -329,17 +306,6 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, static void read_gen_name(int fd, char *dirname, char *buf) { int dlen; - int len = read_byte(fd); - - if (len & 0x80) { -#if MAXPATHLEN > 32767 - uchar lenbuf[2]; - read_buf(fd, (char *)lenbuf, 2); - len = (len & ~0x80) * 0x10000 + lenbuf[0] * 0x100 + lenbuf[1]; -#else - len = (len & ~0x80) * 0x100 + read_byte(fd); -#endif - } if (dirname) { dlen = strlcpy(buf, dirname, MAXPATHLEN); @@ -347,12 +313,7 @@ static void read_gen_name(int fd, char *dirname, char *buf) } else dlen = 0; - if (dlen + len >= MAXPATHLEN) { - rprintf(FERROR, "bogus data on generator name pipe\n"); - exit_cleanup(RERR_PROTOCOL); - } - - read_sbuf(fd, buf + dlen, len); + read_vstring(fd, buf + dlen, MAXPATHLEN - dlen); } @@ -425,11 +386,9 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, continue; } - if (i < 0 || i >= flist->count) { - rprintf(FERROR,"Invalid file index %d in recv_files (count=%d)\n", - i, flist->count); - exit_cleanup(RERR_PROTOCOL); - } + iflags = read_iflags(f_in, -1, i, fnametmp); + if (iflags == ITEM_IS_NEW) /* no-op packet */ + continue; file = flist->files[i]; fname = local_name ? local_name : f_name_to(file, fbuf); @@ -437,26 +396,9 @@ 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 (protocol_version >= 29) { - iflags = read_shortint(f_in); - if (!(iflags & ITEM_UPDATING) || !S_ISREG(file->mode)) { - int see_item = itemizing && (iflags || verbose > 1); - if (am_server) { - if (am_daemon && !dry_run && see_item) - log_recv(file, &stats, iflags); - } else if (see_item || 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); + if (!(iflags & ITEM_TRANSFER)) { + maybe_log_item(file, iflags, itemizing, fnametmp); + continue; } stats.current_file_index = i; @@ -472,7 +414,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, if (dry_run) { /* log the transfer */ if (!am_server && log_format) - log_recv(file, &stats, iflags); + log_item(file, &stats, iflags, NULL); continue; } @@ -616,7 +558,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, /* log the transfer */ if (log_before_transfer) - log_recv(file, &initial_stats, iflags); + log_item(file, &initial_stats, iflags, NULL); else if (!am_server && verbose && do_progress) rprintf(FINFO, "%s\n", safe_fname(fname)); @@ -625,7 +567,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, fname, fd2, file->length); if (!log_before_transfer) - log_recv(file, &initial_stats, iflags); + log_item(file, &initial_stats, iflags, NULL); if (fd1 != -1) close(fd1); @@ -656,14 +598,14 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, cleanup_disable(); - if (recv_ok) { - if (remove_sent_files && recv_ok > 0) { + if (recv_ok > 0) { + if (remove_sent_files + || (preserve_hard_links && file->link_u.links)) { SIVAL(numbuf, 0, i); send_msg(MSG_SUCCESS, numbuf, 4); } - } else { - int msgtype = csum_length == SUM_LENGTH || read_batch ? - FERROR : FINFO; + } else if (!recv_ok) { + int msgtype = phase || read_batch ? FERROR : FINFO; if (msgtype == FERROR || verbose) { char *errstr, *redostr, *keptstr; if (!(keep_partial && partialptr) && !inplace) @@ -684,7 +626,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, errstr, safe_fname(fname), keptstr, redostr); } - if (csum_length != SUM_LENGTH) { + if (!phase) { SIVAL(numbuf, 0, i); send_msg(MSG_REDO, numbuf, 4); } @@ -711,7 +653,9 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, full_fname(fname), safe_fname(partialptr)); } else { - if (remove_sent_files) { + if (remove_sent_files + || (preserve_hard_links + && file->link_u.links)) { SIVAL(numbuf, 0, i); send_msg(MSG_SUCCESS,numbuf,4); } @@ -722,9 +666,6 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, } } - if (delete_after && !local_name && flist->count > 0) - delete_files(flist); - if (verbose > 2) rprintf(FINFO,"recv_files finished\n");