dll: fuseintf: CanDelete improvements

This commit is contained in:
Bill Zissimopoulos 2016-06-10 21:30:59 -07:00
parent 267ed97d36
commit fb6a139c85
2 changed files with 18 additions and 8 deletions

View File

@ -752,11 +752,11 @@ static int fsp_fuse_intf_CanDeleteAddDirInfo(void *buf, const char *name,
{ {
struct fuse_dirhandle *dh = buf; struct fuse_dirhandle *dh = buf;
if ('.' == name[0] && '\0' == name[1]) if ('.' == name[0] && ('\0' == name[1] || ('.' == name[1] && '\0' == name[2])))
return 0; {
else dh->DotFiles = TRUE;
if ('.' == name[0] && '.' == name[1] && '\0' == name[2])
return 0; return 0;
}
else else
{ {
dh->HasChild = TRUE; dh->HasChild = TRUE;
@ -779,17 +779,27 @@ static NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem,
(PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2; (PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
struct fuse_dirhandle dh; struct fuse_dirhandle dh;
int err;
if (filedesc->IsDirectory) if (filedesc->IsDirectory)
{ {
/* check that directory is empty! */
memset(&dh, 0, sizeof dh); memset(&dh, 0, sizeof dh);
if (0 != f->ops.readdir) if (0 != f->ops.readdir)
f->ops.readdir(filedesc->PosixPath, &dh, fsp_fuse_intf_CanDeleteAddDirInfo, 0, &fi); err = f->ops.readdir(filedesc->PosixPath, &dh, fsp_fuse_intf_CanDeleteAddDirInfo, 0, &fi);
else if (0 != f->ops.getdir) else if (0 != f->ops.getdir)
f->ops.getdir(filedesc->PosixPath, &dh, fsp_fuse_intf_CanDeleteAddDirInfoOld); err = f->ops.getdir(filedesc->PosixPath, &dh, fsp_fuse_intf_CanDeleteAddDirInfoOld);
else
err = 0;
return dh.HasChild ? STATUS_DIRECTORY_NOT_EMPTY : STATUS_SUCCESS; if (dh.HasChild)
return STATUS_DIRECTORY_NOT_EMPTY;
else if (dh.DotFiles)
return STATUS_SUCCESS;
else
return fsp_fuse_ntstatus_from_errno(f->env, err);
} }
return STATUS_SUCCESS; return STATUS_SUCCESS;

View File

@ -64,7 +64,7 @@ struct fuse_dirhandle
PVOID Buffer; PVOID Buffer;
ULONG Length; ULONG Length;
ULONG BytesTransferred; ULONG BytesTransferred;
BOOLEAN HasChild; BOOLEAN DotFiles, HasChild;
}; };
static inline static inline