}
#endif
+void send_protected_args(int fd, char *args[])
+{
+ int i;
+#ifdef ICONV_OPTION
+ int convert = ic_send != (iconv_t)-1;
+ xbuf outbuf, inbuf;
+
+ if (convert)
+ alloc_xbuf(&outbuf, 1024);
+#endif
+
+ for (i = 0; args[i]; i++) {} /* find first NULL */
+ args[i] = "rsync"; /* set a new arg0 */
+ if (verbose > 1)
+ print_child_argv("protected args:", args + i + 1);
+ do {
+ if (!args[i][0])
+ write_buf(fd, ".", 2);
+#ifdef ICONV_OPTION
+ 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;
+ }
+#endif
+ else
+ write_buf(fd, args[i], strlen(args[i]) + 1);
+ } while (args[++i]);
+ write_byte(fd, 0);
+
+#ifdef ICONV_OPTION
+ if (convert)
+ free(outbuf.buf);
+#endif
+}
+
int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
char *buf, int *len_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);
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);
}
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);
goto do_set_file_attrs;
}
- if (make_backups > 0 && overwriting_basis && !make_backup(fname))
- return 1;
+ if (make_backups > 0 && overwriting_basis) {
+ if (!make_backup(fname))
+ return 1;
+ if (fnamecmp == fname)
+ fnamecmp = get_backup_name(fname);
+ }
/* Change permissions before putting the file into place. */
set_file_attrs(fnametmp, file, NULL, fnamecmp,
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)