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