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
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
+ /* 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;
+ }
+ 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;
+ }
+ 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;
+ }
+ }
+
+ if (amt == -1) {
-+ rsyserr(FERROR, errno, "%s");
++ rsyserr(FERROR, errno, "read failed in compare_hashfiles()");
+ kill_hashfiles(files);
+ return NULL;
+ }
+ 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);
+ 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);
+ }
+ 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);
+
+ /* 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;
+ }
+}
+
+#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;
/* 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,
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;
}
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;
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 {