Commit f3ab64d3 authored by Wayne Davison's avatar Wayne Davison

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.
parent a234bca4
...@@ -210,7 +210,7 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, ...@@ -210,7 +210,7 @@ static void delete_in_dir(struct file_list *flist, char *fbuf,
struct file_list *dirlist; struct file_list *dirlist;
char delbuf[MAXPATHLEN]; char delbuf[MAXPATHLEN];
STRUCT_STAT st; STRUCT_STAT st;
int dlen, i; int dlen, i, j;
if (!flist) { if (!flist) {
while (cur_depth >= min_depth) while (cur_depth >= min_depth)
...@@ -226,6 +226,9 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, ...@@ -226,6 +226,9 @@ static void delete_in_dir(struct file_list *flist, char *fbuf,
if (allowed_lull) if (allowed_lull)
maybe_send_keepalive(); maybe_send_keepalive();
if (file->flags & FLAG_MOUNT_POINT)
return;
if (file->dir.depth >= MAXPATHLEN/2+1) if (file->dir.depth >= MAXPATHLEN/2+1)
return; /* Impossible... */ return; /* Impossible... */
...@@ -257,14 +260,16 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, ...@@ -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 /* If an item in dirlist is not found in flist, delete it
* from the filesystem. */ * from the filesystem. */
for (i = dirlist->count; i--; ) { for (i = dirlist->count; i--; ) {
if (!dirlist->files[i]->basename) struct file_struct *fp = dirlist->files[i];
if (!fp->basename)
continue; continue;
if (flist_find(flist, dirlist->files[i]) < 0) { if ((j = flist_find(flist, fp)) < 0) {
int mode = dirlist->files[i]->mode; int mode = fp->mode;
f_name_to(dirlist->files[i], delbuf); f_name_to(fp, delbuf);
if (delete_item(delbuf, mode, DEL_FORCE_RECURSE) < 0) if (delete_item(delbuf, mode, DEL_FORCE_RECURSE) < 0)
break; break;
} } else if (fp->flags & FLAG_MOUNT_POINT)
flist->files[j]->flags |= FLAG_MOUNT_POINT;
} }
flist_free(dirlist); flist_free(dirlist);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment