From f3ab64d3a8b47395154a503f3f0084622d61d52d Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sun, 24 Apr 2005 22:11:26 +0000 Subject: [PATCH] When deleting files, we need to take any local FLAG_MOUNT_POINT flag-bit and put it into the regular flist's flags for that dir, and delete_in_dir() now refuses to delete a directory that has that bit set. --- generator.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/generator.c b/generator.c index 13749f0b..3077a137 100644 --- a/generator.c +++ b/generator.c @@ -210,7 +210,7 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, struct file_list *dirlist; char delbuf[MAXPATHLEN]; STRUCT_STAT st; - int dlen, i; + int dlen, i, j; if (!flist) { while (cur_depth >= min_depth) @@ -226,6 +226,9 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, if (allowed_lull) maybe_send_keepalive(); + if (file->flags & FLAG_MOUNT_POINT) + return; + if (file->dir.depth >= MAXPATHLEN/2+1) return; /* Impossible... */ @@ -257,14 +260,16 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, /* If an item in dirlist is not found in flist, delete it * from the filesystem. */ for (i = dirlist->count; i--; ) { - if (!dirlist->files[i]->basename) + struct file_struct *fp = dirlist->files[i]; + if (!fp->basename) continue; - if (flist_find(flist, dirlist->files[i]) < 0) { - int mode = dirlist->files[i]->mode; - f_name_to(dirlist->files[i], delbuf); + if ((j = flist_find(flist, fp)) < 0) { + int mode = fp->mode; + f_name_to(fp, delbuf); if (delete_item(delbuf, mode, DEL_FORCE_RECURSE) < 0) break; - } + } else if (fp->flags & FLAG_MOUNT_POINT) + flist->files[j]->flags |= FLAG_MOUNT_POINT; } flist_free(dirlist); -- 2.34.1