Moved read_sum_head() here from sender.c (because the generator uses it
[rsync/rsync.git] / receiver.c
index 569b8fb..3e72768 100644 (file)
@@ -39,7 +39,8 @@ extern int cvs_exclude;
 extern int io_error;
 extern char *tmpdir;
 extern char *partial_dir;
-extern char *compare_dest;
+extern char *basis_dir[];
+extern int basis_dir_cnt;
 extern int make_backups;
 extern int do_progress;
 extern char *backup_dir;
@@ -209,17 +210,17 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
        static char file_sum2[MD4_SUM_LENGTH];
        struct map_struct *mapbuf;
        struct sum_struct sum;
-       unsigned int len;
+       int32 len;
        OFF_T offset = 0;
        OFF_T offset2;
        char *data;
-       int i;
+       int32 i;
        char *map = NULL;
 
        read_sum_head(f_in, &sum);
 
        if (fd_r >= 0 && size_r > 0) {
-               OFF_T map_size = MAX(sum.blength * 2, 16*1024);
+               OFF_T map_size = MAX((OFF_T)sum.blength * 2, 16*1024);
                mapbuf = map_file(fd_r, size_r, map_size, sum.blength);
                if (verbose > 2) {
                        rprintf(FINFO, "recv mapped %s of size %.0f\n",
@@ -243,7 +244,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
                        stats.literal_data += i;
                        cleanup_got_literal = 1;
 
-                       sum_update(data,i);
+                       sum_update(data, i);
 
                        if (fd != -1 && write_file(fd,data,i) != i)
                                goto report_write_error;
@@ -252,22 +253,24 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
                }
 
                i = -(i+1);
-               offset2 = i*(OFF_T)sum.blength;
+               offset2 = i * (OFF_T)sum.blength;
                len = sum.blength;
                if (i == (int)sum.count-1 && sum.remainder != 0)
                        len = sum.remainder;
 
                stats.matched_data += len;
 
-               if (verbose > 3)
-                       rprintf(FINFO,"chunk[%d] of size %d at %.0f offset=%.0f\n",
-                               i,len,(double)offset2,(double)offset);
+               if (verbose > 3) {
+                       rprintf(FINFO,
+                               "chunk[%d] of size %ld at %.0f offset=%.0f\n",
+                               i, (long)len, (double)offset2, (double)offset);
+               }
 
                if (mapbuf) {
                        map = map_ptr(mapbuf,offset2,len);
 
                        see_token(map, len);
-                       sum_update(map,len);
+                       sum_update(map, len);
                }
 
                if (inplace) {
@@ -289,7 +292,8 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
                offset += len;
        }
 
-       flush_write_file(fd);
+       if (flush_write_file(fd) < 0)
+               goto report_write_error;
 
 #ifdef HAVE_FTRUNCATE
        if (inplace && fd != -1)
@@ -378,7 +382,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name,
                        if (verbose > 2)
                                rprintf(FINFO, "recv_files phase=%d\n", phase);
                        send_msg(MSG_DONE, "", 0);
-                       if (keep_partial)
+                       if (keep_partial && !partial_dir)
                                make_backups = 0; /* prevents double backup */
                        continue;
                }
@@ -439,7 +443,8 @@ int recv_files(int f_in, struct file_list *flist, char *local_name,
                partialptr = partial_dir ? partial_dir_fname(fname) : fname;
 
                if (f_in_name >= 0) {
-                       switch (read_byte(f_in_name)) {
+                       uchar j;
+                       switch (j = read_byte(f_in_name)) {
                        case FNAMECMP_FNAME:
                                fnamecmp = fname;
                                break;
@@ -449,10 +454,15 @@ int recv_files(int f_in, struct file_list *flist, char *local_name,
                        case FNAMECMP_BACKUP:
                                fnamecmp = get_backup_name(fname);
                                break;
-                       case FNAMECMP_CMPDEST:
                        default:
+                               if (j >= basis_dir_cnt) {
+                                       rprintf(FERROR,
+                                               "invalid basis_dir index: %d.\n",
+                                               j);
+                                       exit_cleanup(RERR_PROTOCOL);
+                               }
                                pathjoin(fnamecmpbuf, sizeof fnamecmpbuf,
-                                        compare_dest, fname);
+                                        basis_dir[j], fname);
                                fnamecmp = fnamecmpbuf;
                                break;
                        }
@@ -562,21 +572,21 @@ int recv_files(int f_in, struct file_list *flist, char *local_name,
                        exit_cleanup(RERR_FILEIO);
                }
 
-               if (recv_ok || inplace)
-                       finish_transfer(fname, fnametmp, file, recv_ok);
-               else if (keep_partial && partialptr
-                   && handle_partial_dir(partialptr, PDIR_CREATE))
-                       finish_transfer(partialptr, fnametmp, file, 0);
-               else {
+               if (recv_ok || inplace) {
+                       finish_transfer(fname, fnametmp, file, recv_ok, 1);
+                       if (partialptr != fname && fnamecmp == partialptr) {
+                               do_unlink(partialptr);
+                               handle_partial_dir(partialptr, PDIR_DELETE);
+                       }
+               } else if (keep_partial && partialptr
+                   && handle_partial_dir(partialptr, PDIR_CREATE)) {
+                       finish_transfer(partialptr, fnametmp, file, recv_ok,
+                                       !partial_dir);
+               } else {
                        partialptr = NULL;
                        do_unlink(fnametmp);
                }
 
-               if (partialptr != fname && fnamecmp == partialptr && recv_ok) {
-                       do_unlink(partialptr);
-                       handle_partial_dir(partialptr, PDIR_DELETE);
-               }
-
                cleanup_disable();
 
                if (!recv_ok) {