*
* 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
# 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)
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
}
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);
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);
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
}
if (make_backups > 0 && overwriting_basis) {
- if (!make_backup(fname))
+ int ok = make_backup(fname, False);
+ if (!ok)
return 1;
- if (fnamecmp == fname)
+ if (ok == 1 && fnamecmp == fname)
fnamecmp = get_backup_name(fname);
}
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)