- If send_file_name() gets f set to -2, it skips the local filter rules.
[rsync/rsync.git] / sender.c
index f31176e..d88d245 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -27,7 +27,9 @@ extern int dry_run;
 extern int am_server;
 extern int am_daemon;
 extern int protocol_version;
+extern int updating_basis_file;
 extern int make_backups;
+extern int inplace;
 extern struct stats stats;
 
 
@@ -45,7 +47,7 @@ extern struct stats stats;
 static struct sum_struct *receive_sums(int f)
 {
        struct sum_struct *s;
-       int i;
+       size_t i;
        OFF_T offset = 0;
 
        if (!(s = new(struct sum_struct)))
@@ -66,14 +68,14 @@ static struct sum_struct *receive_sums(int f)
        if (!(s->sums = new_array(struct sum_buf, s->count)))
                out_of_memory("receive_sums");
 
-       for (i = 0; i < (int)s->count; i++) {
+       for (i = 0; i < s->count; i++) {
                s->sums[i].sum1 = read_int(f);
                read_buf(f, s->sums[i].sum2, s->s2length);
 
                s->sums[i].offset = offset;
                s->sums[i].flags = 0;
 
-               if (i == (int)s->count-1 && s->remainder != 0)
+               if (i == s->count-1 && s->remainder != 0)
                        s->sums[i].len = s->remainder;
                else
                        s->sums[i].len = s->blength;
@@ -136,15 +138,26 @@ void send_files(struct file_list *flist, int f_out, int f_in)
                        exit_cleanup(RERR_PROTOCOL);
                }
 
+               if (inplace && protocol_version >= 29) {
+                       uchar fnamecmp_type = read_byte(f_in);
+                       updating_basis_file = fnamecmp_type == FNAMECMP_FNAME;
+               } else
+                       updating_basis_file = inplace && !make_backups;
+
                file = flist->files[i];
+               if (S_ISDIR(file->mode)) {
+                       rprintf(FERROR, "[%s] got index of directory: %d\n",
+                               who_am_i(), i);
+                       exit_cleanup(RERR_PROTOCOL);
+               }
 
                stats.current_file_index = i;
                stats.num_transferred_files++;
                stats.total_transferred_size += file->length;
 
-               if (file->basedir) {
+               if (file->dir.root) {
                        /* N.B. We're sure that this fits, so offset is OK. */
-                       offset = strlcpy(fname, file->basedir, sizeof fname);
+                       offset = strlcpy(fname, file->dir.root, sizeof fname);
                        if (!offset || fname[offset-1] != '/')
                                fname[offset++] = '/';
                } else