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