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