*
* Copyright (C) 1996 Andrew Tridgell
* Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2003-2007 Wayne Davison
+ * Copyright (C) 2003-2008 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
#include <langinfo.h>
#endif
-extern int verbose;
extern int dry_run;
extern int preserve_acls;
extern int preserve_xattrs;
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;
/* It's OK if this fails... */
ic_chck = iconv_open(defset, defset);
- if (verbose > 3) {
+ if (DEBUG_GTE(ICONV, 1)) {
if (ic_chck == (iconv_t)-1) {
rprintf(FINFO,
"note: iconv_open(\"%s\", \"%s\") failed (%d)"
exit_cleanup(RERR_UNSUPPORTED);
}
- if (verbose > 1) {
+ if (INFO_GTE(MISC, 2)) {
rprintf(FINFO, "%s charset: %s\n",
am_server ? "server" : "client",
*charset ? charset : "[LOCALE]");
}
#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 (DEBUG_GTE(CMD, 1))
+ print_child_argv("protected args:", args + i + 1);
+ do {
+#ifdef ICONV_OPTION
+ 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
+ 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)
{
int len, iflags = 0;
struct file_list *flist;
uchar fnamecmp_type = FNAMECMP_FNAME;
- int ndx, save_verbose = verbose;
+ int ndx;
read_loop:
while (1) {
}
/* Send everything read from f_in to msg_fd_out. */
- if (verbose > 3) {
+ if (DEBUG_GTE(FLIST, 2)) {
rprintf(FINFO, "[%s] receiving flist for dir %d\n",
who_am_i(), ndx);
}
- verbose = 0;
+ 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();
- verbose = save_verbose;
+ if (!msgs2stderr)
+ negate_output_levels(); /* restore info/debug output */
}
iflags = protocol_version >= 29 ? read_shortint(f_in)
}
if (ret == 0) /* ret == 1 if symlink could not be set */
updated = 1;
+ else
+ file->flags |= FLAG_TIME_FAILED;
}
change_uid = am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file);
} else
#endif
if (change_uid || change_gid) {
- if (verbose > 2) {
+ if (DEBUG_GTE(OWN, 1)) {
if (change_uid) {
rprintf(FINFO,
"set uid of %s from %u to %u\n",
fname, (unsigned)sxp->st.st_gid, F_GROUP(file));
}
}
- if (am_root < 0) {
- ;
- } else if (do_lchown(fname,
- change_uid ? (uid_t)F_OWNER(file) : sxp->st.st_uid,
- change_gid ? (gid_t)F_GROUP(file) : sxp->st.st_gid) != 0) {
- /* shouldn't have attempted to change uid or gid
- * unless have the privilege */
- rsyserr(FERROR_XFER, errno, "%s %s failed",
- change_uid ? "chown" : "chgrp",
- full_fname(fname));
- goto cleanup;
- } else
- /* a lchown had been done - we have to re-stat if the
- * destination had the setuid or setgid bits set due
- * to the side effect of the chown call */
- if (sxp->st.st_mode & (S_ISUID | S_ISGID)) {
- link_stat(fname, &sxp->st,
- keep_dirlinks && S_ISDIR(sxp->st.st_mode));
+ if (am_root >= 0) {
+ if (do_lchown(fname,
+ change_uid ? (uid_t)F_OWNER(file) : sxp->st.st_uid,
+ change_gid ? (gid_t)F_GROUP(file) : sxp->st.st_gid) != 0) {
+ /* We shouldn't have attempted to change uid
+ * or gid unless have the privilege. */
+ rsyserr(FERROR_XFER, errno, "%s %s failed",
+ change_uid ? "chown" : "chgrp",
+ full_fname(fname));
+ goto cleanup;
+ }
+ /* A lchown had been done, so we need to re-stat if
+ * the destination had the setuid or setgid bits set
+ * (due to the side effect of the chown call). */
+ if (sxp->st.st_mode & (S_ISUID | S_ISGID)) {
+ link_stat(fname, &sxp->st,
+ keep_dirlinks && S_ISDIR(sxp->st.st_mode));
+ }
}
updated = 1;
}
}
#endif
- if (verbose > 1 && flags & ATTRS_REPORT) {
+ if (INFO_GTE(NAME, 2) && flags & ATTRS_REPORT) {
if (updated)
rprintf(FCLIENT, "%s\n", fname);
else
const char *temp_copy_name = partialptr && *partialptr != '/' ? partialptr : NULL;
if (inplace) {
- if (verbose > 2)
+ if (DEBUG_GTE(RECV, 1))
rprintf(FINFO, "finishing %s\n", fname);
fnametmp = fname;
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,
ok_to_set_time ? 0 : ATTRS_SKIP_MTIME);
/* move tmp file over real file */
- if (verbose > 2)
+ if (DEBUG_GTE(RECV, 1))
rprintf(FINFO, "renaming %s to %s\n", fnametmp, fname);
ret = robust_rename(fnametmp, fname, temp_copy_name,
file->mode & INITACCESSPERMS);