X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/f635ed27f83ebab4537882eeb80f202deccc6a60..14191ec6a4639958cd3882d547f6bcb51640361a:/link-by-hash.diff diff --git a/link-by-hash.diff b/link-by-hash.diff index 2e1fecd..5333efb 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-09-20 05:10:48 ++++ 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 +@@ -616,6 +619,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 +@@ -1083,6 +1102,11 @@ void server_options(char **args,int *arg args[ac++] = compare_dest; } @@ -434,7 +437,7 @@ the file's name. if (files_from && (!am_sender || remote_filesfrom_file)) { if (remote_filesfrom_file) { args[ac++] = "--files-from"; ---- orig/receiver.c 2004-08-03 15:34:32 +--- orig/receiver.c 2004-09-21 09:40:27 +++ receiver.c 2004-07-20 21:44:05 @@ -39,6 +39,7 @@ extern int io_error; extern char *tmpdir; @@ -444,7 +447,7 @@ the file's name. extern int make_backups; extern int do_progress; extern char *backup_dir; -@@ -206,12 +207,13 @@ static int get_tmpname(char *fnametmp, c +@@ -202,12 +203,13 @@ static int get_tmpname(char *fnametmp, c static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, @@ -459,7 +462,7 @@ the file's name. unsigned int len; OFF_T offset = 0; OFF_T offset2; -@@ -231,6 +233,9 @@ static int receive_data(int f_in, char * +@@ -227,6 +229,9 @@ static int receive_data(int f_in, char * } else mapbuf = NULL; @@ -469,7 +472,7 @@ the file's name. sum_init(checksum_seed); while ((i = recv_token(f_in, &data)) != 0) { -@@ -247,6 +252,8 @@ static int receive_data(int f_in, char * +@@ -243,6 +248,8 @@ static int receive_data(int f_in, char * cleanup_got_literal = 1; sum_update(data,i); @@ -478,7 +481,7 @@ the file's name. if (fd != -1 && write_file(fd,data,i) != i) goto report_write_error; -@@ -271,6 +278,8 @@ static int receive_data(int f_in, char * +@@ -267,6 +274,8 @@ static int receive_data(int f_in, char * see_token(map, len); sum_update(map,len); @@ -487,7 +490,7 @@ the file's name. } if (inplace) { -@@ -310,6 +319,8 @@ static int receive_data(int f_in, char * +@@ -306,6 +315,8 @@ static int receive_data(int f_in, char * } sum_end(file_sum1); @@ -496,7 +499,7 @@ the file's name. if (mapbuf) unmap_file(mapbuf); -@@ -325,7 +336,7 @@ static int receive_data(int f_in, char * +@@ -321,7 +332,7 @@ static int receive_data(int f_in, char * static void discard_receive_data(int f_in, OFF_T length) { @@ -505,7 +508,7 @@ the file's name. } -@@ -541,8 +552,12 @@ int recv_files(int f_in, struct file_lis +@@ -542,8 +553,12 @@ int recv_files(int f_in, struct file_lis rprintf(FINFO, "%s\n", safe_fname(fname)); /* recv file data */ @@ -519,8 +522,8 @@ 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 +--- orig/rsync.c 2004-09-07 21:45:30 ++++ 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 {