Patch supposed to fix Tru64.
[rsync/rsync-patches.git] / jw_rsync3.diff
CommitLineData
9a2bb7fe
MP
1Please CC me. I'm not subscribed.
2
3Attached is a patch against 2.5.4pre1 CVS current to add the
4--link-dest option so rsync will create hardlinks for
5unchanged regular files to a directory on the destination.
6This is like --compare-dest except that the result is not a
7sparse tree.
8
9Also included is extension to --(ex|in)clude-from to allow -
10for stdin.
11
12Could one of the maintainers please add this to the
13mainline?
14
15Thanks to Dave Dykstra for feedback on this.
16
17--
18________________________________________________________________
19 J.W. Schultz Pegasystems Technologies
20 email address: jw@pegasys.ws
21
22 Remember Cernan and Schmitt
23? options-merge.c
24Index: exclude.c
25===================================================================
26RCS file: /cvsroot/rsync/exclude.c,v
27retrieving revision 1.42
28diff -u -r1.42 exclude.c
29--- exclude.c 18 Feb 2002 19:10:28 -0000 1.42
30+++ exclude.c 21 Mar 2002 23:31:25 -0000
31@@ -219,8 +219,14 @@
32 int fatal, int include)
33 {
34 struct exclude_struct **list=list1;
35- FILE *f = fopen(fname,"r");
36+ FILE *f;
37 char line[MAXPATHLEN];
38+
39+ if (strcmp(fname, "-")) {
40+ f = fopen(fname,"r");
41+ } else {
42+ f = fdopen(0, "r");
43+ }
44 if (!f) {
45 if (fatal) {
46 rsyserr(FERROR, errno,
47Index: generator.c
48===================================================================
49RCS file: /cvsroot/rsync/generator.c,v
50retrieving revision 1.37
51diff -u -r1.37 generator.c
52--- generator.c 19 Mar 2002 20:16:42 -0000 1.37
53+++ generator.c 21 Mar 2002 23:31:26 -0000
54@@ -41,6 +41,7 @@
55 extern int always_checksum;
56 extern int modify_window;
57 extern char *compare_dest;
58+extern int link_dest;
59
60
61 /* choose whether to skip a particular file */
62@@ -50,6 +51,15 @@
63 if (st->st_size != file->length) {
64 return 0;
65 }
66+ if (link_dest) {
67+ if((st->st_mode & ~_S_IFMT) != (file->mode & ~_S_IFMT)) {
68+ return 0;
69+ }
70+ if (st->st_uid != file->uid || st->st_gid != file->gid) {
71+ return 0;
72+ }
73+ }
74+
75
76 /* if always checksum is set then we use the checksum instead
77 of the file time to determine whether to sync */
78@@ -382,6 +392,17 @@
79 statret = -1;
80 if (statret == -1)
81 errno = saveerrno;
82+#if HAVE_LINK
83+ else if (link_dest)
84+ if (do_link(fnamecmpbuf, fname) != 0) {
85+ if (verbose > 0)
86+ rprintf(FINFO,"link %s => %s : %s\n",
87+ fnamecmpbuf,
88+ fname,
89+ strerror(errno));
90+ fnamecmp = fnamecmpbuf;
91+ }
92+#endif
93 else
94 fnamecmp = fnamecmpbuf;
95 }
96Index: options.c
97===================================================================
98RCS file: /cvsroot/rsync/options.c,v
99retrieving revision 1.89
100diff -u -r1.89 options.c
101--- options.c 19 Mar 2002 20:16:42 -0000 1.89
102+++ options.c 21 Mar 2002 23:31:27 -0000
103@@ -113,6 +113,7 @@
104 char *rsync_path = RSYNC_PATH;
105 char *backup_dir = NULL;
106 int rsync_port = RSYNC_PORT;
107+int link_dest = 0;
108
109 int verbose = 0;
110 int quiet = 0;
111@@ -282,7 +283,7 @@
112 OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
113 OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
114 OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
115- OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST,
116+ OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LINK_DEST,
117 OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
118 OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
119 OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO,
120@@ -341,6 +342,7 @@
121 {"timeout", 0, POPT_ARG_INT, &io_timeout , 0, 0, 0 },
122 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir , 0, 0, 0 },
123 {"compare-dest", 0, POPT_ARG_STRING, &compare_dest , 0, 0, 0 },
124+ {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
125 /* TODO: Should this take an optional int giving the compression level? */
126 {"compress", 'z', POPT_ARG_NONE, &do_compression , 0, 0, 0 },
127 {"daemon", 0, POPT_ARG_NONE, &am_daemon , 0, 0, 0 },
128@@ -562,6 +564,19 @@
129 /* popt stores the filename in batch_prefix for us */
130 read_batch = 1;
131 break;
132+ case OPT_LINK_DEST:
133+#if HAVE_LINK
134+ compare_dest = poptGetOptArg(pc);
135+ link_dest = 1;
136+ break;
137+#else
138+ snprintf(err_buf,sizeof(err_buf),
139+ "hard links are not supported on this %s\n",
140+ am_server ? "server" : "client");
141+ rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
142+ return 0;
143+#endif
144+
145
146 default:
147 /* FIXME: If --daemon is specified, then errors for later
148@@ -785,7 +800,7 @@
149 * and it may be an older version that doesn't know this
150 * option, so don't send it if client is the sender.
151 */
152- args[ac++] = "--compare-dest";
153+ args[ac++] = link_dest ? "--link-dest" : "--compare-dest";
154 args[ac++] = compare_dest;
155 }
156
157Index: rsync.yo
158===================================================================
159RCS file: /cvsroot/rsync/rsync.yo,v
160retrieving revision 1.95
161diff -u -r1.95 rsync.yo
162--- rsync.yo 6 Feb 2002 21:20:49 -0000 1.95
163+++ rsync.yo 21 Mar 2002 23:31:28 -0000
164@@ -261,6 +261,7 @@
165 --modify-window=NUM Timestamp window (seconds) for file match (default=0)
166 -T --temp-dir=DIR create temporary files in directory DIR
167 --compare-dest=DIR also compare destination files relative to DIR
168+ --link-dest=DIR create hardlinks to DIR for unchanged files
169 -P equivalent to --partial --progress
170 -z, --compress compress file data
171 --exclude=PATTERN exclude files matching PATTERN
172@@ -531,6 +532,7 @@
173 option, but instead it adds all exclude patterns listed in the file
174 FILE to the exclude list. Blank lines in FILE and lines starting with
175 ';' or '#' are ignored.
176+If \fIFILE\fP is \fB-\fP the list will be read from standard input.
177
178 dit(bf(--include=PATTERN)) This option tells rsync to not exclude the
179 specified pattern of filenames. This is useful as it allows you to
180@@ -541,6 +543,7 @@
181
182 dit(bf(--include-from=FILE)) This specifies a list of include patterns
183 from a file.
184+If \fIFILE\fP is \fB-\fP the list will be read from standard input.
185
186 dit(bf(-C, --cvs-exclude)) This is a useful shorthand for excluding a
187 broad range of files that you often don't want to transfer between
188@@ -595,6 +598,11 @@
189 --partial because partially transferred files will remain in the new
190 temporary destination until they have a chance to be completed. If DIR is
191 a relative path, it is relative to the destination directory.
192+
193+dit(bf(--link-dest=DIR)) This option behaves like \fB--compare-dest\fP but
194+also will create hard links from \fIDIR\fP to the destination directory for
195+unchanged files. Files with changed ownership or permissions will not be
196+linked.
197
198 dit(bf(-z, --compress)) With this option, rsync compresses any data from
199 the files that it sends to the destination machine. This