Fixed a newly-introduced problem in read_timeout() where FD_ZERO(&w_fds)
[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;
28extern int relative_paths;
716e73d4 29extern int keep_dirlinks;
2f03f956
AT
30extern int preserve_links;
31extern int am_root;
32extern int preserve_devices;
33extern int preserve_hard_links;
6744b62d
WD
34extern int preserve_perms;
35extern int preserve_uid;
36extern int preserve_gid;
2f03f956 37extern int update_only;
3d6feada 38extern int opt_ignore_existing;
2f03f956
AT
39extern int csum_length;
40extern int ignore_times;
f83f0548 41extern int size_only;
2f03f956 42extern int io_timeout;
d04e9c51 43extern int protocol_version;
2f03f956 44extern int always_checksum;
60c8d7bc 45extern char *compare_dest;
59c95e42 46extern int link_dest;
5774786f
WD
47extern int whole_file;
48extern int local_server;
e610e50f 49extern int read_batch;
5774786f
WD
50extern int write_batch;
51extern int list_only;
52extern int only_existing;
53extern int orig_umask;
54extern int safe_symlinks;
ec8290c8 55extern unsigned int block_size;
2f03f956 56
97f9dcae
WD
57extern struct exclude_list_struct server_exclude_list;
58
2f03f956
AT
59
60/* choose whether to skip a particular file */
dfd5ba6a 61static int skip_file(char *fname, struct file_struct *file, STRUCT_STAT *st)
2f03f956
AT
62{
63 if (st->st_size != file->length) {
64 return 0;
65 }
59c95e42 66 if (link_dest) {
e7bc9b64 67 if (preserve_perms
67e78a82 68 && (st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS))
bb24028f
S
69 return 0;
70
6744b62d 71 if (am_root && preserve_uid && st->st_uid != file->uid)
59c95e42 72 return 0;
bb24028f 73
a60e2dca
S
74 if (preserve_gid && file->gid != GID_NONE
75 && st->st_gid != file->gid)
59c95e42 76 return 0;
59c95e42
DD
77 }
78
2cda2560 79 /* if always checksum is set then we use the checksum instead
2f03f956
AT
80 of the file time to determine whether to sync */
81 if (always_checksum && S_ISREG(st->st_mode)) {
82 char sum[MD4_SUM_LENGTH];
60c8d7bc
DD
83 char fnamecmpdest[MAXPATHLEN];
84
85 if (compare_dest != NULL) {
86 if (access(fname, 0) != 0) {
248ed45f
WD
87 pathjoin(fnamecmpdest, sizeof fnamecmpdest,
88 compare_dest, fname);
60c8d7bc
DD
89 fname = fnamecmpdest;
90 }
91 }
2f03f956 92 file_checksum(fname,sum,st->st_size);
728d0922 93 return memcmp(sum, file->u.sum, protocol_version < 21 ? 2
4499c0ee 94 : MD4_SUM_LENGTH) == 0;
2f03f956
AT
95 }
96
f83f0548
AT
97 if (size_only) {
98 return 1;
99 }
100
2f03f956
AT
101 if (ignore_times) {
102 return 0;
103 }
104
5b56cc19 105 return (cmp_modtime(st->st_mtime,file->modtime) == 0);
2f03f956
AT
106}
107
108
2f03f956 109/*
0e36d9da 110 * NULL sum_struct means we have no checksums
195bd906 111 */
fc0257c9 112void write_sum_head(int f, struct sum_struct *sum)
2f03f956 113{
fc0257c9
S
114 static struct sum_struct null_sum;
115
c338460d 116 if (sum == NULL)
fc0257c9
S
117 sum = &null_sum;
118
119 write_int(f, sum->count);
120 write_int(f, sum->blength);
d04e9c51 121 if (protocol_version >= 27)
fc0257c9
S
122 write_int(f, sum->s2length);
123 write_int(f, sum->remainder);
2f03f956
AT
124}
125
ec8290c8 126/*
195bd906 127 * set (initialize) the size entries in the per-file sum_struct
ec8290c8 128 * calculating dynamic block and checksum sizes.
195bd906 129 *
ec8290c8 130 * This is only called from generate_and_send_sums() but is a separate
195bd906
S
131 * function to encapsulate the logic.
132 *
133 * The block size is a rounded square root of file length.
134 *
135 * The checksum size is determined according to:
136 * blocksum_bits = BLOCKSUM_EXP + 2*log2(file_len) - log2(block_len)
137 * provided by Donovan Baarda which gives a probability of rsync
138 * algorithm corrupting data and falling back using the whole md4
139 * checksums.
140 *
141 * This might be made one of several selectable heuristics.
142 */
bceec82f 143
423dba8e 144static void sum_sizes_sqroot(struct sum_struct *sum, uint64 len)
195bd906 145{
da9d12f5
WD
146 unsigned int blength;
147 int s2length;
195bd906
S
148 uint32 c;
149 uint64 l;
150
151 if (block_size) {
152 blength = block_size;
153 } else if (len <= BLOCK_SIZE * BLOCK_SIZE) {
154 blength = BLOCK_SIZE;
155 } else {
156 l = len;
157 c = 1;
158 while (l >>= 2) {
159 c <<= 1;
160 }
161 blength = 0;
162 do {
163 blength |= c;
fb55e28d 164 if (len < (uint64)blength * blength)
195bd906
S
165 blength &= ~c;
166 c >>= 1;
167 } while (c >= 8); /* round to multiple of 8 */
168 blength = MAX(blength, BLOCK_SIZE);
169 }
170
d04e9c51 171 if (protocol_version < 27) {
195bd906
S
172 s2length = csum_length;
173 } else if (csum_length == SUM_LENGTH) {
174 s2length = SUM_LENGTH;
175 } else {
da9d12f5 176 int b = BLOCKSUM_BIAS;
195bd906
S
177 l = len;
178 while (l >>= 1) {
179 b += 2;
180 }
181 c = blength;
182 while (c >>= 1 && b) {
183 b--;
184 }
185 s2length = (b + 1 - 32 + 7) / 8; /* add a bit,
186 * subtract rollsum,
187 * round up
188 * --optimize in compiler--
189 */
190 s2length = MAX(s2length, csum_length);
191 s2length = MIN(s2length, SUM_LENGTH);
192 }
193
194 sum->flength = len;
195 sum->blength = blength;
196 sum->s2length = s2length;
197 sum->count = (len + (blength - 1)) / blength;
198 sum->remainder = (len % blength);
199
200 if (sum->count && verbose > 2) {
0e36d9da
WD
201 rprintf(FINFO, "count=%.0f rem=%u blength=%u s2length=%d flength=%.0f\n",
202 (double)sum->count, sum->remainder, sum->blength,
da9d12f5 203 sum->s2length, (double)sum->flength);
195bd906
S
204 }
205}
80605142 206
bceec82f
MP
207/**
208 * Perhaps we want to just send an empty checksum set for this file,
209 * which will force the whole thing to be literally transferred.
210 *
211 * When do we do this? If the user's explicitly said they
212 * want the whole thing, or if { they haven't explicitly
213 * requested a delta, and it's local but not batch mode.}
214 *
215 * Whew. */
216static BOOL disable_deltas_p(void)
217{
2cda2560 218 if (whole_file > 0)
bceec82f 219 return True;
935c6417 220 if (whole_file == 0 || write_batch || read_batch)
bceec82f 221 return False;
2cda2560 222 return local_server;
bceec82f
MP
223}
224
225
80605142
WD
226/*
227 * Generate and send a stream of signatures/checksums that describe a buffer
e66dfd18 228 *
80605142
WD
229 * Generate approximately one checksum every block_len bytes.
230 */
2990e06f 231static void generate_and_send_sums(struct map_struct *buf, size_t len, int f_out)
2f03f956 232{
80605142
WD
233 size_t i;
234 struct sum_struct sum;
2f03f956
AT
235 OFF_T offset = 0;
236
423dba8e 237 sum_sizes_sqroot(&sum, len);
e66dfd18 238
fc0257c9 239 write_sum_head(f_out, &sum);
2f03f956 240
80605142 241 for (i = 0; i < sum.count; i++) {
0e36d9da 242 unsigned int n1 = MIN(len, sum.blength);
e66dfd18 243 char *map = map_ptr(buf, offset, n1);
80605142
WD
244 uint32 sum1 = get_checksum1(map, n1);
245 char sum2[SUM_LENGTH];
2f03f956 246
80605142 247 get_checksum2(map, n1, sum2);
2f03f956 248
80605142 249 if (verbose > 3) {
e66dfd18 250 rprintf(FINFO,
0e36d9da
WD
251 "chunk[%.0f] offset=%.0f len=%u sum1=%08lx\n",
252 (double)i, (double)offset, n1,
253 (unsigned long)sum1);
80605142
WD
254 }
255 write_int(f_out, sum1);
fc0257c9 256 write_buf(f_out, sum2, sum.s2length);
2f03f956
AT
257 len -= n1;
258 offset += n1;
259 }
2f03f956
AT
260}
261
262
ef1aa910 263
420ef2c4
MP
264/**
265 * Acts on file number @p i from @p flist, whose name is @p fname.
ef1aa910
MP
266 *
267 * First fixes up permissions, then generates checksums for the file.
268 *
420ef2c4
MP
269 * @note This comment was added later by mbp who was trying to work it
270 * out. It might be wrong.
2cda2560 271 **/
dfd5ba6a 272void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
2cda2560 273{
2f03f956
AT
274 int fd;
275 STRUCT_STAT st;
968c8030 276 struct map_struct *mapbuf;
2f03f956 277 int statret;
375a4556
DD
278 char *fnamecmp;
279 char fnamecmpbuf[MAXPATHLEN];
f7632fc6 280
dfd5ba6a
WD
281 if (list_only)
282 return;
2f03f956
AT
283
284 if (verbose > 2)
285 rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i);
286
97f9dcae
WD
287 if (server_exclude_list.head
288 && check_exclude(&server_exclude_list, fname,
3e35c34b
WD
289 S_ISDIR(file->mode)) < 0) {
290 if (verbose) {
291 rprintf(FINFO, "skipping server-excluded file \"%s\"\n",
292 fname);
293 }
97f9dcae 294 return;
3e35c34b 295 }
97f9dcae 296
6218c7bf 297 statret = link_stat(fname, &st, keep_dirlinks && S_ISDIR(file->mode));
63787382 298
1347d512
AT
299 if (only_existing && statret == -1 && errno == ENOENT) {
300 /* we only want to update existing files */
3e35c34b
WD
301 if (verbose > 1)
302 rprintf(FINFO, "not creating new file \"%s\"\n", fname);
1347d512
AT
303 return;
304 }
305
2cda2560
WD
306 if (statret == 0 &&
307 !preserve_perms &&
4df9f368
AT
308 (S_ISDIR(st.st_mode) == S_ISDIR(file->mode))) {
309 /* if the file exists already and we aren't perserving
2cda2560
WD
310 * permissions then act as though the remote end sent
311 * us the file permissions we already have */
67e78a82
WD
312 file->mode = (file->mode & ~CHMOD_BITS)
313 | (st.st_mode & CHMOD_BITS);
4df9f368
AT
314 }
315
2f03f956 316 if (S_ISDIR(file->mode)) {
2cda2560
WD
317 /* The file to be received is a directory, so we need
318 * to prepare appropriately. If there is already a
319 * file of that name and it is *not* a directory, then
320 * we need to delete it. If it doesn't exist, then
321 * recursively create it. */
322
ec8290c8
WD
323 if (dry_run)
324 return; /* TODO: causes inaccuracies -- fix */
2f03f956 325 if (statret == 0 && !S_ISDIR(st.st_mode)) {
c7c11a0d 326 if (robust_unlink(fname) != 0) {
d62bcc17
WD
327 rsyserr(FERROR, errno,
328 "recv_generator: unlink %s to make room for directory",
329 full_fname(fname));
2f03f956
AT
330 return;
331 }
332 statret = -1;
333 }
334 if (statret != 0 && do_mkdir(fname,file->mode) != 0 && errno != EEXIST) {
d62bcc17
WD
335 if (!(relative_paths && errno == ENOENT
336 && create_directory_path(fname, orig_umask) == 0
337 && do_mkdir(fname, file->mode) == 0)) {
338 rsyserr(FERROR, errno,
339 "recv_generator: mkdir %s failed",
340 full_fname(fname));
2f03f956
AT
341 }
342 }
716e73d4
WD
343 /* f_out is set to -1 when doing final directory-permission
344 * and modification-time repair. */
345 if (set_perms(fname, file, statret ? NULL : &st, 0)
346 && verbose && f_out != -1)
2f03f956
AT
347 rprintf(FINFO,"%s/\n",fname);
348 return;
349 }
350
351 if (preserve_links && S_ISLNK(file->mode)) {
352#if SUPPORT_LINKS
353 char lnk[MAXPATHLEN];
354 int l;
2f03f956 355
728d0922 356 if (safe_symlinks && unsafe_symlink(file->u.link, fname)) {
2f03f956 357 if (verbose) {
ea42541f 358 rprintf(FINFO, "ignoring unsafe symlink %s -> \"%s\"\n",
728d0922 359 full_fname(fname), file->u.link);
2f03f956
AT
360 }
361 return;
362 }
363 if (statret == 0) {
364 l = readlink(fname,lnk,MAXPATHLEN-1);
365 if (l > 0) {
366 lnk[l] = 0;
85d4d142
MP
367 /* A link already pointing to the
368 * right place -- no further action
369 * required. */
728d0922 370 if (strcmp(lnk,file->u.link) == 0) {
c41b52c4
WD
371 set_perms(fname, file, &st,
372 PERMS_REPORT);
2f03f956
AT
373 return;
374 }
2cda2560 375 }
85d4d142
MP
376 /* Not a symlink, so delete whatever's
377 * already there and put a new symlink
2cda2560 378 * in place. */
4b3977bf 379 delete_file(fname);
2f03f956 380 }
728d0922 381 if (do_symlink(file->u.link,fname) != 0) {
d62bcc17
WD
382 rsyserr(FERROR, errno, "symlink %s -> \"%s\" failed",
383 full_fname(fname), file->u.link);
2f03f956
AT
384 } else {
385 set_perms(fname,file,NULL,0);
386 if (verbose) {
728d0922 387 rprintf(FINFO,"%s -> %s\n", fname,file->u.link);
2f03f956
AT
388 }
389 }
390#endif
391 return;
392 }
393
394#ifdef HAVE_MKNOD
395 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
2cda2560 396 if (statret != 0 ||
2f03f956 397 st.st_mode != file->mode ||
3915fd75 398 st.st_rdev != file->u.rdev) {
2f03f956 399 delete_file(fname);
d62bcc17 400 if (verbose > 2) {
2f03f956 401 rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
728d0922 402 fname,(int)file->mode,(int)file->u.rdev);
d62bcc17 403 }
728d0922 404 if (do_mknod(fname,file->mode,file->u.rdev) != 0) {
d62bcc17
WD
405 rsyserr(FERROR, errno, "mknod %s failed",
406 full_fname(fname));
2f03f956
AT
407 } else {
408 set_perms(fname,file,NULL,0);
409 if (verbose)
410 rprintf(FINFO,"%s\n",fname);
411 }
412 } else {
c41b52c4 413 set_perms(fname, file, &st, PERMS_REPORT);
2f03f956
AT
414 }
415 return;
416 }
417#endif
418
6dff5992 419 if (preserve_hard_links && hard_link_check(file, HL_CHECK_MASTER))
2f03f956 420 return;
2f03f956
AT
421
422 if (!S_ISREG(file->mode)) {
1bbd10fe 423 rprintf(FINFO, "skipping non-regular file \"%s\"\n",fname);
2f03f956
AT
424 return;
425 }
426
375a4556
DD
427 fnamecmp = fname;
428
c338460d 429 if (statret == -1 && compare_dest != NULL) {
375a4556
DD
430 /* try the file at compare_dest instead */
431 int saveerrno = errno;
248ed45f 432 pathjoin(fnamecmpbuf, sizeof fnamecmpbuf, compare_dest, fname);
6218c7bf 433 statret = link_stat(fnamecmpbuf, &st, 0);
375a4556
DD
434 if (!S_ISREG(st.st_mode))
435 statret = -1;
436 if (statret == -1)
437 errno = saveerrno;
59c95e42
DD
438#if HAVE_LINK
439 else if (link_dest && !dry_run) {
440 if (do_link(fnamecmpbuf, fname) != 0) {
e7bc9b64 441 if (verbose > 0) {
d62bcc17
WD
442 rsyserr(FINFO, errno, "link %s => %s",
443 fnamecmpbuf, fname);
e7bc9b64 444 }
59c95e42
DD
445 }
446 fnamecmp = fnamecmpbuf;
447 }
448#endif
375a4556
DD
449 else
450 fnamecmp = fnamecmpbuf;
451 }
452
2f03f956 453 if (statret == -1) {
6dff5992
WD
454 if (preserve_hard_links && hard_link_check(file, HL_SKIP))
455 return;
2f03f956
AT
456 if (errno == ENOENT) {
457 write_int(f_out,i);
ec8290c8
WD
458 if (!dry_run)
459 write_sum_head(f_out, NULL);
ea42541f 460 } else if (verbose > 1) {
d62bcc17
WD
461 rsyserr(FERROR, errno,
462 "recv_generator: failed to open %s",
463 full_fname(fname));
2f03f956
AT
464 }
465 return;
466 }
467
468 if (!S_ISREG(st.st_mode)) {
469 if (delete_file(fname) != 0) {
470 return;
471 }
472
473 /* now pretend the file didn't exist */
6dff5992
WD
474 if (preserve_hard_links && hard_link_check(file, HL_SKIP))
475 return;
2f03f956 476 write_int(f_out,i);
ec8290c8
WD
477 if (!dry_run)
478 write_sum_head(f_out, NULL);
2f03f956
AT
479 return;
480 }
481
2cda2560 482 if (opt_ignore_existing && fnamecmp == fname) {
3d6feada
MP
483 if (verbose > 1)
484 rprintf(FINFO,"%s exists\n",fname);
485 return;
2cda2560 486 }
3d6feada 487
5b56cc19 488 if (update_only && cmp_modtime(st.st_mtime,file->modtime)>0 && fnamecmp == fname) {
2f03f956
AT
489 if (verbose > 1)
490 rprintf(FINFO,"%s is newer\n",fname);
491 return;
492 }
493
494 if (skip_file(fname, file, &st)) {
bd4ed7f7 495 if (fnamecmp == fname)
c41b52c4 496 set_perms(fname, file, &st, PERMS_REPORT);
2f03f956
AT
497 return;
498 }
499
500 if (dry_run) {
501 write_int(f_out,i);
502 return;
503 }
504
bceec82f 505 if (disable_deltas_p()) {
2f03f956 506 write_int(f_out,i);
fc0257c9 507 write_sum_head(f_out, NULL);
2f03f956
AT
508 return;
509 }
510
2cda2560 511 /* open the file */
8c9fd200 512 fd = do_open(fnamecmp, O_RDONLY, 0);
2f03f956
AT
513
514 if (fd == -1) {
d62bcc17
WD
515 rsyserr(FERROR, errno, "failed to open %s, continuing",
516 full_fname(fnamecmp));
60be6acf 517 /* pretend the file didn't exist */
6dff5992
WD
518 if (preserve_hard_links && hard_link_check(file, HL_SKIP))
519 return;
60be6acf 520 write_int(f_out,i);
fc0257c9 521 write_sum_head(f_out, NULL);
2f03f956
AT
522 return;
523 }
524
968c8030
WD
525 if (st.st_size > 0)
526 mapbuf = map_file(fd,st.st_size);
527 else
528 mapbuf = NULL;
2f03f956 529
dfd5ba6a
WD
530 if (verbose > 3) {
531 rprintf(FINFO,"gen mapped %s of size %.0f\n", fnamecmp,
532 (double)st.st_size);
533 }
2f03f956 534
2f03f956 535 if (verbose > 2)
80605142 536 rprintf(FINFO, "generating and sending sums for %d\n", i);
2f03f956
AT
537
538 write_int(f_out,i);
968c8030 539 generate_and_send_sums(mapbuf, st.st_size, f_out);
2f03f956
AT
540
541 close(fd);
ec8290c8
WD
542 if (mapbuf)
543 unmap_file(mapbuf);
2f03f956
AT
544}
545
546
b9b15fb1 547void generate_files(int f, struct file_list *flist, char *local_name)
2f03f956
AT
548{
549 int i;
550 int phase=0;
968c8030 551 char fbuf[MAXPATHLEN];
2f03f956 552
45e08edb
WD
553 if (verbose > 2) {
554 rprintf(FINFO, "generator starting pid=%ld count=%d\n",
555 (long)getpid(), flist->count);
556 }
2f03f956 557
3e7053ac
MP
558 if (verbose >= 2) {
559 rprintf(FINFO,
2cda2560 560 disable_deltas_p()
3e7053ac
MP
561 ? "delta-transmission disabled for local transfer or --whole-file\n"
562 : "delta transmission enabled\n");
563 }
2cda2560 564
a57873b7
AT
565 /* we expect to just sit around now, so don't exit on a
566 timeout. If we really get a timeout then the other process should
567 exit */
568 io_timeout = 0;
569
2f03f956
AT
570 for (i = 0; i < flist->count; i++) {
571 struct file_struct *file = flist->files[i];
dfd5ba6a 572 struct file_struct copy;
2f03f956 573
dfd5ba6a
WD
574 if (!file->basename)
575 continue;
2f03f956
AT
576 /* we need to ensure that any directories we create have writeable
577 permissions initially so that we can create the files within
578 them. This is then fixed after the files are transferred */
dfd5ba6a
WD
579 if (!am_root && S_ISDIR(file->mode) && !(file->mode & S_IWUSR)) {
580 copy = *file;
2cda2560
WD
581 /* XXX: Could this be causing a problem on SCO? Perhaps their
582 * handling of permissions is strange? */
dfd5ba6a
WD
583 copy.mode |= S_IWUSR; /* user write */
584 file = &copy;
2f03f956
AT
585 }
586
3fef5364
WD
587 recv_generator(local_name ? local_name : f_name_to(file, fbuf),
588 file, i, f);
2f03f956
AT
589 }
590
591 phase++;
592 csum_length = SUM_LENGTH;
593 ignore_times=1;
594
595 if (verbose > 2)
596 rprintf(FINFO,"generate_files phase=%d\n",phase);
597
598 write_int(f,-1);
599
bc63ae3f
S
600 /* files can cycle through the system more than once
601 * to catch initial checksum errors */
b9b15fb1 602 while ((i = get_redo_num()) != -1) {
bc63ae3f 603 struct file_struct *file = flist->files[i];
3fef5364
WD
604 recv_generator(local_name ? local_name : f_name_to(file, fbuf),
605 file, i, f);
bc63ae3f 606 }
2f03f956 607
bc63ae3f
S
608 phase++;
609 if (verbose > 2)
610 rprintf(FINFO,"generate_files phase=%d\n",phase);
2f03f956 611
bc63ae3f 612 write_int(f,-1);
6dff5992
WD
613
614 if (preserve_hard_links)
615 do_hard_links();
616
617 /* now we need to fix any directory permissions that were
618 * modified during the transfer */
619 for (i = 0; i < flist->count; i++) {
620 struct file_struct *file = flist->files[i];
ec8290c8
WD
621 if (!file->basename || !S_ISDIR(file->mode))
622 continue;
6dff5992
WD
623 recv_generator(local_name ? local_name : f_name(file),
624 file, i, -1);
625 }
626
627 if (verbose > 2)
628 rprintf(FINFO,"generate_files finished\n");
2f03f956 629}