X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/87629cf2f61f98b7030e5c18d54490a0cb676f0e..45c37e737f2a2f753d06b57605e66782aa93a114:/rsync.c diff --git a/rsync.c b/rsync.c index 818b3ee2..0e635b03 100644 --- a/rsync.c +++ b/rsync.c @@ -3,7 +3,7 @@ * * 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 @@ -27,7 +27,6 @@ #include #endif -extern int verbose; extern int dry_run; extern int preserve_acls; extern int preserve_xattrs; @@ -46,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; @@ -84,7 +84,7 @@ void setup_iconv(void) /* 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)" @@ -126,7 +126,7 @@ void setup_iconv(void) 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]"); @@ -205,13 +205,49 @@ int iconvbufs(iconv_t ic, xbuf *in, xbuf *out, int flags) } #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) { @@ -239,17 +275,19 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr, } /* 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) @@ -399,6 +437,8 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp, } 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); @@ -410,7 +450,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp, } 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", @@ -469,7 +509,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp, } #endif - if (verbose > 1 && flags & ATTRS_REPORT) { + if (INFO_GTE(NAME, 2) && flags & ATTRS_REPORT) { if (updated) rprintf(FCLIENT, "%s\n", fname); else @@ -517,21 +557,25 @@ int finish_transfer(const char *fname, const char *fnametmp, 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);