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