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