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