+
+ dlen = strlcpy(dirbuf, dirname, MAXPATHLEN);
+ if (dlen >= MAXPATHLEN)
+ return NULL;
+
+ dirlist = flist_new(WITHOUT_HLINK, "get_dirlist");
+ recurse = 0;
+ send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirbuf, dlen);
+ recurse = save_recurse;
+
+ return dirlist;
+}
+
+
+/* This function is used to implement per-directory deletion, and
+ * is used by all the --delete-WHEN options. Note that the fbuf
+ * pointer must point to a MAXPATHLEN buffer with the name of the
+ * directory in it (the functions we call will append names onto
+ * the end, but the old dir value will be restored on exit). */
+void delete_in_dir(struct file_list *flist, char *fbuf,
+ struct file_struct *file)
+{
+ static int min_depth = MAXPATHLEN, cur_depth = -1;
+ static void *filt_array[MAXPATHLEN/2+1];
+ struct file_list *dir_list;
+ STRUCT_STAT st;
+ int dlen;
+
+ if (!flist) {
+ while (cur_depth >= min_depth)
+ pop_local_filters(filt_array[cur_depth--]);
+ min_depth = MAXPATHLEN;
+ cur_depth = -1;
+ return;
+ }
+ if (file->dir.depth >= MAXPATHLEN/2+1)
+ return; /* Impossible... */