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