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

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

index 8290e60..f7ebe47 100644 (file)
@@ -2077,8 +2077,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) {
        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);
                        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);
@@ -2101,7 +2100,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
                        ignore_times++;
 
                        flist = cur_flist;
                        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)
 
                        file = cur_flist->files[ndx - cur_flist->ndx_start];
                        if (solo_file)
diff --git a/hlink.c b/hlink.c
index fede153..cdafa9f 100644 (file)
--- a/hlink.c
+++ b/hlink.c
@@ -36,7 +36,7 @@ extern int stdout_format_has_i;
 extern int maybe_ATTRS_REPORT;
 extern int unsort_ndx;
 extern char *basis_dir[MAX_BASIS_DIRS+1];
 extern int maybe_ATTRS_REPORT;
 extern int unsort_ndx;
 extern char *basis_dir[MAX_BASIS_DIRS+1];
-extern struct file_list *cur_flist, *first_flist;
+extern struct file_list *cur_flist;
 
 #ifdef SUPPORT_HARD_LINKS
 
 
 #ifdef SUPPORT_HARD_LINKS
 
@@ -132,7 +132,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);
                        } 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 {
                                if (flist)
                                        flist->files[prev - flist->ndx_start]->flags &= ~FLAG_HLINK_LAST;
                                else {
@@ -261,7 +261,7 @@ static char *check_prior(struct file_struct *file, int gnum,
        while (1) {
                struct file_list *flist;
                if (prev_ndx < 0
        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)) {
                        break;
                fp = flist->files[prev_ndx - flist->ndx_start];
                if (!(fp->flags & FLAG_SKIP_HLINK)) {
@@ -504,16 +504,7 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx,
 
        while ((ndx = prev_ndx) >= 0) {
                int val;
 
        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);
                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 2756b14..9f819ee 100644 (file)
--- a/io.c
+++ b/io.c
@@ -183,9 +183,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);
 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--;
 
        if (remove_source_files) {
                active_filecnt--;
diff --git a/rsync.c b/rsync.c
index 21f5288..f26f212 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -265,8 +265,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;
                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);
                if (ndx == NDX_FLIST_EOF) {
                        flist_eof = 1;
                        send_msg(MSG_FLIST_EOF, "", 0, 0);
@@ -276,9 +285,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,
                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);
                }
 
                        exit_cleanup(RERR_PROTOCOL);
                }
 
@@ -313,17 +323,7 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
                goto read_loop;
        }
 
                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);
 
        if (iflags & ITEM_BASIS_TYPE_FOLLOWS)
                fnamecmp_type = read_byte(f_in);
@@ -624,23 +624,40 @@ int finish_transfer(const char *fname, const char *fnametmp,
        return 1;
 }
 
        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))
 {
        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)
 
        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))
                flist = flist->prev;
        }
        while (ndx >= flist->ndx_start + flist->used) {
                if (!(flist = flist->next))
-                       return NULL;
+                       goto not_found;
        }
        return flist;
        }
        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)
 }
 
 const char *who_am_i(void)
index c8ef7cc..ba1d6ff 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -125,13 +125,7 @@ void successful_send(int ndx)
        if (!remove_source_files)
                return;
 
        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;
        file = flist->files[ndx - flist->ndx_start];
        if (!change_pathname(file, NULL, 0))
                return;