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