+ return f_name_to(f, names[n]);
+}
+
+static int is_backup_file(char *fn)
+{
+ int k = strlen(fn) - backup_suffix_len;
+ return k > 0 && strcmp(fn+k, backup_suffix) == 0;
+}
+
+void delete_in_dir(struct file_list *flist, char *fname)
+{
+ static int deletion_count = 0;
+ struct file_list *del_flist;
+ int save_recurse = recurse;
+ int save_xfer_dirs = xfer_dirs;
+ int save_implied_dirs = implied_dirs;
+ int save_relative_paths = relative_paths;
+ char *argv[1];
+ int i, j, mode;
+
+ if (max_delete && deletion_count >= max_delete)
+ return;
+
+ if (io_error && !(lp_ignore_errors(module_id) || ignore_errors)) {
+ rprintf(FINFO, "IO error encountered - skipping file deletion\n");
+ max_delete = -1; /* avoid duplicating the above warning */
+ return;
+ }
+
+ if (delete_during) {
+ recurse = 1; /* allow one level only */
+ xfer_dirs = 1;
+ implied_dirs = 0;
+ relative_paths = 1;
+ }
+
+ argv[0] = fname;
+ del_flist = send_file_list(-1, 1, argv);
+
+ relative_paths = save_relative_paths;
+ implied_dirs = save_implied_dirs;
+ xfer_dirs = save_xfer_dirs;
+ recurse = save_recurse;
+
+ if (!del_flist)
+ return;
+
+ if (verbose > 1)
+ rprintf(FINFO, "deleting in %s\n", safe_fname(fname));
+
+ for (i = del_flist->count-1; i >= 0; i--) {
+ if (max_delete && deletion_count >= max_delete)
+ break;
+ if (!del_flist->files[i]->basename)
+ continue;
+ mode = del_flist->files[i]->mode;
+ if ((j = flist_find(flist, del_flist->files[i])) < 0
+ || (delete_during && S_ISDIR(mode)
+ && !S_ISDIR(flist->files[j]->mode))) {
+ char *f = f_name(del_flist->files[i]);
+ if (make_backups && (backup_dir || !is_backup_file(f))
+ && !S_ISDIR(mode)) {
+ make_backup(f);
+ if (verbose) {
+ rprintf(FINFO, "deleting %s\n",
+ safe_fname(f));
+ }
+ } else {
+ int dflags = delete_during
+ ? DEL_DIR | DEL_FORCE_RECURSE
+ : DEL_DIR | DEL_NO_RECURSE;
+ delete_file(f, S_ISDIR(mode) ? dflags : 0);
+ }
+ deletion_count++;
+ }
+ }
+ flist_free(del_flist);