Changed flist_for_ndx() to optionally die with an error
authorWayne Davison <wayned@samba.org>
Thu, 14 Aug 2008 14:32:18 +0000 (07:32 -0700)
committerWayne Davison <wayned@samba.org>
Thu, 14 Aug 2008 14:32:18 +0000 (07:32 -0700)
if the index isn't found.

generator.c
hlink.c
io.c
rsync.c
sender.c

index 86a4815..fdfc8dd 100644 (file)
@@ -2079,8 +2079,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
        while (1) {
 #ifdef SUPPORT_HARD_LINKS
                if (preserve_hard_links && (ndx = get_hlink_num()) != -1) {
-                       flist = flist_for_ndx(ndx);
-                       assert(flist != NULL);
+                       flist = flist_for_ndx(ndx, "check_for_finished_files.1");
                        file = flist->files[ndx - flist->ndx_start];
                        assert(file->flags & FLAG_HLINKED);
                        finish_hard_link(file, f_name(file, fbuf), ndx, NULL, itemizing, code, -1);
@@ -2103,7 +2102,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
                        ignore_times++;
 
                        flist = cur_flist;
-                       cur_flist = flist_for_ndx(ndx);
+                       cur_flist = flist_for_ndx(ndx, "check_for_finished_files.2");
 
                        file = cur_flist->files[ndx - cur_flist->ndx_start];
                        if (solo_file)
diff --git a/hlink.c b/hlink.c
index b8ada48..4cff763 100644 (file)
--- a/hlink.c
+++ b/hlink.c
@@ -37,7 +37,7 @@ extern int stdout_format_has_i;
 extern int maybe_ATTRS_REPORT;
 extern int unsort_ndx;
 extern char *basis_dir[];
-extern struct file_list *cur_flist, *first_flist;
+extern struct file_list *cur_flist;
 
 #ifdef SUPPORT_HARD_LINKS
 
@@ -127,7 +127,7 @@ static void match_gnums(int32 *ndx_list, int ndx_count)
                        } else if (CVAL(node->data, 0) == 0) {
                                struct file_list *flist;
                                prev = IVAL(node->data, 1);
-                               flist = flist_for_ndx(prev);
+                               flist = flist_for_ndx(prev, NULL);
                                if (flist)
                                        flist->files[prev - flist->ndx_start]->flags &= ~FLAG_HLINK_LAST;
                                else {
@@ -256,7 +256,7 @@ static char *check_prior(struct file_struct *file, int gnum,
        while (1) {
                struct file_list *flist;
                if (prev_ndx < 0
-                || (flist = flist_for_ndx(prev_ndx)) == NULL)
+                || (flist = flist_for_ndx(prev_ndx, NULL)) == NULL)
                        break;
                fp = flist->files[prev_ndx - flist->ndx_start];
                if (!(fp->flags & FLAG_SKIP_HLINK)) {
@@ -478,16 +478,7 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx,
 
        while ((ndx = prev_ndx) >= 0) {
                int val;
-               flist = flist_for_ndx(ndx);
-               if (flist == NULL) {
-                       int start1 = first_flist ? first_flist->ndx_start : 0;
-                       int start2 = first_flist ? first_flist->prev->ndx_start : 0;
-                       int used = first_flist ? first_flist->prev->used : 0;
-                       rprintf(FERROR,
-                               "File index not found: %d (%d - %d)\n",
-                               ndx, start1 - 1, start2 + used - 1);
-                       exit_cleanup(RERR_PROTOCOL);
-               }
+               flist = flist_for_ndx(ndx, "finish_hard_link");
                file = flist->files[ndx - flist->ndx_start];
                file->flags = (file->flags & ~FLAG_HLINK_FIRST) | FLAG_HLINK_DONE;
                prev_ndx = F_HL_PREV(file);
diff --git a/io.c b/io.c
index b7a1c5c..8c19141 100644 (file)
--- a/io.c
+++ b/io.c
@@ -184,9 +184,7 @@ static int flist_ndx_pop(struct flist_ndx_list *lp)
 static void got_flist_entry_status(enum festatus status, const char *buf)
 {
        int ndx = IVAL(buf, 0);
-       struct file_list *flist = flist_for_ndx(ndx);
-
-       assert(flist != NULL);
+       struct file_list *flist = flist_for_ndx(ndx, "got_flist_entry_status");
 
        if (remove_source_files) {
                active_filecnt--;
diff --git a/rsync.c b/rsync.c
index a9e655e..50a50ba 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -266,8 +266,17 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
                check_for_io_err = 0;
                if (ndx == NDX_DONE)
                        return ndx;
-               if (!inc_recurse || am_sender)
-                       goto invalid_ndx;
+               if (!inc_recurse || am_sender) {
+                       int last;
+                       if (first_flist)
+                               last = first_flist->prev->ndx_start + first_flist->prev->used - 1;
+                       else
+                               last = -1;
+                       rprintf(FERROR,
+                               "Invalid file index: %d (%d - %d) [%s]\n",
+                               ndx, NDX_DONE, last, who_am_i());
+                       exit_cleanup(RERR_PROTOCOL);
+               }
                if (ndx == NDX_FLIST_EOF) {
                        flist_eof = 1;
                        send_msg(MSG_FLIST_EOF, "", 0, 0);
@@ -277,9 +286,10 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
                if (ndx < 0 || ndx >= dir_flist->used) {
                        ndx = NDX_FLIST_OFFSET - ndx;
                        rprintf(FERROR,
-                               "[%s] Invalid dir index: %d (%d - %d)\n",
-                               who_am_i(), ndx, NDX_FLIST_OFFSET,
-                               NDX_FLIST_OFFSET - dir_flist->used + 1);
+                               "Invalid dir index: %d (%d - %d) [%s]\n",
+                               ndx, NDX_FLIST_OFFSET,
+                               NDX_FLIST_OFFSET - dir_flist->used + 1,
+                               who_am_i());
                        exit_cleanup(RERR_PROTOCOL);
                }
 
@@ -312,17 +322,7 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
                goto read_loop;
        }
 
-       if (!(flist = flist_for_ndx(ndx))) {
-               int start, used;
-         invalid_ndx:
-               start = first_flist ? first_flist->ndx_start : 0;
-               used = first_flist ? first_flist->used : 0;
-               rprintf(FERROR,
-                       "Invalid file index: %d (%d - %d) with iflags %x [%s]\n",
-                       ndx, start - 1, start + used -1, iflags, who_am_i());
-               exit_cleanup(RERR_PROTOCOL);
-       }
-       cur_flist = flist;
+       cur_flist = flist_for_ndx(ndx, "read_ndx_and_attrs");
 
        if (iflags & ITEM_BASIS_TYPE_FOLLOWS)
                fnamecmp_type = read_byte(f_in);
@@ -623,23 +623,40 @@ int finish_transfer(const char *fname, const char *fnametmp,
        return 1;
 }
 
-struct file_list *flist_for_ndx(int ndx)
+struct file_list *flist_for_ndx(int ndx, const char *fatal_error_loc)
 {
        struct file_list *flist = cur_flist;
 
        if (!flist && !(flist = first_flist))
-               return NULL;
+               goto not_found;
 
        while (ndx < flist->ndx_start-1) {
                if (flist == first_flist)
-                       return NULL;
+                       goto not_found;
                flist = flist->prev;
        }
        while (ndx >= flist->ndx_start + flist->used) {
                if (!(flist = flist->next))
-                       return NULL;
+                       goto not_found;
        }
        return flist;
+
+  not_found:
+       if (fatal_error_loc) {
+               int first, last;
+               if (first_flist) {
+                       first = first_flist->ndx_start - 1;
+                       last = first_flist->prev->ndx_start + first_flist->prev->used - 1;
+               } else {
+                       first = 0;
+                       last = -1;
+               }
+               rprintf(FERROR,
+                       "File-list index %d not in %d - %d (%s) [%s]\n",
+                       ndx, first, last, fatal_error_loc, who_am_i());
+               exit_cleanup(RERR_PROTOCOL);
+       }
+       return NULL;
 }
 
 const char *who_am_i(void)
index 74d0634..75b5a2f 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -127,13 +127,7 @@ void successful_send(int ndx)
        if (!remove_source_files)
                return;
 
-       if (!(flist = flist_for_ndx(ndx))) {
-               rprintf(FERROR,
-                       "INTERNAL ERROR: unable to find flist for item %d\n",
-                       ndx);
-               return;
-       }
-
+       flist = flist_for_ndx(ndx, "successful_send");
        file = flist->files[ndx - flist->ndx_start];
        if (!change_pathname(file, NULL, 0))
                return;