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