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