Update the copyright year.
[rsync/rsync.git] / rsync.c
diff --git a/rsync.c b/rsync.c
index 734a373..c420cf8 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1996 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2003-2008 Wayne Davison
+ * Copyright (C) 2003-2009 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -45,6 +45,7 @@ extern int gid_ndx;
 extern int inc_recurse;
 extern int inplace;
 extern int flist_eof;
+extern int msgs2stderr;
 extern int keep_dirlinks;
 extern int make_backups;
 extern struct file_list *cur_flist, *first_flist, *dir_flist;
@@ -79,23 +80,23 @@ void setup_iconv(void)
 # endif
 
        if (!am_server && !allow_8bit_chars) {
-
                /* It's OK if this fails... */
                ic_chck = iconv_open(defset, defset);
 
-               if (DEBUG_GTE(ICONV, 1)) {
+               if (DEBUG_GTE(ICONV, 2)) {
                        if (ic_chck == (iconv_t)-1) {
                                rprintf(FINFO,
-                                       "note: iconv_open(\"%s\", \"%s\") failed (%d)"
-                                       " -- using isprint() instead of iconv().\n",
+                                       "msg checking via isprint()"
+                                       " (iconv_open(\"%s\", \"%s\") errno: %d)\n",
                                        defset, defset, errno);
                        } else {
                                rprintf(FINFO,
-                                       "note: iconv_open(\"%s\", \"%s\") succeeded.\n",
-                                       defset, defset);
+                                       "msg checking charset: %s\n",
+                                       defset);
                        }
                }
-       }
+       } else
+               ic_chck = (iconv_t)-1;
 
 # ifdef ICONV_OPTION
        if (!iconv_opt)
@@ -125,10 +126,9 @@ void setup_iconv(void)
                exit_cleanup(RERR_UNSUPPORTED);
        }
 
-       if (INFO_GTE(MISC, 2)) {
-               rprintf(FINFO, "%s charset: %s\n",
-                       am_server ? "server" : "client",
-                       *charset ? charset : "[LOCALE]");
+       if (DEBUG_GTE(ICONV, 1)) {
+               rprintf(FINFO, "[%s] charset: %s\n",
+                       who_am_i(), *charset ? charset : "[LOCALE]");
        }
 # endif
 }
@@ -220,16 +220,19 @@ void send_protected_args(int fd, char *args[])
        if (DEBUG_GTE(CMD, 1))
                print_child_argv("protected args:", args + i + 1);
        do {
+               if (!args[i][0])
+                       write_buf(fd, ".", 2);
 #ifdef ICONV_OPTION
-               if (convert) {
+               else if (convert) {
                        INIT_XBUF_STRLEN(inbuf, args[i]);
                        iconvbufs(ic_send, &inbuf, &outbuf,
                                  ICB_EXPAND_OUT | ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE);
                        outbuf.buf[outbuf.len] = '\0';
                        write_buf(fd, outbuf.buf, outbuf.len + 1);
                        outbuf.len = 0;
-               } else
+               }
 #endif
+               else
                        write_buf(fd, args[i], strlen(args[i]) + 1);
        } while (args[++i]);
        write_byte(fd, 0);
@@ -256,8 +259,17 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
                        break;
                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);
@@ -267,9 +279,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);
                }
 
@@ -278,13 +291,15 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
                        rprintf(FINFO, "[%s] receiving flist for dir %d\n",
                                who_am_i(), ndx);
                }
-               negate_output_levels(); /* turn off all info/debug output */
+               if (!msgs2stderr)
+                       negate_output_levels(); /* turn off all info/debug output */
                send_msg_int(MSG_FLIST, ndx);
                start_flist_forward(f_in);
                flist = recv_file_list(f_in);
                flist->parent_ndx = ndx;
                stop_flist_forward();
-               negate_output_levels(); /* restore info/debug output */
+               if (!msgs2stderr)
+                       negate_output_levels(); /* restore info/debug output */
        }
 
        iflags = protocol_version >= 29 ? read_shortint(f_in)
@@ -298,17 +313,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);
@@ -390,12 +395,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
                                full_fname(fname));
                        return 0;
                }
-#ifdef SUPPORT_ACLS
-               sx2.acc_acl = sx2.def_acl = NULL;
-#endif
-#ifdef SUPPORT_XATTRS
-               sx2.xattr = NULL;
-#endif
+               init_stat_x(&sx2);
                sxp = &sx2;
                inherit = !preserve_perms;
        } else
@@ -609,23 +609,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)