X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/9fdb334e8518d80914aa33282d718d9ee6809b30..2e94e70e2b138075fa5ea3a137a370621a38acc7:/util.c diff --git a/util.c b/util.c index 34df88e3..a01a38d1 100644 --- a/util.c +++ b/util.c @@ -28,6 +28,9 @@ #include "rsync.h" extern int verbose; +extern int dry_run; +extern int module_id; +extern int modify_window; extern struct exclude_list_struct server_exclude_list; int sanitize_paths = 0; @@ -126,7 +129,6 @@ void overflow(char *str) int set_modtime(char *fname, time_t modtime) { - extern int dry_run; if (dry_run) return 0; @@ -252,41 +254,46 @@ int copy_file(char *source, char *dest, mode_t mode) ifd = do_open(source, O_RDONLY, 0); if (ifd == -1) { - rprintf(FERROR,"open %s: %s\n", - source,strerror(errno)); + rsyserr(FERROR, errno, "open %s", full_fname(source)); return -1; } if (robust_unlink(dest) && errno != ENOENT) { - rprintf(FERROR,"unlink %s: %s\n", - dest,strerror(errno)); + rsyserr(FERROR, errno, "unlink %s", full_fname(dest)); return -1; } ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode); if (ofd == -1) { - rprintf(FERROR,"open %s: %s\n", - dest,strerror(errno)); + rsyserr(FERROR, errno, "open %s", full_fname(dest)); close(ifd); return -1; } while ((len = safe_read(ifd, buf, sizeof buf)) > 0) { if (full_write(ofd, buf, len) < 0) { - rprintf(FERROR,"write %s: %s\n", - dest,strerror(errno)); + rsyserr(FERROR, errno, "write %s", full_fname(dest)); close(ifd); close(ofd); return -1; } } - close(ifd); - close(ofd); - if (len < 0) { - rprintf(FERROR,"read %s: %s\n", - source,strerror(errno)); + rsyserr(FERROR, errno, "read %s", full_fname(source)); + close(ifd); + close(ofd); + return -1; + } + + if (close(ifd) < 0) { + rsyserr(FINFO, errno, "close failed on %s", + full_fname(source)); + } + + if (close(ofd) < 0) { + rsyserr(FERROR, errno, "close failed on %s", + full_fname(dest)); return -1; } @@ -489,21 +496,23 @@ static int exclude_server_path(char *arg) static void glob_expand_one(char *s, char **argv, int *argc, int maxargs) { #if !(defined(HAVE_GLOB) && defined(HAVE_GLOB_H)) - if (!*s) s = "."; + if (maxargs <= *argc) + return; + if (!*s) + s = "."; s = argv[*argc] = strdup(s); exclude_server_path(s); (*argc)++; #else - extern int sanitize_paths; glob_t globbuf; int i; - if (!*s) s = "."; + if (!*s) + s = "."; s = argv[*argc] = strdup(s); - if (sanitize_paths) { + if (sanitize_paths) sanitize_path(s, NULL); - } memset(&globbuf, 0, sizeof globbuf); if (!exclude_server_path(s)) @@ -698,9 +707,12 @@ void sanitize_path(char *p, char *reldir) int allowdotdot = 0; if (reldir) { - depth++; + int new_component = 1; while (*reldir) { - if (*reldir++ == '/') { + if (*reldir++ == '/') + new_component = 1; + else if (new_component) { + new_component = 0; depth++; } } @@ -805,7 +817,6 @@ char *alloc_sanitize_path(const char *path, const char *rootdir) rlen--; buf[rlen] = '\0'; } - fprintf(stderr, "p:`%s'\n", buf); return buf; } @@ -877,9 +888,8 @@ int pop_dir(char *dir) * The string " (in MODNAME)" may also be appended. The returned pointer * remains valid until the next time full_fname() is called. **/ -char *full_fname(char *fn) +char *full_fname(const char *fn) { - extern int module_id; static char *result = NULL; char *m1, *m2, *m3; char *p1, *p2; @@ -1032,7 +1042,6 @@ int msleep(int t) struct timeval tval, t1, t2; gettimeofday(&t1, NULL); - gettimeofday(&t2, NULL); while (tdiff < t) { tval.tv_sec = (t-tdiff)/1000; @@ -1063,13 +1072,13 @@ int msleep(int t) **/ int cmp_modtime(time_t file1, time_t file2) { - extern int modify_window; - if (file2 > file1) { - if (file2 - file1 <= modify_window) return 0; + if (file2 - file1 <= modify_window) + return 0; return -1; } - if (file1 - file2 <= modify_window) return 0; + if (file1 - file2 <= modify_window) + return 0; return 1; }