Sending --no-whole-file is no good because it will not work with old
[rsync/rsync.git] / generator.c
index b3b7f19..bdd27bc 100644 (file)
@@ -1,7 +1,10 @@
 /* -*- c-file-style: "linux" -*-
+
+   rsync -- fast file replication program
    
    Copyright (C) 1996-2000 by Andrew Tridgell 
    Copyright (C) Paul Mackerras 1996
+   Copyright (C) 2002 by Martin Pool <mbp@samba.org>
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -28,6 +31,7 @@ extern int am_root;
 extern int preserve_devices;
 extern int preserve_hard_links;
 extern int update_only;
+extern int opt_ignore_existing;
 extern int whole_file;
 extern int block_size;
 extern int csum_length;
@@ -99,25 +103,30 @@ static int adapt_block_size(struct file_struct *file, int bsize)
 /*
   send a sums struct down a fd
   */
-static void send_sums(struct sum_struct *s,int f_out)
+static void send_sums(struct sum_struct *s, int f_out)
 {
-       int i;
-       
-       /* tell the other guy how many we are going to be doing and how many
-          bytes there are in the last chunk */
-       write_int(f_out,s?s->count:0);
-       write_int(f_out,s?s->n:block_size);
-       write_int(f_out,s?s->remainder:0);
-
-       if (!s) return;
-
-       for (i=0;i<s->count;i++) {
-               write_int(f_out,s->sums[i].sum1);
-               write_buf(f_out,s->sums[i].sum2,csum_length);
+       if (s) {
+               size_t i;
+
+               /* tell the other guy how many we are going to be
+                  doing and how many bytes there are in the last
+                  chunk */
+               write_int(f_out, s->count);
+               write_int(f_out, s->n);
+               write_int(f_out, s->remainder);
+
+               for (i = 0; i < s->count; i++) {
+                       write_int(f_out, s->sums[i].sum1);
+                       write_buf(f_out, s->sums[i].sum2, csum_length);
+               }
+       } else {
+               /* we don't have checksums */
+               write_int(f_out, 0);
+               write_int(f_out, block_size);
+               write_int(f_out, 0);
        }
 }
 
-
 /*
   generate a stream of signatures/checksums that describe a buffer
 
@@ -207,11 +216,10 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
                rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i);
 
        statret = link_stat(fname,&st);
-read
+
        if (only_existing && statret == -1 && errno == ENOENT) {
                /* we only want to update existing files */
-               if (verbose > 1) rprintf(FINFO, RSYNC_NAME
-                                        ": not creating new file \"%s\"\n",fname);
+               if (verbose > 1) rprintf(FINFO, "not creating new file \"%s\"\n",fname);
                return;
        }
 
@@ -264,7 +272,7 @@ read
 
                if (safe_symlinks && unsafe_symlink(file->link, fname)) {
                        if (verbose) {
-                               rprintf(FINFO,RSYNC_NAME ": ignoring unsafe symlink \"%s\" -> \"%s\"\n",
+                               rprintf(FINFO,"ignoring unsafe symlink \"%s\" -> \"%s\"\n",
                                        fname,file->link);
                        }
                        return;
@@ -292,8 +300,7 @@ read
                } else {
                        set_perms(fname,file,NULL,0);
                        if (verbose) {
-                               rprintf(FINFO,RSYNC_NAME": %s -> %s\n",
-                                       fname,file->link);
+                               rprintf(FINFO,"%s -> %s\n", fname,file->link);
                        }
                }
 #endif
@@ -325,14 +332,12 @@ read
 
        if (preserve_hard_links && check_hard_link(file)) {
                if (verbose > 1)
-                       rprintf(FINFO, RSYNC_NAME
-                               ": \"%s\" is a hard link\n",f_name(file));
+                       rprintf(FINFO, "\"%s\" is a hard link\n",f_name(file));
                return;
        }
 
        if (!S_ISREG(file->mode)) {
-               rprintf(FINFO, RSYNC_NAME
-                       ": skipping non-regular file \"%s\"\n",fname);
+               rprintf(FINFO, "skipping non-regular file \"%s\"\n",fname);
                return;
        }
 
@@ -357,8 +362,9 @@ read
                        if (!dry_run) send_sums(NULL,f_out);
                } else {
                        if (verbose > 1)
-                               rprintf(FERROR,RSYNC_NAME": recv_generator failed to open \%s\": %s\n",fname,
-                                       strerror(errno));
+                               rprintf(FERROR, RSYNC_NAME
+                                       ": recv_generator failed to open \"%s\": %s\n",
+                                       fname, strerror(errno));
                }
                return;
        }
@@ -374,6 +380,12 @@ read
                return;
        }
 
+       if (opt_ignore_existing && fnamecmp == fname) { 
+               if (verbose > 1)
+                       rprintf(FINFO,"%s exists\n",fname);
+               return;
+       } 
+
        if (update_only && cmp_modtime(st.st_mtime,file->modtime)>0 && fnamecmp == fname) {
                if (verbose > 1)
                        rprintf(FINFO,"%s is newer\n",fname);
@@ -391,6 +403,8 @@ read
                return;
        }
 
+       assert(whole_file == 0 || whole_file == 1);
+       /* We should have decided by now. */
        if (whole_file) {
                write_int(f_out,i);
                send_sums(NULL,f_out);