X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/e175fb07f7fac17f3f269d1d52557f69feb07882..fa3e4a0548699ccaac41df2428fe1ad9d3659435:/util.c diff --git a/util.c b/util.c index 876b9269..d37ab61e 100644 --- a/util.c +++ b/util.c @@ -107,9 +107,9 @@ void print_child_argv(char **cmd) "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789" ",.-_=+@/") != strlen(*cmd)) { - rprintf(FINFO, "\"%s\" ", safe_fname(*cmd)); + rprintf(FINFO, "\"%s\" ", *cmd); } else { - rprintf(FINFO, "%s ", safe_fname(*cmd)); + rprintf(FINFO, "%s ", *cmd); } } rprintf(FINFO, "\n"); @@ -139,7 +139,7 @@ int set_modtime(char *fname, time_t modtime, mode_t mode) if (verbose > 2) { rprintf(FINFO, "set modtime of %s to (%ld) %s", - safe_fname(fname), (long)modtime, + fname, (long)modtime, asctime(localtime(&modtime))); } @@ -260,7 +260,7 @@ static int safe_read(int desc, char *ptr, size_t len) * * This is used in conjunction with the --temp-dir, --backup, and * --copy-dest options. */ -int copy_file(char *source, char *dest, mode_t mode) +int copy_file(const char *source, const char *dest, mode_t mode) { int ifd; int ofd; @@ -329,7 +329,7 @@ int copy_file(char *source, char *dest, mode_t mode) * --delete trying to remove old .rsyncNNN files, hence it renames it * each time. **/ -int robust_unlink(char *fname) +int robust_unlink(const char *fname) { #ifndef ETXTBSY return do_unlink(fname); @@ -364,7 +364,7 @@ int robust_unlink(char *fname) if (verbose > 0) { rprintf(FINFO,"renaming %s to %s because of text busy\n", - safe_fname(fname), safe_fname(path)); + fname, path); } /* maybe we should return rename()'s exit status? Nah. */ @@ -377,8 +377,11 @@ int robust_unlink(char *fname) } /* Returns 0 on successful rename, 1 if we successfully copied the file - * across filesystems, -2 if copy_file() failed, and -1 on other errors. */ -int robust_rename(char *from, char *to, int mode) + * across filesystems, -2 if copy_file() failed, and -1 on other errors. + * If partialptr is not NULL and we need to do a copy, copy the file into + * the active partial-dir instead of over the destination file. */ +int robust_rename(char *from, char *to, char *partialptr, + int mode) { int tries = 4; @@ -394,6 +397,11 @@ int robust_rename(char *from, char *to, int mode) break; #endif case EXDEV: + if (partialptr) { + if (!handle_partial_dir(partialptr,PDIR_CREATE)) + return -1; + to = partialptr; + } if (copy_file(from, to, mode) != 0) return -2; do_unlink(from); @@ -893,43 +901,6 @@ int pop_dir(char *dir) return 1; } -/* Return the filename, turning any non-printable characters into escaped - * characters (e.g. \n -> \012, \ -> \\). This ensures that outputting it - * cannot generate an empty line nor corrupt the screen. This function can - * return only MAX_SAFE_NAMES values at a time! The returned value can be - * longer than MAXPATHLEN (because we may be trying to output an error about - * a too-long filename)! */ -char *safe_fname(const char *fname) -{ -#define MAX_SAFE_NAMES 4 - static char fbuf[MAX_SAFE_NAMES][MAXPATHLEN*2]; - static int ndx = 0; - int limit = sizeof fbuf / MAX_SAFE_NAMES - 1; - char *t; - - ndx = (ndx + 1) % MAX_SAFE_NAMES; - for (t = fbuf[ndx]; *fname; fname++) { - if (*fname == '\\') { - if ((limit -= 2) < 0) - break; - *t++ = '\\'; - *t++ = '\\'; - } else if (!isprint(*(uchar*)fname)) { - if ((limit -= 4) < 0) - break; - sprintf(t, "\\%03o", *(uchar*)fname); - t += 4; - } else { - if (--limit < 0) - break; - *t++ = *fname; - } - } - *t = '\0'; - - return fbuf[ndx]; -} - /** * Return a quoted string with the full pathname of the indicated filename. * The string " (in MODNAME)" may also be appended. The returned pointer @@ -944,7 +915,6 @@ char *full_fname(const char *fn) if (result) free(result); - fn = safe_fname(fn); if (*fn == '/') p1 = p2 = ""; else { @@ -1039,22 +1009,6 @@ int handle_partial_dir(const char *fname, int create) return 1; } -/** We need to supply our own strcmp function for file list comparisons - to ensure that signed/unsigned usage is consistent between machines. */ -int u_strcmp(const char *cs1, const char *cs2) -{ - const uchar *s1 = (const uchar *)cs1; - const uchar *s2 = (const uchar *)cs2; - - while (*s1 && *s2 && (*s1 == *s2)) { - s1++; s2++; - } - - return (int)*s1 - (int)*s2; -} - - - /** * Determine if a symlink points outside the current directory tree. * This is considered "unsafe" because e.g. when mirroring somebody