add a --ignore-errors option
[rsync/rsync.git] / receiver.c
index 7cc9a81..b10f7c6 100644 (file)
@@ -36,7 +36,6 @@ extern char *compare_dest;
 extern int make_backups;
 extern char *backup_suffix;
 
-
 static struct delete_list {
        dev_t dev;
        INO_T inode;
@@ -103,19 +102,20 @@ static void delete_one(struct file_struct *f)
 /* this deletes any files on the receiving side that are not present
    on the sending side. For version 1.6.4 I have changed the behaviour
    to match more closely what most people seem to expect of this option */
-static void delete_files(struct file_list *flist)
+void delete_files(struct file_list *flist)
 {
        struct file_list *local_file_list;
        int i, j;
        char *name;
        extern int module_id;
+       extern int ignore_errors;
        extern int max_delete;
        static int deletion_count;
 
        if (cvs_exclude)
                add_cvs_excludes();
 
-       if (io_error && !lp_ignore_errors(module_id)) {
+       if (io_error && !(lp_ignore_errors(module_id) || ignore_errors)) {
                rprintf(FINFO,"IO error encountered - skipping file deletion\n");
                return;
        }
@@ -146,6 +146,7 @@ static void delete_files(struct file_list *flist)
                        if (-1 == flist_find(flist,local_file_list->files[i])) {
                                char *f = f_name(local_file_list->files[i]);
                                int k = strlen(f) - strlen(backup_suffix);
+/* Hi Andrew, do we really need to play with backup_suffix here? */
                                if (make_backups && ((k <= 0) ||
                                            (strcmp(f+k,backup_suffix) != 0))) {
                                        (void) make_backup(f);
@@ -225,8 +226,8 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname,
                        extern int cleanup_got_literal;
 
                        if (verbose > 3) {
-                               rprintf(FINFO,"data recv %d at %d\n",
-                                       i,(int)offset);
+                               rprintf(FINFO,"data recv %d at %.0f\n",
+                                       i,(double)offset);
                        }
 
                        stats.literal_data += i;
@@ -243,7 +244,7 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname,
                } 
 
                i = -(i+1);
-               offset2 = i*n;
+               offset2 = i*(OFF_T)n;
                len = n;
                if (i == count-1 && remainder != 0)
                        len = remainder;
@@ -251,13 +252,15 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname,
                stats.matched_data += len;
                
                if (verbose > 3)
-                       rprintf(FINFO,"chunk[%d] of size %d at %d offset=%d\n",
-                               i,len,(int)offset2,(int)offset);
+                       rprintf(FINFO,"chunk[%d] of size %d at %.0f offset=%.0f\n",
+                               i,len,(double)offset2,(double)offset);
                
-               map = map_ptr(buf,offset2,len);
+               if (buf) {
+                       map = map_ptr(buf,offset2,len);
                
-               see_token(map, len);
-               sum_update(map,len);
+                       see_token(map, len);
+                       sum_update(map,len);
+               }
                
                if (fd != -1 && write_file(fd,map,len) != len) {
                        rprintf(FERROR,"write failed on %s : %s\n",
@@ -267,7 +270,7 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname,
                offset += len;
        }
 
-       end_progress();
+       end_progress(total_size);
 
        if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
                rprintf(FERROR,"write failed on %s : %s\n",
@@ -291,6 +294,8 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname,
 }
 
 
+/* main routine for receiver process. Receiver process runs on the
+       same host as the generator process. */
 
 int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
 {  
@@ -314,12 +319,6 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
        }
 
-       if (!delete_after) {
-               if (recurse && delete_mode && !local_name && flist->count>0) {
-                       delete_files(flist);
-               }
-       }
-
        while (1) {      
                cleanup_disable();
 
@@ -400,7 +399,7 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                if (fd1 != -1 && st.st_size > 0) {
                        buf = map_file(fd1,st.st_size);
                        if (verbose > 2)
-                               rprintf(FINFO,"recv mapped %s of size %d\n",fnamecmp,(int)st.st_size);
+                               rprintf(FINFO,"recv mapped %s of size %.0f\n",fnamecmp,(double)st.st_size);
                } else {
                        buf = NULL;
                }