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