+ unmake_file(back_file);
+ }
+
+#ifdef SUPPORT_ACLS
+ if (preserve_acls)
+ free_acl(&sx);
+#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs)
+ free_xattr(&sx);
+#endif
+ return;
+}
+
+static void touch_up_dirs(struct file_list *flist, int ndx)
+{
+ static int counter = 0;
+ struct file_struct *file;
+ char *fname;
+ int i, start, end;
+
+ if (ndx < 0) {
+ start = 0;
+ end = flist->used - 1;
+ } else
+ start = end = ndx;
+
+ /* Fix any directory permissions that were modified during the
+ * transfer and/or re-set any tweaked modified-time values. */
+ for (i = start; i <= end; i++, counter++) {
+ file = flist->files[i];
+ if (!S_ISDIR(file->mode)
+ || (!implied_dirs && file->flags & FLAG_IMPLIED_DIR))
+ continue;
+ if (verbose > 3) {
+ fname = f_name(file, NULL);
+ rprintf(FINFO, "touch_up_dirs: %s (%d)\n",
+ NS(fname), i);
+ }
+ if (!F_IS_ACTIVE(file) || file->flags & FLAG_MISSING_DIR
+ || (!need_retouch_dir_times && file->mode & S_IWUSR))
+ continue;
+ fname = f_name(file, NULL);
+ if (!(file->mode & S_IWUSR))
+ do_chmod(fname, file->mode);
+ if (need_retouch_dir_times)
+ set_modtime(fname, file->modtime, file->mode);
+ if (allowed_lull && !(counter % lull_mod))
+ maybe_send_keepalive();
+ else if (!(counter & 0xFF))
+ maybe_flush_socket(0);
+ }
+}
+
+void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
+{
+ struct file_struct *file;
+ struct file_list *flist;
+ char fbuf[MAXPATHLEN];
+ int ndx;
+
+#ifdef SUPPORT_HARD_LINKS
+ while (preserve_hard_links && (ndx = get_hlink_num()) != -1) {
+ flist = flist_for_ndx(ndx);
+ assert(flist != NULL);
+ file = flist->files[ndx - flist->ndx_start];
+ assert(file->flags & FLAG_HLINKED);
+ finish_hard_link(file, f_name(file, fbuf), ndx, NULL, itemizing, code, -1);
+ flist->in_progress--;