From: Wayne Davison Date: Fri, 13 Aug 2004 19:04:45 +0000 (+0000) Subject: - Fixed some bogus rsyserr() calls. X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/commitdiff_plain/d0320a46cd6ff9cfd559d88b349ff6616cad5c94 - Fixed some bogus rsyserr() calls. - Sanitize the --link-by-hash arg when needed. - Got rid of a duplicate robust_rename() call that got inserted into finish_transfer(). --- diff --git a/link-by-hash.diff b/link-by-hash.diff index 2e1fecd..a8b923f 100644 --- a/link-by-hash.diff +++ b/link-by-hash.diff @@ -11,7 +11,7 @@ will only store one copy of the unique contents of each file, regardless of the file's name. ---- orig/Makefile.in 2004-08-09 21:07:09 +--- orig/Makefile.in 2004-08-13 07:18:58 +++ Makefile.in 2004-07-03 20:20:15 @@ -35,7 +35,7 @@ OBJS1=rsync.o generator.o receiver.o cle main.o checksum.o match.o syscall.o log.o backup.o @@ -22,8 +22,8 @@ the file's name. DAEMON_OBJ = params.o loadparm.o clientserver.o access.o connection.o authenticate.o popt_OBJS=popt/findme.o popt/popt.o popt/poptconfig.o \ popt/popthelp.o popt/poptparse.o ---- orig/hashlink.c 2004-07-02 21:41:54 -+++ hashlink.c 2004-07-02 21:41:54 +--- orig/hashlink.c 2004-08-13 18:04:59 ++++ hashlink.c 2004-08-13 18:04:59 @@ -0,0 +1,342 @@ +/* + Copyright (C) Cronosys, LLC 2004 @@ -115,7 +115,7 @@ the file's name. + /* Build a list of potential candidates and open + * them. */ + if ((d = opendir(hashname)) == NULL) { -+ rsyserr(FERROR, errno, "opendir \"%s\"", hashname); ++ rsyserr(FERROR, errno, "opendir failed: \"%s\"", hashname); + free(hashname); + return NULL; + } @@ -134,7 +134,7 @@ the file's name. + asprintf(&hashfile->name,"%s/%s",hashname, + di->d_name); + if (do_stat(hashfile->name,&st) == -1) { -+ rsyserr(FERROR, errno, "%s: %s", hashfile->name); ++ rsyserr(FERROR, errno, "stat failed: %s", hashfile->name); + kill_hashfile(hashfile); + continue; + } @@ -145,7 +145,7 @@ the file's name. + hashfile->nlink = st.st_nlink; + hashfile->fd = open(hashfile->name,O_RDONLY|O_BINARY); + if (hashfile->fd == -1) { -+ rsyserr(FERROR, errno, "%s", hashfile->name); ++ rsyserr(FERROR, errno, "open failed: %s", hashfile->name); + kill_hashfile(hashfile); + continue; + } @@ -214,7 +214,7 @@ the file's name. + } + + if (amt == -1) { -+ rsyserr(FERROR, errno, "%s"); ++ rsyserr(FERROR, errno, "read failed in compare_hashfiles()"); + kill_hashfiles(files); + return NULL; + } @@ -266,7 +266,7 @@ the file's name. + dirname = strdup(hashname); + *strrchr(dirname,'/') = 0; + if (do_mkdir(dirname, 0755) == -1 && errno != EEXIST) { -+ rsyserr(FERROR, errno, "mkdir %s", dirname); ++ rsyserr(FERROR, errno, "mkdir failed: %s", dirname); + free(hashname); + free(dirname); + return robust_rename(fnametmp,fname,0644); @@ -274,7 +274,7 @@ the file's name. + free(dirname); + + if (do_mkdir(hashname, 0755) == -1 && errno != EEXIST) { -+ rsyserr(FERROR, errno, "mkdir %s", hashname); ++ rsyserr(FERROR, errno, "mkdir failed: %s", hashname); + free(hashname); + return robust_rename(fnametmp,fname,0644); + } @@ -288,7 +288,7 @@ the file's name. + int fd; + + if (do_stat(fnametmp,&st) == -1) { -+ rsyserr(FERROR, errno, "%s", fname); ++ rsyserr(FERROR, errno, "stat failed: %s", fname); + return -1; + } + hashfiles = find_hashfiles(hashname, st.st_size, &last_fnbr); @@ -301,7 +301,7 @@ the file's name. + + /* Search for one identical to us. */ + if ((fd = open(fnametmp,O_RDONLY|O_BINARY)) == -1) { -+ rsyserr(FERROR, errno, "%s", fnametmp); ++ rsyserr(FERROR, errno, "open failed: %s", fnametmp); + kill_hashfiles(hashfiles); + return -1; + } @@ -367,8 +367,8 @@ the file's name. +} + +#endif ---- orig/options.c 2004-08-11 23:42:23 -+++ options.c 2004-07-03 20:20:15 +--- orig/options.c 2004-08-12 18:34:38 ++++ options.c 2004-08-13 18:13:18 @@ -126,6 +126,7 @@ char *log_format = NULL; char *password_file = NULL; char *rsync_path = RSYNC_PATH; @@ -402,14 +402,17 @@ the file's name. /* TODO: Should this take an optional int giving the compression level? */ {"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 }, {"daemon", 0, POPT_ARG_NONE, &daemon_opt, 0, 0, 0 }, -@@ -620,6 +623,19 @@ int parse_arguments(int *argc, const cha +@@ -620,6 +623,22 @@ int parse_arguments(int *argc, const cha return 0; #endif + case OPT_LINK_BY_HASH: +#if HAVE_LINK -+ link_by_hash_dir = (char *)poptGetOptArg(pc); -+ checksum_seed = FIXED_CHECKSUM_SEED; ++ arg = poptGetOptArg(pc); ++ if (sanitize_paths) ++ arg = sanitize_path(NULL, arg, NULL, 0); ++ link_by_hash_dir = (char *)arg; ++ checksum_seed = 12345; + break; +#else + snprintf(err_buf, sizeof err_buf, @@ -422,7 +425,7 @@ the file's name. default: /* A large opt value means that set_refuse_options() * turned this option off (opt-BASE is its index). */ -@@ -1078,6 +1094,11 @@ void server_options(char **args,int *arg +@@ -1078,6 +1097,11 @@ void server_options(char **args,int *arg args[ac++] = compare_dest; } @@ -520,7 +523,7 @@ the file's name. log_recv(file, &initial_stats); --- orig/rsync.c 2004-08-09 21:07:10 -+++ rsync.c 2004-07-16 20:16:53 ++++ rsync.c 2004-08-13 18:14:34 @@ -34,6 +34,7 @@ extern int force_delete; extern int recurse; extern int keep_dirlinks; @@ -529,19 +532,20 @@ the file's name. extern char *backup_dir; extern int inplace; -@@ -254,6 +255,12 @@ void finish_transfer(char *fname, char * +@@ -254,7 +255,12 @@ void finish_transfer(char *fname, char * /* move tmp file over real file */ if (verbose > 2) rprintf(FINFO, "renaming %s to %s\n", fnametmp, fname); +- ret = robust_rename(fnametmp, fname, file->mode & INITACCESSPERMS); +#ifdef HAVE_LINK + if (link_by_hash_dir) + ret = link_by_hash(fnametmp, fname, file); + else +#endif + ret = robust_rename(fnametmp, fname, file->mode & INITACCESSPERMS); - ret = robust_rename(fnametmp, fname, file->mode & INITACCESSPERMS); if (ret < 0) { rsyserr(FERROR, errno, "%s %s -> \"%s\"", + ret == -2 ? "copy" : "rename", --- orig/rsync.h 2004-08-03 15:41:32 +++ rsync.h 2004-07-03 20:20:15 @@ -525,6 +525,14 @@ struct stats {