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