Document the new --partial-dir option.
[rsync/rsync.git] / receiver.c
index fcde60f..35f964e 100644 (file)
@@ -62,7 +62,7 @@ static void delete_one(char *fn, int is_dir)
                        rsyserr(FERROR, errno, "delete_one: unlink %s failed",
                                full_fname(fn));
                } else if (verbose)
-                       rprintf(FINFO, "deleting %s\n", fn);
+                       rprintf(FINFO, "deleting %s\n", safe_fname(fn));
        } else {
                if (do_rmdir(fn) != 0) {
                        if (errno == ENOTDIR && keep_dirlinks) {
@@ -74,8 +74,10 @@ static void delete_one(char *fn, int is_dir)
                                        "delete_one: rmdir %s failed",
                                        full_fname(fn));
                        }
-               } else if (verbose)
-                       rprintf(FINFO, "deleting directory %s\n", fn);
+               } else if (verbose) {
+                       rprintf(FINFO, "deleting directory %s\n",
+                               safe_fname(fn));
+               }
        }
 }
 
@@ -115,7 +117,7 @@ void delete_files(struct file_list *flist)
                        continue;
 
                if (verbose > 1)
-                       rprintf(FINFO, "deleting in %s\n", fbuf);
+                       rprintf(FINFO, "deleting in %s\n", safe_fname(fbuf));
 
                for (i = local_file_list->count-1; i >= 0; i--) {
                        if (max_delete && deletion_count > max_delete)
@@ -126,8 +128,10 @@ void delete_files(struct file_list *flist)
                                char *f = f_name(local_file_list->files[i]);
                                if (make_backups && (backup_dir || !is_backup_file(f))) {
                                        make_backup(f);
-                                       if (verbose)
-                                               rprintf(FINFO, "deleting %s\n", f);
+                                       if (verbose) {
+                                               rprintf(FINFO, "deleting %s\n",
+                                                       safe_fname(f));
+                                       }
                                } else {
                                        int mode = local_file_list->files[i]->mode;
                                        delete_one(f, S_ISDIR(mode) != 0);
@@ -221,7 +225,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
                mapbuf = map_file(fd_r, size_r, sum.blength);
                if (verbose > 2) {
                        rprintf(FINFO, "recv mapped %s of size %.0f\n",
-                               fname_r, (double)size_r);
+                               safe_fname(fname_r), (double)size_r);
                }
        } else
                mapbuf = NULL;
@@ -243,11 +247,8 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
 
                        sum_update(data,i);
 
-                       if (fd != -1 && write_file(fd,data,i) != i) {
-                               rsyserr(FERROR, errno, "write failed on %s",
-                                       full_fname(fname));
-                               exit_cleanup(RERR_FILEIO);
-                       }
+                       if (fd != -1 && write_file(fd,data,i) != i)
+                               goto report_write_error;
                        offset += i;
                        continue;
                }
@@ -271,29 +272,29 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
                        sum_update(map,len);
                }
 
