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