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