In clean_flist(), if a duplicate is found for a dir and a non-dir,
[rsync/rsync.git] / sender.c
index 741a8d2..d88d245 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -47,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)))
@@ -68,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;
@@ -138,25 +138,31 @@ 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
                        offset = 0;
                fname2 = f_name_to(file, fname + offset);
-               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;
 
                if (verbose > 2)
                        rprintf(FINFO, "send_files(%d, %s)\n", i, fname);