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