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