Mention the latest options.
[rsync/rsync.git] / generator.c
CommitLineData
ef1aa910 1/* -*- c-file-style: "linux" -*-
91262d5d
MP
2
3 rsync -- fast file replication program
2cda2560
WD
4
5 Copyright (C) 1996-2000 by Andrew Tridgell
2f03f956 6 Copyright (C) Paul Mackerras 1996
91262d5d 7 Copyright (C) 2002 by Martin Pool <mbp@samba.org>
2cda2560 8
2f03f956
AT
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
2cda2560 13
2f03f956
AT
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
2cda2560 18
2f03f956
AT
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22*/
23
24#include "rsync.h"
25
26extern int verbose;
27extern int dry_run;
beb51aa0 28extern int do_xfers;
6c3862fa
WD
29extern int log_format_has_i;
30extern int log_format_has_o_or_i;
31extern int daemon_log_format_has_i;
32extern int am_root;
33extern int am_server;
34extern int am_daemon;
083acd49 35extern int do_progress;
59faec8b 36extern int recurse;
2f03f956 37extern int relative_paths;
716e73d4 38extern int keep_dirlinks;
2f03f956 39extern int preserve_links;
2f03f956
AT
40extern int preserve_devices;
41extern int preserve_hard_links;
6744b62d
WD
42extern int preserve_perms;
43extern int preserve_uid;
44extern int preserve_gid;
3ea9bbd6
WD
45extern int preserve_times;
46extern int omit_dir_times;
59faec8b 47extern int delete_before;
fa13f396 48extern int delete_during;
59faec8b
WD
49extern int delete_after;
50extern int module_id;
51extern int ignore_errors;
fe960187 52extern int remove_sent_files;
70352269 53extern int delay_updates;
2f03f956 54extern int update_only;
e90aab49
WD
55extern int ignore_existing;
56extern int ignore_non_existing;
cd6aa5b5 57extern int inplace;
6cc11982 58extern int append_mode;
cd6aa5b5 59extern int make_backups;
2f03f956
AT
60extern int csum_length;
61extern int ignore_times;
f83f0548 62extern int size_only;
7d1bfaf7 63extern OFF_T max_size;
02b5cb23 64extern OFF_T min_size;
59faec8b 65extern int io_error;
ac40b747 66extern int allowed_lull;
ee1d11c4 67extern int sock_f_out;
9ac2395b 68extern int ignore_timeout;
d04e9c51 69extern int protocol_version;
8e85be0a 70extern int fuzzy_basis;
2f03f956 71extern int always_checksum;
cfe39780 72extern int checksum_len;
a7260c40 73extern char *partial_dir;
b7e8628c 74extern char *basis_dir[];
2be2fb3e 75extern int compare_dest;
967866d4 76extern int copy_dest;
59c95e42 77extern int link_dest;
5774786f 78extern int whole_file;
5774786f 79extern int list_only;
b9f592fb 80extern int read_batch;
5774786f
WD
81extern int orig_umask;
82extern int safe_symlinks;
a255c592 83extern long block_size; /* "long" because popt can't set an int32. */
59faec8b
WD
84extern int max_delete;
85extern int force_delete;
86extern int one_file_system;
6c3862fa 87extern struct stats stats;
59faec8b
WD
88extern dev_t filesystem_dev;
89extern char *backup_dir;
90extern char *backup_suffix;
91extern int backup_suffix_len;
ee1d11c4 92extern struct file_list *the_file_list;
7842418b 93extern struct filter_list_struct server_filter_list;
97f9dcae 94
59faec8b
WD
95static int deletion_count = 0; /* used to implement --max-delete */
96
97
98static int is_backup_file(char *fn)
99{
100 int k = strlen(fn) - backup_suffix_len;
101 return k > 0 && strcmp(fn+k, backup_suffix) == 0;
102}
103
104
105/* Delete a file or directory. If DEL_FORCE_RECURSE is set in the flags, or if
106 * force_delete is set, this will delete recursively as long as DEL_NO_RECURSE
0e5665d3
WD
107 * is not set in the flags.
108 *
109 * Note that fname must point to a MAXPATHLEN buffer if the mode indicates it's
110 * a directory! (The buffer is used for recursion, but returned unchanged.)
111 */
59faec8b
WD
112static int delete_item(char *fname, int mode, int flags)
113{
114 struct file_list *dirlist;
59faec8b 115 int j, dlen, zap_dir, ok;
0e5665d3 116 unsigned remainder;
59faec8b 117 void *save_filters;
0e5665d3 118 char *p;
59faec8b 119
59faec8b 120 if (!S_ISDIR(mode)) {
f75a53e7
WD
121 if (max_delete && ++deletion_count > max_delete)
122 return 0;
59faec8b
WD
123 if (make_backups && (backup_dir || !is_backup_file(fname)))
124 ok = make_backup(fname);
125 else
126 ok = robust_unlink(fname) == 0;
127 if (ok) {
128 if (!(flags & DEL_TERSE))
129 log_delete(fname, mode);
59faec8b
WD
130 return 0;
131 }
f75a53e7
WD
132 if (errno == ENOENT) {
133 deletion_count--;
59faec8b 134 return 0;
f75a53e7 135 }
59faec8b
WD
136 rsyserr(FERROR, errno, "delete_file: unlink %s failed",
137 full_fname(fname));
138 return -1;
139 }
140
141 zap_dir = (flags & DEL_FORCE_RECURSE || (force_delete && recurse))
142 && !(flags & DEL_NO_RECURSE);
f75a53e7
WD
143 if ((max_delete && ++deletion_count > max_delete)
144 || (dry_run && zap_dir)) {
59faec8b
WD
145 ok = 0;
146 errno = ENOTEMPTY;
147 } else if (make_backups && !backup_dir && !is_backup_file(fname)
148 && !(flags & DEL_FORCE_RECURSE))
149 ok = make_backup(fname);
150 else
151 ok = do_rmdir(fname) == 0;
152 if (ok) {
153 if (!(flags & DEL_TERSE))
154 log_delete(fname, mode);
59faec8b
WD
155 return 0;
156 }
f75a53e7
WD
157 if (errno == ENOENT) {
158 deletion_count--;
59faec8b 159 return 0;
f75a53e7 160 }
26beb786 161 if (!zap_dir) {
59faec8b
WD
162 rsyserr(FERROR, errno, "delete_file: rmdir %s failed",
163 full_fname(fname));
164 return -1;
165 }
f62eaa24 166 flags |= DEL_FORCE_RECURSE; /* mark subdir dels as not "in the way" */
f75a53e7 167 deletion_count--;
59faec8b 168
0e5665d3
WD
169 dlen = strlen(fname);
170 save_filters = push_local_filters(fname, dlen);
171
172 dirlist = get_dirlist(fname, dlen, 0);
173
174 p = fname + dlen;
175 if (dlen != 1 || *fname != '/')
176 *p++ = '/';
177 remainder = MAXPATHLEN - (p - fname);
59faec8b 178
59faec8b
WD
179 for (j = dirlist->count; j--; ) {
180 struct file_struct *fp = dirlist->files[j];
181
182 if (fp->flags & FLAG_MOUNT_POINT)
183 continue;
184
0e5665d3
WD
185 strlcpy(p, fp->basename, remainder);
186 delete_item(fname, fp->mode, flags & ~DEL_TERSE);
59faec8b
WD
187 }
188 flist_free(dirlist);
189
0e5665d3
WD
190 fname[dlen] = '\0';
191
59faec8b
WD
192 pop_local_filters(save_filters);
193
f75a53e7
WD
194 if (max_delete && ++deletion_count > max_delete)
195 return 0;
59faec8b
WD
196
197 if (do_rmdir(fname) == 0) {
198 if (!(flags & DEL_TERSE))
199 log_delete(fname, mode);
4d474ad5 200 } else if (errno != ENOTEMPTY && errno != EEXIST && errno != ENOENT) {
59faec8b
WD
201 rsyserr(FERROR, errno, "delete_file: rmdir %s failed",
202 full_fname(fname));
203 return -1;
204 }
205
206 return 0;
207}
208
209
210/* This function is used to implement per-directory deletion, and is used by
211 * all the --delete-WHEN options. Note that the fbuf pointer must point to a
212 * MAXPATHLEN buffer with the name of the directory in it (the functions we
213 * call will append names onto the end, but the old dir value will be restored
214 * on exit). */
215static void delete_in_dir(struct file_list *flist, char *fbuf,
ee1d11c4 216 struct file_struct *file)
59faec8b
WD
217{
218 static int min_depth = MAXPATHLEN, cur_depth = -1;
219 static void *filt_array[MAXPATHLEN/2+1];
717b0430 220 static int already_warned = 0;
59faec8b
WD
221 struct file_list *dirlist;
222 char delbuf[MAXPATHLEN];
223 STRUCT_STAT st;
468d7668 224 int dlen, i;
59faec8b
WD
225
226 if (!flist) {
227 while (cur_depth >= min_depth)
228 pop_local_filters(filt_array[cur_depth--]);
229 min_depth = MAXPATHLEN;
230 cur_depth = -1;
231 return;
232 }
233
234 if (verbose > 2)
235 rprintf(FINFO, "delete_in_dir(%s)\n", safe_fname(fbuf));
236
237 if (allowed_lull)
ee1d11c4 238 maybe_send_keepalive();
59faec8b
WD
239
240 if (file->dir.depth >= MAXPATHLEN/2+1)
241 return; /* Impossible... */
242
59faec8b 243 if (io_error && !(lp_ignore_errors(module_id) || ignore_errors)) {
717b0430 244 if (already_warned)
f75a53e7 245 return;
59faec8b
WD
246 rprintf(FINFO,
247 "IO error encountered -- skipping file deletion\n");
717b0430 248 already_warned = 1;
59faec8b
WD
249 return;
250 }
251
252 while (cur_depth >= file->dir.depth && cur_depth >= min_depth)
253 pop_local_filters(filt_array[cur_depth--]);
254 cur_depth = file->dir.depth;
255 if (min_depth > cur_depth)
256 min_depth = cur_depth;
257 dlen = strlen(fbuf);
258 filt_array[cur_depth] = push_local_filters(fbuf, dlen);
259
260 if (link_stat(fbuf, &st, keep_dirlinks) < 0)
261 return;
262
468d7668
WD
263 if (one_file_system) {
264 if (file->flags & FLAG_TOP_DIR)
265 filesystem_dev = st.st_dev;
266 else if (filesystem_dev != st.st_dev)
267 return;
268 }
59faec8b
WD
269
270 dirlist = get_dirlist(fbuf, dlen, 0);
271
272 /* If an item in dirlist is not found in flist, delete it
273 * from the filesystem. */
274 for (i = dirlist->count; i--; ) {
f3ab64d3 275 struct file_struct *fp = dirlist->files[i];
6e8b9f13 276 if (!fp->basename || fp->flags & FLAG_MOUNT_POINT)
59faec8b 277 continue;
468d7668 278 if (flist_find(flist, fp) < 0) {
f3ab64d3
WD
279 int mode = fp->mode;
280 f_name_to(fp, delbuf);
26beb786 281 delete_item(delbuf, mode, DEL_FORCE_RECURSE);
468d7668 282 }
59faec8b
WD
283 }
284
285 flist_free(dirlist);
286}
287
288/* This deletes any files on the receiving side that are not present on the
289 * sending side. This is used by --delete-before and --delete-after. */
ee1d11c4 290static void do_delete_pass(struct file_list *flist)
59faec8b
WD
291{
292 char fbuf[MAXPATHLEN];
293 int j;
294
b225b089
WD
295 if (dry_run > 1 /* destination doesn't exist yet */
296 || list_only)
f75a53e7
WD
297 return;
298
59faec8b
WD
299 for (j = 0; j < flist->count; j++) {
300 struct file_struct *file = flist->files[j];
301
302 if (!(file->flags & FLAG_DEL_HERE))
303 continue;
304
305 f_name_to(file, fbuf);
306 if (verbose > 1 && file->flags & FLAG_TOP_DIR)
307 rprintf(FINFO, "deleting in %s\n", safe_fname(fbuf));
308
ee1d11c4 309 delete_in_dir(flist, fbuf, file);
59faec8b 310 }
184dd27a 311 delete_in_dir(NULL, NULL, NULL);
0e5665d3 312
a06e2b7c
WD
313 if (do_progress && !am_server)
314 rprintf(FINFO, " \r");
59faec8b
WD
315}
316
b7e8628c 317static int unchanged_attrs(struct file_struct *file, STRUCT_STAT *st)
2f03f956 318{
b7e8628c
WD
319 if (preserve_perms
320 && (st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS))
84acca07 321 return 0;
bb24028f 322
b7e8628c
WD
323 if (am_root && preserve_uid && st->st_uid != file->uid)
324 return 0;
bb24028f 325
b7e8628c
WD
326 if (preserve_gid && file->gid != GID_NONE && st->st_gid != file->gid)
327 return 0;
328
329 return 1;
330}
331
06a1dbad 332
ee1d11c4 333void itemize(struct file_struct *file, int ndx, int statret, STRUCT_STAT *st,
ef20efcb 334 int32 iflags, uchar fnamecmp_type, char *xname)
06a1dbad 335{
e86ae6bc 336 if (statret == 0) {
c557eb8c
WD
337 if (S_ISREG(file->mode) && file->length != st->st_size)
338 iflags |= ITEM_REPORT_SIZE;
a1d23b53 339 if (!(iflags & ITEM_NO_DEST_AND_NO_UPDATE)) {
88b218fa
WD
340 int keep_time = !preserve_times ? 0
341 : S_ISDIR(file->mode) ? !omit_dir_times
342 : !S_ISLNK(file->mode);
343
215b444c
WD
344 if ((iflags & (ITEM_TRANSFER|ITEM_LOCAL_CHANGE) && !keep_time
345 && (!(iflags & ITEM_XNAME_FOLLOWS) || *xname))
6ff2f4ba 346 || (keep_time && cmp_modtime(file->modtime, st->st_mtime) != 0))
88b218fa 347 iflags |= ITEM_REPORT_TIME;
00b96184
WD
348 if (preserve_perms
349 && (file->mode & CHMOD_BITS) != (st->st_mode & CHMOD_BITS))
88b218fa
WD
350 iflags |= ITEM_REPORT_PERMS;
351 if (preserve_uid && am_root && file->uid != st->st_uid)
352 iflags |= ITEM_REPORT_OWNER;
353 if (preserve_gid && file->gid != GID_NONE
354 && st->st_gid != file->gid)
355 iflags |= ITEM_REPORT_GROUP;
356 }
ef20efcb 357 } else
ee1d11c4 358 iflags |= ITEM_IS_NEW;
c557eb8c 359
a1d23b53 360 iflags &= 0xffff;
ee1d11c4 361 if ((iflags & SIGNIFICANT_ITEM_FLAGS || verbose > 1
ef20efcb 362 || (xname && *xname)) && !read_batch) {
6c3862fa
WD
363 if (protocol_version >= 29) {
364 if (ndx >= 0)
ee1d11c4
WD
365 write_int(sock_f_out, ndx);
366 write_shortint(sock_f_out, iflags);
ef20efcb
WD
367 if (iflags & ITEM_BASIS_TYPE_FOLLOWS)
368 write_byte(sock_f_out, fnamecmp_type);
369 if (iflags & ITEM_XNAME_FOLLOWS)
370 write_vstring(sock_f_out, xname, strlen(xname));
6c3862fa 371 } else if (ndx >= 0)
ef20efcb 372 log_item(file, &stats, iflags, xname);
06a1dbad
WD
373 }
374}
375
376
b7e8628c
WD
377/* Perform our quick-check heuristic for determining if a file is unchanged. */
378static int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
379{
380 if (st->st_size != file->length)
381 return 0;
59c95e42 382
2cda2560 383 /* if always checksum is set then we use the checksum instead
2f03f956
AT
384 of the file time to determine whether to sync */
385 if (always_checksum && S_ISREG(st->st_mode)) {
386 char sum[MD4_SUM_LENGTH];
b7e8628c 387 file_checksum(fn, sum, st->st_size);
cfe39780 388 return memcmp(sum, file->u.sum, checksum_len) == 0;
2f03f956
AT
389 }
390
cc1e997d 391 if (size_only)
84acca07 392 return 1;
2f03f956 393
cc1e997d 394 if (ignore_times)
84acca07 395 return 0;
cc1e997d 396
84acca07 397 return cmp_modtime(st->st_mtime, file->modtime) == 0;
2f03f956
AT
398}
399
400
ec8290c8 401/*
195bd906 402 * set (initialize) the size entries in the per-file sum_struct
ec8290c8 403 * calculating dynamic block and checksum sizes.
195bd906 404 *
ec8290c8 405 * This is only called from generate_and_send_sums() but is a separate
195bd906
S
406 * function to encapsulate the logic.
407 *
408 * The block size is a rounded square root of file length.
409 *
410 * The checksum size is determined according to:
ed7e7955 411 * blocksum_bits = BLOCKSUM_BIAS + 2*log2(file_len) - log2(block_len)
195bd906
S
412 * provided by Donovan Baarda which gives a probability of rsync
413 * algorithm corrupting data and falling back using the whole md4
414 * checksums.
415 *
416 * This might be made one of several selectable heuristics.
417 */
1490812a 418static void sum_sizes_sqroot(struct sum_struct *sum, int64 len)
195bd906 419{
a255c592 420 int32 blength;
da9d12f5 421 int s2length;
195bd906 422
a255c592 423 if (block_size)
195bd906 424 blength = block_size;
a255c592 425 else if (len <= BLOCK_SIZE * BLOCK_SIZE)
195bd906 426 blength = BLOCK_SIZE;
a255c592
WD
427 else {
428 int32 c;
1490812a 429 int64 l;
eae7165c
WD
430 int cnt;
431 for (c = 1, l = len, cnt = 0; l >>= 2; c <<= 1, cnt++) {}
432 if (cnt >= 31 || c >= MAX_BLOCK_SIZE)
433 blength = MAX_BLOCK_SIZE;
434 else {
435 blength = 0;
436 do {
437 blength |= c;
1490812a 438 if (len < (int64)blength * blength)
eae7165c
WD
439 blength &= ~c;
440 c >>= 1;
441 } while (c >= 8); /* round to multiple of 8 */
442 blength = MAX(blength, BLOCK_SIZE);
195bd906 443 }
195bd906
S
444 }
445
d04e9c51 446 if (protocol_version < 27) {
195bd906
S
447 s2length = csum_length;
448 } else if (csum_length == SUM_LENGTH) {
449 s2length = SUM_LENGTH;
450 } else {
a255c592 451 int32 c;
1490812a 452 int64 l;
da9d12f5 453 int b = BLOCKSUM_BIAS;
a255c592
WD
454 for (l = len; l >>= 1; b += 2) {}
455 for (c = blength; c >>= 1 && b; b--) {}
456 /* add a bit, subtract rollsum, round up. */
457 s2length = (b + 1 - 32 + 7) / 8; /* --optimize in compiler-- */
195bd906
S
458 s2length = MAX(s2length, csum_length);
459 s2length = MIN(s2length, SUM_LENGTH);
460 }
461
462 sum->flength = len;
463 sum->blength = blength;
464 sum->s2length = s2length;
a5b786d8
WD
465 sum->remainder = len % blength;
466 sum->count = len / blength + (sum->remainder != 0);
195bd906
S
467
468 if (sum->count && verbose > 2) {
a255c592
WD
469 rprintf(FINFO,
470 "count=%.0f rem=%ld blength=%ld s2length=%d flength=%.0f\n",
471 (double)sum->count, (long)sum->remainder, (long)sum->blength,
da9d12f5 472 sum->s2length, (double)sum->flength);
195bd906
S
473 }
474}
80605142 475
bceec82f 476
80605142
WD
477/*
478 * Generate and send a stream of signatures/checksums that describe a buffer
e66dfd18 479 *
80605142
WD
480 * Generate approximately one checksum every block_len bytes.
481 */
cd6aa5b5 482static void generate_and_send_sums(int fd, OFF_T len, int f_out, int f_copy)
2f03f956 483{
a1cbe76e 484 int32 i;
6e45e1dd 485 struct map_struct *mapbuf;
80605142 486 struct sum_struct sum;
2f03f956
AT
487 OFF_T offset = 0;
488
423dba8e 489 sum_sizes_sqroot(&sum, len);
6cc11982
WD
490 write_sum_head(f_out, &sum);
491
492 if (append_mode > 0 && f_copy < 0)
493 return;
e66dfd18 494
6e45e1dd 495 if (len > 0)
96d910c7 496 mapbuf = map_file(fd, len, MAX_MAP_SIZE, sum.blength);
6e45e1dd
WD
497 else
498 mapbuf = NULL;
499
80605142 500 for (i = 0; i < sum.count; i++) {
a255c592 501 int32 n1 = (int32)MIN(len, (OFF_T)sum.blength);
6e45e1dd 502 char *map = map_ptr(mapbuf, offset, n1);
80605142 503 char sum2[SUM_LENGTH];
6cc11982
WD
504 uint32 sum1;
505
506 len -= n1;
507 offset += n1;
2f03f956 508
6cc11982 509 if (f_copy >= 0) {
cd6aa5b5 510 full_write(f_copy, map, n1);
6cc11982
WD
511 if (append_mode > 0)
512 continue;
513 }
cd6aa5b5 514
6cc11982 515 sum1 = get_checksum1(map, n1);
80605142 516 get_checksum2(map, n1, sum2);
2f03f956 517
80605142 518 if (verbose > 3) {
e66dfd18 519 rprintf(FINFO,
a255c592 520 "chunk[%.0f] offset=%.0f len=%ld sum1=%08lx\n",
6cc11982 521 (double)i, (double)offset - n1, (long)n1,
0e36d9da 522 (unsigned long)sum1);
80605142
WD
523 }
524 write_int(f_out, sum1);
fc0257c9 525 write_buf(f_out, sum2, sum.s2length);
2f03f956 526 }
6e45e1dd
WD
527
528 if (mapbuf)
529 unmap_file(mapbuf);
2f03f956
AT
530}
531
06a1dbad 532
8e85be0a
WD
533/* Try to find a filename in the same dir as "fname" with a similar name. */
534static int find_fuzzy(struct file_struct *file, struct file_list *dirlist)
535{
536 int fname_len, fname_suf_len;
537 const char *fname_suf, *fname = file->basename;
f328e0f3 538 uint32 lowest_dist = 25 << 16; /* ignore a distance greater than 25 */
8e85be0a
WD
539 int j, lowest_j = -1;
540
541 fname_len = strlen(fname);
542 fname_suf = find_filename_suffix(fname, fname_len, &fname_suf_len);
543
544 for (j = 0; j < dirlist->count; j++) {
545 struct file_struct *fp = dirlist->files[j];
546 const char *suf, *name;
547 int len, suf_len;
548 uint32 dist;
549
550 if (!S_ISREG(fp->mode) || !fp->length
551 || fp->flags & FLAG_NO_FUZZY)
552 continue;
553
554 name = fp->basename;
555
556 if (fp->length == file->length
6ff2f4ba 557 && cmp_modtime(fp->modtime, file->modtime) == 0) {
8e85be0a
WD
558 if (verbose > 4) {
559 rprintf(FINFO,
560 "fuzzy size/modtime match for %s\n",
561 name);
562 }
563 return j;
564 }
565
566 len = strlen(name);
567 suf = find_filename_suffix(name, len, &suf_len);
568
569 dist = fuzzy_distance(name, len, fname, fname_len);
570 /* Add some extra weight to how well the suffixes match. */
571 dist += fuzzy_distance(suf, suf_len, fname_suf, fname_suf_len)
572 * 10;
573 if (verbose > 4) {
574 rprintf(FINFO, "fuzzy distance for %s = %d.%05d\n",
575 name, (int)(dist>>16), (int)(dist&0xFFFF));
576 }
577 if (dist <= lowest_dist) {
578 lowest_dist = dist;
579 lowest_j = j;
580 }
581 }
582
583 return lowest_j;
584}
585
ee1d11c4
WD
586void check_for_finished_hlinks(int itemizing, enum logcode code)
587{
588 struct file_struct *file;
589 int ndx;
590
591 while ((ndx = get_hlink_num()) != -1) {
592 if (ndx < 0 || ndx >= the_file_list->count)
593 continue;
594
595 file = the_file_list->files[ndx];
596 if (!file->link_u.links)
597 continue;
598
599 hard_link_cluster(file, ndx, itemizing, code);
600 }
601}
2f03f956 602
ed7e7955
WD
603static int phase = 0;
604
ee1d11c4 605/* Acts on the_file_list->file's ndx'th item, whose name is fname. If a dir,
0492fdfb
WD
606 * make sure it exists, and has the right permissions/timestamp info. For
607 * all other non-regular files (symlinks, etc.) we create them here. For
608 * regular files that have changed, we try to find a basis file and then
609 * start sending checksums.
ef1aa910 610 *
0e5665d3
WD
611 * When fname is non-null, it must point to a MAXPATHLEN buffer!
612 *
0492fdfb
WD
613 * Note that f_out is set to -1 when doing final directory-permission and
614 * modification-time repair. */
ee1d11c4 615static void recv_generator(char *fname, struct file_struct *file, int ndx,
7433d73a 616 int itemizing, int maybe_PERMS_REPORT,
ef20efcb 617 enum logcode code, int f_out)
2cda2560 618{
8174bc35 619 static int missing_below = -1, excluded_below = -1;
7e9059d6 620 static char *fuzzy_dirname = "";
8e85be0a
WD
621 static struct file_list *fuzzy_dirlist = NULL;
622 struct file_struct *fuzzy_file = NULL;
41cfde6b 623 int fd = -1, f_copy = -1;
1f1d368a 624 STRUCT_STAT st, real_st, partial_st;
41cfde6b 625 struct file_struct *back_file = NULL;
1f1d368a 626 int statret, real_ret, stat_errno;
41cfde6b 627 char *fnamecmp, *partialptr, *backupptr = NULL;
375a4556 628 char fnamecmpbuf[MAXPATHLEN];
41cfde6b 629 uchar fnamecmp_type;
f7632fc6 630
dfd5ba6a
WD
631 if (list_only)
632 return;
2f03f956 633
8e85be0a
WD
634 if (!fname) {
635 if (fuzzy_dirlist) {
636 flist_free(fuzzy_dirlist);
637 fuzzy_dirlist = NULL;
7e9059d6 638 fuzzy_dirname = "";
8e85be0a
WD
639 }
640 if (missing_below >= 0) {
641 dry_run--;
642 missing_below = -1;
643 }
644 return;
645 }
646
4875d6b6
WD
647 if (verbose > 2) {
648 rprintf(FINFO, "recv_generator(%s,%d)\n",
649 safe_fname(fname), ndx);
650 }
2f03f956 651
8174bc35
WD
652 if (server_filter_list.head) {
653 if (excluded_below >= 0) {
654 if (file->dir.depth > excluded_below)
655 goto skipping;
656 excluded_below = -1;
657 }
658 if (check_filter(&server_filter_list, fname,
659 S_ISDIR(file->mode)) < 0) {
660 if (S_ISDIR(file->mode))
661 excluded_below = file->dir.depth;
b2e7c913 662 skipping:
8174bc35
WD
663 if (verbose) {
664 rprintf(FINFO,
665 "skipping server-excluded file \"%s\"\n",
666 safe_fname(fname));
667 }
668 return;
3e35c34b 669 }
3e35c34b 670 }
97f9dcae 671
8e85be0a 672 if (missing_below >= 0 && file->dir.depth <= missing_below) {
df337831
WD
673 dry_run--;
674 missing_below = -1;
675 }
73f7af0e
WD
676 if (dry_run > 1) {
677 statret = -1;
678 stat_errno = ENOENT;
679 } else {
8e85be0a
WD
680 if (fuzzy_basis && S_ISREG(file->mode)) {
681 char *dn = file->dirname ? file->dirname : ".";
ccc51c83
WD
682 if (fuzzy_dirname != dn
683 && strcmp(fuzzy_dirname, dn) != 0) {
8e85be0a
WD
684 if (fuzzy_dirlist)
685 flist_free(fuzzy_dirlist);
ccc51c83 686 fuzzy_dirlist = get_dirlist(dn, -1, 1);
8e85be0a 687 }
ccc51c83 688 fuzzy_dirname = dn;
8e85be0a
WD
689 }
690
73f7af0e
WD
691 statret = link_stat(fname, &st,
692 keep_dirlinks && S_ISDIR(file->mode));
693 stat_errno = errno;
694 }
63787382 695
e90aab49 696 if (ignore_non_existing && statret == -1 && stat_errno == ENOENT) {
ecc81fce 697 if (verbose > 1) {
15164c0a
WD
698 rprintf(FINFO, "not creating new %s \"%s\"\n",
699 S_ISDIR(file->mode) ? "directory" : "file",
ecc81fce
WD
700 safe_fname(fname));
701 }
1347d512
AT
702 return;
703 }
704
d9b4d267
WD
705 if (statret == 0 && !preserve_perms
706 && S_ISDIR(st.st_mode) == S_ISDIR(file->mode)) {
4df9f368 707 /* if the file exists already and we aren't perserving
2cda2560
WD
708 * permissions then act as though the remote end sent
709 * us the file permissions we already have */
67e78a82
WD
710 file->mode = (file->mode & ~CHMOD_BITS)
711 | (st.st_mode & CHMOD_BITS);
4df9f368
AT
712 }
713
2f03f956 714 if (S_ISDIR(file->mode)) {
2cda2560
WD
715 /* The file to be received is a directory, so we need
716 * to prepare appropriately. If there is already a
717 * file of that name and it is *not* a directory, then
718 * we need to delete it. If it doesn't exist, then
027428eb 719 * (perhaps recursively) create it. */
2f03f956 720 if (statret == 0 && !S_ISDIR(st.st_mode)) {
1f1d368a
WD
721 if (delete_item(fname, st.st_mode, DEL_TERSE) < 0)
722 return;
2f03f956
AT
723 statret = -1;
724 }
df337831
WD
725 if (dry_run && statret != 0 && missing_below < 0) {
726 missing_below = file->dir.depth;
727 dry_run++;
728 }
ee1d11c4
WD
729 if (itemizing && f_out != -1) {
730 itemize(file, ndx, statret, &st,
ef20efcb 731 statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL);
ee1d11c4 732 }
00b96184 733 if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) {
027428eb
WD
734 if (!relative_paths || errno != ENOENT
735 || create_directory_path(fname, orig_umask) < 0
09290693 736 || (do_mkdir(fname, file->mode) < 0 && errno != EEXIST)) {
d62bcc17
WD
737 rsyserr(FERROR, errno,
738 "recv_generator: mkdir %s failed",
739 full_fname(fname));
2f03f956
AT
740 }
741 }
716e73d4 742 if (set_perms(fname, file, statret ? NULL : &st, 0)
6c3862fa
WD
743 && verbose && code && f_out != -1)
744 rprintf(code, "%s/\n", safe_fname(fname));
f75a53e7 745 if (delete_during && f_out != -1 && !phase && dry_run < 2
31937d36 746 && (file->flags & FLAG_DEL_HERE))
ee1d11c4 747 delete_in_dir(the_file_list, fname, file);
2f03f956 748 return;
06a1dbad 749 }
6c3862fa 750
273a7ed5
WD
751 if (preserve_hard_links && file->link_u.links
752 && hard_link_check(file, ndx, fname, statret, &st,
753 itemizing, code, HL_CHECK_MASTER))
754 return;
755
2f03f956 756 if (preserve_links && S_ISLNK(file->mode)) {
4f5b0756 757#ifdef SUPPORT_LINKS
728d0922 758 if (safe_symlinks && unsafe_symlink(file->u.link, fname)) {
2f03f956 759 if (verbose) {
2a5d5a8c
WD
760 if (the_file_list->count == 1)
761 fname = f_name(file);
4875d6b6
WD
762 rprintf(FINFO,
763 "ignoring unsafe symlink %s -> \"%s\"\n",
764 full_fname(fname),
765 safe_fname(file->u.link));
2f03f956
AT
766 }
767 return;
768 }
769 if (statret == 0) {
7e38410e
WD
770 char lnk[MAXPATHLEN];
771 int len;
772
8a8356b7 773 if (!S_ISDIR(st.st_mode)
7e38410e
WD
774 && (len = readlink(fname, lnk, MAXPATHLEN-1)) > 0) {
775 lnk[len] = 0;
85d4d142
MP
776 /* A link already pointing to the
777 * right place -- no further action
778 * required. */
7e38410e 779 if (strcmp(lnk, file->u.link) == 0) {
6c3862fa 780 if (itemizing) {
ee1d11c4 781 itemize(file, ndx, 0, &st, 0,
ef20efcb 782 0, NULL);
c557eb8c 783 }
c41b52c4 784 set_perms(fname, file, &st,
8a8356b7 785 maybe_PERMS_REPORT);
273a7ed5
WD
786 if (preserve_hard_links
787 && file->link_u.links) {
788 hard_link_cluster(file, ndx,
789 itemizing,
790 code);
791 }
2f03f956
AT
792 return;
793 }
2cda2560 794 }
7e38410e
WD
795 /* Not the right symlink (or not a symlink), so
796 * delete it. */
1f1d368a
WD
797 if (delete_item(fname, st.st_mode, DEL_TERSE) < 0)
798 return;
799 if (!S_ISLNK(st.st_mode))
88b218fa 800 statret = -1;
2f03f956 801 }
273a7ed5
WD
802 if (preserve_hard_links && file->link_u.links
803 && hard_link_check(file, ndx, fname, -1, &st,
804 itemizing, code, HL_SKIP))
805 return;
728d0922 806 if (do_symlink(file->u.link,fname) != 0) {
d62bcc17 807 rsyserr(FERROR, errno, "symlink %s -> \"%s\" failed",
ecc81fce 808 full_fname(fname), safe_fname(file->u.link));
2f03f956
AT
809 } else {
810 set_perms(fname,file,NULL,0);
6c3862fa 811 if (itemizing) {
ee1d11c4 812 itemize(file, ndx, statret, &st,
ef20efcb 813 ITEM_LOCAL_CHANGE, 0, NULL);
6c3862fa
WD
814 }
815 if (code && verbose) {
816 rprintf(code, "%s -> %s\n", safe_fname(fname),
c557eb8c 817 safe_fname(file->u.link));
2f03f956 818 }
fe960187
WD
819 if (remove_sent_files && !dry_run) {
820 char numbuf[4];
821 SIVAL(numbuf, 0, ndx);
822 send_msg(MSG_SUCCESS, numbuf, 4);
823 }
273a7ed5
WD
824 if (preserve_hard_links && file->link_u.links)
825 hard_link_cluster(file, ndx, itemizing, code);
2f03f956
AT
826 }
827#endif
828 return;
829 }
830
2f03f956 831 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
15cf186b
WD
832 if (statret != 0
833 || (st.st_mode & ~CHMOD_BITS) != (file->mode & ~CHMOD_BITS)
834 || st.st_rdev != file->u.rdev) {
0fdb1aa8
WD
835 if (statret == 0
836 && delete_item(fname, st.st_mode, DEL_TERSE) < 0)
1f1d368a 837 return;
273a7ed5
WD
838 if (preserve_hard_links && file->link_u.links
839 && hard_link_check(file, ndx, fname, -1, &st,
840 itemizing, code, HL_SKIP))
841 return;
59faec8b 842 if (!IS_DEVICE(st.st_mode))
88b218fa 843 statret = -1;
d62bcc17 844 if (verbose > 2) {
2f03f956 845 rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
ecc81fce
WD
846 safe_fname(fname),
847 (int)file->mode, (int)file->u.rdev);
d62bcc17 848 }
00b96184 849 if (do_mknod(fname,file->mode,file->u.rdev) < 0) {
d62bcc17
WD
850 rsyserr(FERROR, errno, "mknod %s failed",
851 full_fname(fname));
2f03f956
AT
852 } else {
853 set_perms(fname,file,NULL,0);
6c3862fa 854 if (itemizing) {
ee1d11c4 855 itemize(file, ndx, statret, &st,
ef20efcb 856 ITEM_LOCAL_CHANGE, 0, NULL);
6c3862fa
WD
857 }
858 if (code && verbose) {
859 rprintf(code, "%s\n",
ecc81fce
WD
860 safe_fname(fname));
861 }
273a7ed5
WD
862 if (preserve_hard_links && file->link_u.links) {
863 hard_link_cluster(file, ndx,
864 itemizing, code);
865 }
2f03f956
AT
866 }
867 } else {
ee1d11c4 868 if (itemizing)
ef20efcb 869 itemize(file, ndx, statret, &st, 0, 0, NULL);
8a8356b7 870 set_perms(fname, file, &st, maybe_PERMS_REPORT);
273a7ed5
WD
871 if (preserve_hard_links && file->link_u.links)
872 hard_link_cluster(file, ndx, itemizing, code);
2f03f956
AT
873 }
874 return;
875 }
2f03f956 876
2f03f956 877 if (!S_ISREG(file->mode)) {
2a5d5a8c
WD
878 if (the_file_list->count == 1)
879 fname = f_name(file);
ecc81fce
WD
880 rprintf(FINFO, "skipping non-regular file \"%s\"\n",
881 safe_fname(fname));
2f03f956
AT
882 return;
883 }
884
289a3216
WD
885 if (max_size && file->length > max_size) {
886 if (verbose > 1) {
887 if (the_file_list->count == 1)
888 fname = f_name(file);
889 rprintf(FINFO, "%s is over max-size\n",
890 safe_fname(fname));
891 }
892 return;
893 }
02b5cb23
WD
894 if (min_size && file->length < min_size) {
895 if (verbose > 1) {
896 if (the_file_list->count == 1)
897 fname = f_name(file);
898 rprintf(FINFO, "%s is under min-size\n",
899 safe_fname(fname));
900 }
901 return;
902 }
289a3216 903
e90aab49 904 if (ignore_existing && statret == 0) {
c3cbcfb8
WD
905 if (verbose > 1)
906 rprintf(FINFO, "%s exists\n", safe_fname(fname));
907 return;
908 }
909
910 if (update_only && statret == 0
911 && cmp_modtime(st.st_mtime, file->modtime) > 0) {
912 if (verbose > 1)
913 rprintf(FINFO, "%s is newer\n", safe_fname(fname));
914 return;
915 }
916
375a4556 917 fnamecmp = fname;
41cfde6b 918 fnamecmp_type = FNAMECMP_FNAME;
375a4556 919
1f1d368a
WD
920 if (statret == 0 && !S_ISREG(st.st_mode)) {
921 if (delete_item(fname, st.st_mode, DEL_TERSE) != 0)
922 return;
923 statret = -1;
924 stat_errno = ENOENT;
925 }
926
06a1dbad 927 if (statret != 0 && basis_dir[0] != NULL) {
aef98825 928 int best_match = -1;
b7e8628c
WD
929 int match_level = 0;
930 int i = 0;
931 do {
932 pathjoin(fnamecmpbuf, sizeof fnamecmpbuf,
933 basis_dir[i], fname);
aef98825
WD
934 if (link_stat(fnamecmpbuf, &st, 0) < 0
935 || !S_ISREG(st.st_mode))
936 continue;
937 switch (match_level) {
938 case 0:
939 best_match = i;
940 match_level = 1;
aef98825
WD
941 /* FALL THROUGH */
942 case 1:
943 if (!unchanged_file(fnamecmpbuf, file, &st))
944 continue;
945 best_match = i;
946 match_level = 2;
967866d4
WD
947 if (copy_dest)
948 break;
aef98825
WD
949 /* FALL THROUGH */
950 case 2:
951 if (!unchanged_attrs(file, &st))
952 continue;
953 best_match = i;
b7e8628c
WD
954 match_level = 3;
955 break;
956 }
aef98825 957 break;
b7e8628c 958 } while (basis_dir[++i] != NULL);
aef98825 959 if (match_level) {
9ba46343 960 statret = 0;
aef98825
WD
961 if (i != best_match) {
962 i = best_match;
b7e8628c
WD
963 pathjoin(fnamecmpbuf, sizeof fnamecmpbuf,
964 basis_dir[i], fname);
9ba46343
WD
965 if (link_stat(fnamecmpbuf, &st, 0) < 0) {
966 match_level = 0;
967 statret = -1;
a1d23b53 968 stat_errno = errno;
9ba46343 969 }
b7e8628c 970 }
4f5b0756 971#ifdef HAVE_LINK
ee1d11c4
WD
972 if (link_dest && match_level == 3) {
973 if (hard_link_one(file, ndx, fname, -1, &st,
974 fnamecmpbuf, 1,
975 itemizing && verbose > 1,
3556fe5d
WD
976 code) == 0) {
977 if (preserve_hard_links
978 && file->link_u.links) {
979 hard_link_cluster(file, ndx,
980 itemizing,
981 code);
982 }
ee1d11c4 983 return;
3556fe5d 984 }
e2243317 985 match_level = 2;
70b54e4e 986 }
59c95e42 987#endif
967866d4
WD
988 if (match_level == 2) {
989 /* Copy the file locally. */
990 if (copy_file(fnamecmpbuf, fname, file->mode) < 0) {
991 if (verbose) {
992 rsyserr(FINFO, errno,
993 "copy_file %s => %s",
994 full_fname(fnamecmpbuf),
995 safe_fname(fname));
996 }
997 match_level = 0;
998 statret = -1;
552a2184
WD
999 } else {
1000 if (itemizing) {
1001 itemize(file, ndx, 0, &st,
1002 ITEM_LOCAL_CHANGE, 0,
1003 NULL);
1004 } else if (verbose && code) {
1005 rprintf(code, "%s\n",
1006 safe_fname(fname));
1007 }
1008 set_perms(fname, file, NULL,
1009 maybe_PERMS_REPORT);
1010 if (preserve_hard_links
1011 && file->link_u.links) {
1012 hard_link_cluster(file, ndx,
1013 itemizing,
1014 code);
1015 }
1016 return;
1017 }
967866d4 1018 } else if (compare_dest || match_level == 1) {
e7d13fe5 1019 fnamecmp = fnamecmpbuf;
2be2fb3e 1020 fnamecmp_type = i;
41cfde6b 1021 }
e7d13fe5
WD
1022 }
1023 }
1024
1f1d368a
WD
1025 real_ret = statret;
1026 real_st = st;
375a4556 1027
9d954dca 1028 if (partial_dir && (partialptr = partial_dir_fname(fname)) != NULL
72c19bb3
WD
1029 && link_stat(partialptr, &partial_st, 0) == 0
1030 && S_ISREG(partial_st.st_mode)) {
06a1dbad 1031 if (statret != 0)
72c19bb3
WD
1032 goto prepare_to_open;
1033 } else
1034 partialptr = NULL;
89f7eff3 1035
06a1dbad 1036 if (statret != 0 && fuzzy_basis && dry_run <= 1) {
8e85be0a
WD
1037 int j = find_fuzzy(file, fuzzy_dirlist);
1038 if (j >= 0) {
1039 fuzzy_file = fuzzy_dirlist->files[j];
1040 f_name_to(fuzzy_file, fnamecmpbuf);
1041 if (verbose > 2) {
1042 rprintf(FINFO, "fuzzy basis selected for %s: %s\n",
1043 safe_fname(fname), safe_fname(fnamecmpbuf));
1044 }
8e85be0a 1045 st.st_size = fuzzy_file->length;
8e85be0a
WD
1046 statret = 0;
1047 fnamecmp = fnamecmpbuf;
1048 fnamecmp_type = FNAMECMP_FUZZY;
1049 }
1050 }
1051
06a1dbad 1052 if (statret != 0) {
273a7ed5 1053 if (preserve_hard_links && file->link_u.links
d8169e6f
WD
1054 && hard_link_check(file, ndx, fname, statret, &st,
1055 itemizing, code, HL_SKIP))
6dff5992 1056 return;
41cfde6b
WD
1057 if (stat_errno == ENOENT)
1058 goto notify_others;
991daf00
WD
1059 rsyserr(FERROR, stat_errno, "recv_generator: failed to stat %s",
1060 full_fname(fname));
2f03f956
AT
1061 return;
1062 }
1063
6cc11982
WD
1064 if (append_mode && st.st_size > file->length)
1065 return;
1066
2be2fb3e 1067 if (!compare_dest && fnamecmp_type <= FNAMECMP_BASIS_DIR_HIGH)
b7e8628c 1068 ;
8e85be0a
WD
1069 else if (fnamecmp_type == FNAMECMP_FUZZY)
1070 ;
b7e8628c 1071 else if (unchanged_file(fnamecmp, file, &st)) {
d8b108c2
WD
1072 if (partialptr) {
1073 do_unlink(partialptr);
1074 handle_partial_dir(partialptr, PDIR_DELETE);
1075 }
a1d23b53 1076 if (fnamecmp_type == FNAMECMP_FNAME) {
1f1d368a
WD
1077 if (itemizing) {
1078 itemize(file, ndx, real_ret, &real_st,
1079 0, 0, NULL);
1080 }
a1d23b53 1081 set_perms(fname, file, &st, maybe_PERMS_REPORT);
ee1d11c4
WD
1082 if (preserve_hard_links && file->link_u.links)
1083 hard_link_cluster(file, ndx, itemizing, code);
a1d23b53
WD
1084 return;
1085 }
1086 /* Only --compare-dest gets here. */
967866d4
WD
1087 itemize(file, ndx, real_ret, &real_st,
1088 ITEM_NO_DEST_AND_NO_UPDATE, 0, NULL);
1089 return;
2f03f956
AT
1090 }
1091
b2e7c913 1092 prepare_to_open:
9d954dca
WD
1093 if (partialptr) {
1094 st = partial_st;
1095 fnamecmp = partialptr;
1096 fnamecmp_type = FNAMECMP_PARTIAL_DIR;
1097 statret = 0;
1098 }
1099
beb51aa0 1100 if (!do_xfers || read_batch || whole_file)
3841a04e 1101 goto notify_others;
2f03f956 1102
8e85be0a
WD
1103 if (fuzzy_basis) {
1104 int j = flist_find(fuzzy_dirlist, file);
1105 if (j >= 0) /* don't use changing file as future fuzzy basis */
1106 fuzzy_dirlist->files[j]->flags |= FLAG_NO_FUZZY;
1107 }
1108
2cda2560 1109 /* open the file */
8c9fd200 1110 fd = do_open(fnamecmp, O_RDONLY, 0);
2f03f956
AT
1111
1112 if (fd == -1) {
d62bcc17
WD
1113 rsyserr(FERROR, errno, "failed to open %s, continuing",
1114 full_fname(fnamecmp));
b2e7c913 1115 pretend_missing:
60be6acf 1116 /* pretend the file didn't exist */
273a7ed5 1117 if (preserve_hard_links && file->link_u.links
d8169e6f
WD
1118 && hard_link_check(file, ndx, fname, statret, &st,
1119 itemizing, code, HL_SKIP))
6dff5992 1120 return;
1f1d368a 1121 statret = real_ret = -1;
41cfde6b 1122 goto notify_others;
2f03f956
AT
1123 }
1124
ef20efcb 1125 if (inplace && make_backups && fnamecmp_type == FNAMECMP_FNAME) {
cd6aa5b5
WD
1126 if (!(backupptr = get_backup_name(fname))) {
1127 close(fd);
1128 return;
1129 }
7842418b 1130 if (!(back_file = make_file(fname, NULL, NO_FILTERS))) {
cd6aa5b5
WD
1131 close(fd);
1132 goto pretend_missing;
1133 }
1134 if (robust_unlink(backupptr) && errno != ENOENT) {
1135 rsyserr(FERROR, errno, "unlink %s",
1136 full_fname(backupptr));
1137 free(back_file);
1138 close(fd);
1139 return;
1140 }
1141 if ((f_copy = do_open(backupptr,
1142 O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0) {
1143 rsyserr(FERROR, errno, "open %s",
1144 full_fname(backupptr));
1145 free(back_file);
1146 close(fd);
1147 return;
1148 }
41cfde6b 1149 fnamecmp_type = FNAMECMP_BACKUP;
cd6aa5b5
WD
1150 }
1151
dfd5ba6a 1152 if (verbose > 3) {
ecc81fce
WD
1153 rprintf(FINFO, "gen mapped %s of size %.0f\n",
1154 safe_fname(fnamecmp), (double)st.st_size);
dfd5ba6a 1155 }
2f03f956 1156
2f03f956 1157 if (verbose > 2)
0492fdfb 1158 rprintf(FINFO, "generating and sending sums for %d\n", ndx);
2f03f956 1159
b2e7c913 1160 notify_others:
0492fdfb 1161 write_int(f_out, ndx);
6c3862fa 1162 if (itemizing) {
ee1d11c4 1163 int iflags = ITEM_TRANSFER;
8237f930 1164 if (always_checksum)
a1d23b53 1165 iflags |= ITEM_REPORT_CHECKSUM;
352963dd 1166 if (fnamecmp_type != FNAMECMP_FNAME)
ef20efcb
WD
1167 iflags |= ITEM_BASIS_TYPE_FOLLOWS;
1168 if (fnamecmp_type == FNAMECMP_FUZZY)
1169 iflags |= ITEM_XNAME_FOLLOWS;
1f1d368a 1170 itemize(file, -1, real_ret, &real_st, iflags, fnamecmp_type,
ef20efcb 1171 fuzzy_file ? fuzzy_file->basename : NULL);
8e85be0a 1172 }
cd6aa5b5 1173
beb51aa0 1174 if (!do_xfers) {
ee1d11c4
WD
1175 if (preserve_hard_links && file->link_u.links)
1176 hard_link_cluster(file, ndx, itemizing, code);
1177 return;
1178 }
1179 if (read_batch)
41cfde6b
WD
1180 return;
1181
33ab4ad8 1182 if (statret != 0 || whole_file) {
e86ae6bc
WD
1183 write_sum_head(f_out, NULL);
1184 return;
1185 }
1186
1187 generate_and_send_sums(fd, st.st_size, f_out, f_copy);
1188
1189 if (f_copy >= 0) {
1190 close(f_copy);
1191 set_perms(backupptr, back_file, NULL, 0);
1192 if (verbose > 1) {
1193 rprintf(FINFO, "backed up %s to %s\n",
1194 safe_fname(fname), safe_fname(backupptr));
41cfde6b 1195 }
e86ae6bc
WD
1196 free(back_file);
1197 }
41cfde6b 1198
e86ae6bc 1199 close(fd);
2f03f956
AT
1200}
1201
1202
ef20efcb 1203void generate_files(int f_out, struct file_list *flist, char *local_name)
2f03f956 1204{
ac40b747 1205 int i;
968c8030 1206 char fbuf[MAXPATHLEN];
7433d73a
WD
1207 int itemizing, maybe_PERMS_REPORT;
1208 enum logcode code;
ac40b747 1209 int lull_mod = allowed_lull * 5;
3ea9bbd6
WD
1210 int need_retouch_dir_times = preserve_times && !omit_dir_times;
1211 int need_retouch_dir_perms = 0;
e90aab49
WD
1212 int save_ignore_existing = ignore_existing;
1213 int save_ignore_non_existing = ignore_non_existing;
083acd49 1214 int save_do_progress = do_progress;
cd908ef4 1215 int save_make_backups = make_backups;
ee1d11c4 1216
7433d73a
WD
1217 if (protocol_version >= 29) {
1218 itemizing = 1;
1219 maybe_PERMS_REPORT = log_format_has_i ? 0 : PERMS_REPORT;
1220 code = daemon_log_format_has_i ? 0 : FLOG;
1221 } else if (am_daemon) {
beb51aa0 1222 itemizing = daemon_log_format_has_i && do_xfers;
7433d73a 1223 maybe_PERMS_REPORT = PERMS_REPORT;
beb51aa0 1224 code = itemizing || !do_xfers ? FCLIENT : FINFO;
7433d73a
WD
1225 } else if (!am_server) {
1226 itemizing = log_format_has_i;
1227 maybe_PERMS_REPORT = log_format_has_i ? 0 : PERMS_REPORT;
1228 code = itemizing ? 0 : FINFO;
1229 } else {
1230 itemizing = 0;
1231 maybe_PERMS_REPORT = PERMS_REPORT;
1232 code = FINFO;
1233 }
2f03f956 1234
45e08edb
WD
1235 if (verbose > 2) {
1236 rprintf(FINFO, "generator starting pid=%ld count=%d\n",
1237 (long)getpid(), flist->count);
1238 }
2f03f956 1239
59faec8b 1240 if (delete_before && !local_name && flist->count > 0)
ee1d11c4 1241 do_delete_pass(flist);
083acd49 1242 do_progress = 0;
59faec8b 1243
6cc11982 1244 if (append_mode || whole_file < 0)
33ab4ad8 1245 whole_file = 0;
3e7053ac 1246 if (verbose >= 2) {
1b1fef20 1247 rprintf(FINFO, "delta-transmission %s\n",
33ab4ad8 1248 whole_file
1b1fef20
WD
1249 ? "disabled for local transfer or --whole-file"
1250 : "enabled");
3e7053ac 1251 }
2cda2560 1252
513fd04d
WD
1253 /* Since we often fill up the outgoing socket and then just sit around
1254 * waiting for the other 2 processes to do their thing, we don't want
1255 * to exit on a timeout. If the data stops flowing, the receiver will
1256 * notice that and let us know via the redo pipe (or its closing). */
1257 ignore_timeout = 1;
a57873b7 1258
2f03f956
AT
1259 for (i = 0; i < flist->count; i++) {
1260 struct file_struct *file = flist->files[i];
2f03f956 1261
dfd5ba6a
WD
1262 if (!file->basename)
1263 continue;
0492fdfb 1264
0e5665d3
WD
1265 if (local_name)
1266 strlcpy(fbuf, local_name, sizeof fbuf);
1267 else
1268 f_name_to(file, fbuf);
1269 recv_generator(fbuf, file, i, itemizing, maybe_PERMS_REPORT,
1270 code, f_out);
1f7e29b9 1271
0492fdfb
WD
1272 /* We need to ensure that any dirs we create have writeable
1273 * permissions during the time we are putting files within
1274 * them. This is then fixed after the transfer is done. */
00b96184 1275#ifdef HAVE_CHMOD
41b84ce0
WD
1276 if (!am_root && S_ISDIR(file->mode) && !(file->mode & S_IWUSR)
1277 && !list_only) {
1f7e29b9
WD
1278 int mode = file->mode | S_IWUSR; /* user write */
1279 char *fname = local_name ? local_name : fbuf;
00b96184 1280 if (do_chmod(fname, mode) < 0) {
1f7e29b9
WD
1281 rsyserr(FERROR, errno,
1282 "failed to modify permissions on %s",
1283 full_fname(fname));
1284 }
3ea9bbd6 1285 need_retouch_dir_perms = 1;
2f03f956 1286 }
00b96184 1287#endif
2f03f956 1288
ee1d11c4
WD
1289 if (preserve_hard_links)
1290 check_for_finished_hlinks(itemizing, code);
9ac2395b 1291
18a11cfd 1292 if (allowed_lull && !(i % lull_mod))
ee1d11c4 1293 maybe_send_keepalive();
c2523a05 1294 else if (!(i % 200))
417099fa 1295 maybe_flush_socket();
2f03f956 1296 }
ef20efcb 1297 recv_generator(NULL, NULL, 0, 0, 0, code, -1);
c93fad5e 1298 if (delete_during)
ee1d11c4 1299 delete_in_dir(NULL, NULL, NULL);
2f03f956
AT
1300
1301 phase++;
1302 csum_length = SUM_LENGTH;
02b5cb23 1303 max_size = min_size = ignore_existing = ignore_non_existing = 0;
0492fdfb 1304 update_only = always_checksum = size_only = 0;
e1f67417 1305 ignore_times = 1;
6cc11982
WD
1306 if (append_mode) /* resend w/o append mode */
1307 append_mode = -1; /* ... but only longer files */
e6bc6f42 1308 make_backups = 0; /* avoid a duplicate backup for inplace processing */
2f03f956
AT
1309
1310 if (verbose > 2)
1311 rprintf(FINFO,"generate_files phase=%d\n",phase);
1312
7daccb8e 1313 write_int(f_out, -1);
2f03f956 1314
bc63ae3f
S
1315 /* files can cycle through the system more than once
1316 * to catch initial checksum errors */
ee1d11c4 1317 while ((i = get_redo_num(itemizing, code)) != -1) {
bc63ae3f 1318 struct file_struct *file = flist->files[i];
0e5665d3
WD
1319 if (local_name)
1320 strlcpy(fbuf, local_name, sizeof fbuf);
1321 else
1322 f_name_to(file, fbuf);
1323 recv_generator(fbuf, file, i, itemizing, maybe_PERMS_REPORT,
1324 code, f_out);
bc63ae3f 1325 }
2f03f956 1326
bc63ae3f 1327 phase++;
e90aab49
WD
1328 ignore_non_existing = save_ignore_non_existing;
1329 ignore_existing = save_ignore_existing;
cd908ef4 1330 make_backups = save_make_backups;
0492fdfb 1331
bc63ae3f
S
1332 if (verbose > 2)
1333 rprintf(FINFO,"generate_files phase=%d\n",phase);
2f03f956 1334
7daccb8e 1335 write_int(f_out, -1);
70352269
WD
1336 /* Reduce round-trip lag-time for a useless delay-updates phase. */
1337 if (protocol_version >= 29 && !delay_updates)
1338 write_int(f_out, -1);
6dff5992 1339
0438f100 1340 /* Read MSG_DONE for the redo phase (and any prior messages). */
ee1d11c4 1341 get_redo_num(itemizing, code);
6dff5992 1342
0438f100
WD
1343 if (protocol_version >= 29) {
1344 phase++;
1345 if (verbose > 2)
1346 rprintf(FINFO, "generate_files phase=%d\n", phase);
70352269
WD
1347 if (delay_updates)
1348 write_int(f_out, -1);
1349 /* Read MSG_DONE for delay-updates phase & prior messages. */
0438f100
WD
1350 get_redo_num(itemizing, code);
1351 }
1352
083acd49 1353 do_progress = save_do_progress;
59faec8b 1354 if (delete_after && !local_name && flist->count > 0)
ee1d11c4 1355 do_delete_pass(flist);
59faec8b 1356
0492fdfb
WD
1357 if ((need_retouch_dir_perms || need_retouch_dir_times)
1358 && !list_only && !local_name && !dry_run) {
18a11cfd 1359 int j = 0;
3ea9bbd6
WD
1360 /* Now we need to fix any directory permissions that were
1361 * modified during the transfer and/or re-set any tweaked
1362 * modified-time values. */
1363 for (i = 0; i < flist->count; i++) {
1364 struct file_struct *file = flist->files[i];
1365 if (!file->basename || !S_ISDIR(file->mode))
1366 continue;
1367 if (!need_retouch_dir_times && file->mode & S_IWUSR)
1368 continue;
62f9573f
WD
1369 recv_generator(f_name(file), file, i, itemizing,
1370 maybe_PERMS_REPORT, code, -1);
417099fa 1371 if (allowed_lull && !(++j % lull_mod))
ee1d11c4 1372 maybe_send_keepalive();
c2523a05 1373 else if (!(j % 200))
417099fa 1374 maybe_flush_socket();
3ea9bbd6 1375 }
6dff5992 1376 }
ef20efcb 1377 recv_generator(NULL, NULL, 0, 0, 0, code, -1);
6dff5992 1378
f75a53e7
WD
1379 if (max_delete > 0 && deletion_count > max_delete) {
1380 rprintf(FINFO,
1381 "Deletions stopped due to --max-delete limit (%d skipped)\n",
1382 deletion_count - max_delete);
1383 io_error |= IOERR_DEL_LIMIT;
1384 }
1385
6dff5992
WD
1386 if (verbose > 2)
1387 rprintf(FINFO,"generate_files finished\n");
2f03f956 1388}