Tweaking the license text a bit more.
[rsync/rsync.git] / receiver.c
index 3fdd895..9866648 100644 (file)
@@ -6,8 +6,9 @@
  * Copyright (C) 2003-2007 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ * with this program; if not, visit the http://fsf.org website.
  */
 
 #include "rsync.h"
@@ -54,7 +54,7 @@ extern struct stats stats;
 extern char *tmpdir;
 extern char *partial_dir;
 extern char *basis_dir[];
-extern struct file_list *cur_flist, *first_flist;
+extern struct file_list *cur_flist, *first_flist, *dir_flist;
 extern struct filter_list_struct server_filter_list;
 
 static struct bitbag *delayed_bits = NULL;
@@ -321,9 +321,9 @@ static int get_next_gen_ndx(int fd, int next_gen_ndx, int desired_ndx)
                next_gen_ndx = read_int(fd);
                if (next_gen_ndx == -1) {
                        if (inc_recurse)
-                               next_gen_ndx = first_flist->prev->count + first_flist->prev->ndx_start;
+                               next_gen_ndx = first_flist->prev->used + first_flist->prev->ndx_start;
                        else
-                               next_gen_ndx = cur_flist->count;
+                               next_gen_ndx = cur_flist->used;
                }
        }
        return next_gen_ndx;
@@ -357,10 +357,10 @@ int recv_files(int f_in, char *local_name)
        int ndx, recv_ok;
 
        if (verbose > 2)
-               rprintf(FINFO, "recv_files(%d) starting\n", cur_flist->count);
+               rprintf(FINFO, "recv_files(%d) starting\n", cur_flist->used);
 
        if (delay_updates)
-               delayed_bits = bitbag_create(cur_flist->count + 1);
+               delayed_bits = bitbag_create(cur_flist->used + 1);
 
        updating_basis = inplace;
 
@@ -378,8 +378,8 @@ int recv_files(int f_in, char *local_name)
                        }
                        if (read_batch && cur_flist) {
                                int high = inc_recurse
-                                   ? first_flist->prev->count + first_flist->prev->ndx_start
-                                   : cur_flist->count;
+                                   ? first_flist->prev->used + first_flist->prev->ndx_start
+                                   : cur_flist->used;
                                get_next_gen_ndx(batch_gen_fd, next_gen_ndx, high);
                                next_gen_ndx = -1;
                        }
@@ -393,7 +393,10 @@ int recv_files(int f_in, char *local_name)
                        continue;
                }
 
-               file = cur_flist->files[ndx - cur_flist->ndx_start];
+               if (ndx - cur_flist->ndx_start >= 0)
+                       file = cur_flist->files[ndx - cur_flist->ndx_start];
+               else
+                       file = dir_flist->files[cur_flist->parent_ndx];
                fname = local_name ? local_name : f_name(file, fbuf);
 
                if (verbose > 2)
@@ -470,6 +473,8 @@ int recv_files(int f_in, char *local_name)
                                        "(Skipping batched update for \"%s\")\n",
                                        fname);
                                discard_receive_data(f_in, F_LENGTH(file));
+                               if (inc_recurse)
+                                       send_msg_int(MSG_NO_SEND, ndx);
                                continue;
                        }
                        next_gen_ndx = -1;
@@ -553,6 +558,8 @@ int recv_files(int f_in, char *local_name)
                                full_fname(fnamecmp));
                        discard_receive_data(f_in, F_LENGTH(file));
                        close(fd1);
+                       if (inc_recurse)
+                               send_msg_int(MSG_NO_SEND, ndx);
                        continue;
                }
 
@@ -566,6 +573,8 @@ int recv_files(int f_in, char *local_name)
                                full_fname(fnamecmp));
                        discard_receive_data(f_in, F_LENGTH(file));
                        close(fd1);
+                       if (inc_recurse)
+                               send_msg_int(MSG_NO_SEND, ndx);
                        continue;
                }
 
@@ -599,6 +608,8 @@ int recv_files(int f_in, char *local_name)
                                discard_receive_data(f_in, F_LENGTH(file));
                                if (fd1 != -1)
                                        close(fd1);
+                               if (inc_recurse)
+                                       send_msg_int(MSG_NO_SEND, ndx);
                                continue;
                        }
                } else {
@@ -606,6 +617,8 @@ int recv_files(int f_in, char *local_name)
                                discard_receive_data(f_in, F_LENGTH(file));
                                if (fd1 != -1)
                                        close(fd1);
+                               if (inc_recurse)
+                                       send_msg_int(MSG_NO_SEND, ndx);
                                continue;
                        }
 
@@ -632,6 +645,8 @@ int recv_files(int f_in, char *local_name)
                                discard_receive_data(f_in, F_LENGTH(file));
                                if (fd1 != -1)
                                        close(fd1);
+                               if (inc_recurse)
+                                       send_msg_int(MSG_NO_SEND, ndx);
                                continue;
                        }