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