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