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