-               if (!inplace || offset != offset2) {
-                       if (fd != -1 && write_file(fd, map, len) != (int)len) {
-                               rsyserr(FERROR, errno, "write failed on %s",
-                                       full_fname(fname));
-                               exit_cleanup(RERR_FILEIO);
-                       }
-               } else {
-                       flush_write_file(fd);
-                       if (do_lseek(fd,(OFF_T)len,SEEK_CUR) != offset+len) {
-                               rprintf(FERROR, "lseek failed on %s: %s, %lli, %lli, %i\n",
-                                       full_fname(fname), strerror(errno),
-                                       do_lseek(fd, 0, SEEK_CUR),
-                                       offset + len, i);
-                               exit_cleanup(RERR_FILEIO);
+               if (inplace) {
+                       if (offset == offset2 && fd != -1) {
+                               if (flush_write_file(fd) < 0)
+                                       goto report_write_error;
+                               offset += len;
+                               if (do_lseek(fd, len, SEEK_CUR) != offset) {
+                                       rsyserr(FERROR, errno,
+                                               "lseek failed on %s",
+                                               full_fname(fname));
+                                       exit_cleanup(RERR_FILEIO);
+                               }
+                               continue;
                        }
                }
+               if (fd != -1 && write_file(fd, map, len) != (int)len)
+                       goto report_write_error;
                offset += len;
        }
 
        flush_write_file(fd);
 
 #ifdef HAVE_FTRUNCATE
-       if (inplace)
+       if (inplace && fd != -1)
                ftruncate(fd, offset);
 #endif
 
@@ -301,6 +302,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
                end_progress(total_size);
 
        if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
+           report_write_error:
                rsyserr(FERROR, errno, "write failed on %s",
                        full_fname(fname));
                exit_cleanup(RERR_FILEIO);
@@ -396,15 +398,15 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                        fname = f_name_to(file, fbuf);
 
                if (dry_run) {
-                       if (!am_server && verbose)
-                               rprintf(FINFO, "%s\n", fname);
+                       if (!am_server && verbose) /* log the transfer */
+                               rprintf(FINFO, "%s\n", safe_fname(fname));
                        continue;
                }
 
                initial_stats = stats;
 
                if (verbose > 2)
-                       rprintf(FINFO,"recv_files(%s)\n",fname);
+                       rprintf(FINFO, "recv_files(%s)\n", safe_fname(fname));
 
                fnamecmp = fname;
 
@@ -416,7 +418,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                        }
                        if (i < next_gen_i) {
                                rprintf(FINFO, "skipping update for \"%s\"\n",
-                                       fname);
+                                       safe_fname(fname));
                                discard_receive_data(f_in, file->length);
                                continue;
                        }
@@ -428,7 +430,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                        if (verbose) {
                                rprintf(FINFO,
                                        "skipping server-excluded update for \"%s\"\n",
-                                       fname);
+                                       safe_fname(fname));
                        }
                        discard_receive_data(f_in, file->length);
                        continue;
@@ -527,8 +529,8 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                        cleanup_set(fnametmp, fname, file, fd1, fd2);
                }
 
-               if (!am_server && verbose)
-                       rprintf(FINFO, "%s\n", fname);
+               if (!am_server && verbose) /* log the transfer */
+                       rprintf(FINFO, "%s\n", safe_fname(fname));
 
                /* recv file data */
                recv_ok = receive_data(f_in, fnamecmp, fd1, st.st_size,
@@ -544,7 +546,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                        exit_cleanup(RERR_FILEIO);
                }
 
-               if (recv_ok || keep_partial)
+               if (recv_ok || keep_partial || inplace)
                        finish_transfer(fname, fnametmp, file, recv_ok);
                else
                        do_unlink(fnametmp);
@@ -552,13 +554,26 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                cleanup_disable();
 
                if (!recv_ok) {
-                       if (csum_length == SUM_LENGTH) {
-                               rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
-                                       full_fname(fname));
-                       } else {
+                       int msgtype = csum_length == SUM_LENGTH || read_batch ?
+                               FERROR : FINFO;
+                       if (msgtype == FERROR || verbose) {
+                               char *errstr, *redostr;
+                               char *keptstr = keep_partial || inplace ?
+                                       "retain" : "discard";
+                               if (msgtype == FERROR) {
+                                       errstr = "ERROR";
+                                       redostr = "";
+                               } else {
+                                       errstr = "WARNING";
+                                       redostr = " (will try again)";
+                               }
+                               rprintf(msgtype,
+                                       "%s: %s failed verification -- update %sed%s.\n",
+                                       errstr, safe_fname(fname),
+                                       keptstr, redostr);
+                       }
+                       if (csum_length != SUM_LENGTH) {
                                char buf[4];
-                               if (verbose > 1)
-                                       rprintf(FINFO,"redoing %s(%d)\n",fname,i);
                                SIVAL(buf, 0, i);
                                send_msg(MSG_REDO, buf, 4);
                        }