mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
dll: fuseintf: CanDelete implementation
This commit is contained in:
parent
55336e3dcf
commit
a4f687c635
@ -743,11 +743,52 @@ static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fsp_fuse_intf_CanDeleteAddDirInfo(void *buf, const char *name,
|
||||||
|
const struct fuse_stat *stbuf, fuse_off_t off)
|
||||||
|
{
|
||||||
|
struct fuse_dirhandle *dh = buf;
|
||||||
|
|
||||||
|
if ('.' == name[0] && '\0' == name[1])
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
if ('.' == name[0] && '.' == name[1] && '\0' == name[2])
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dh->HasChild = TRUE;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fsp_fuse_intf_CanDeleteAddDirInfoOld(fuse_dirh_t dh, const char *name,
|
||||||
|
int type, fuse_ino_t ino)
|
||||||
|
{
|
||||||
|
return fsp_fuse_intf_CanDeleteAddDirInfo(dh, name, 0, 0) ? -ENOMEM : 0;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request,
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
PVOID FileNode, PWSTR FileName)
|
PVOID FileNode, PWSTR FileName)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
|
struct fsp_fuse_file_desc *filedesc =
|
||||||
|
(PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2;
|
||||||
|
struct fuse_file_info fi;
|
||||||
|
struct fuse_dirhandle dh;
|
||||||
|
|
||||||
|
if (filedesc->IsDirectory)
|
||||||
|
{
|
||||||
|
memset(&dh, 0, sizeof dh);
|
||||||
|
|
||||||
|
if (0 != f->ops.readdir)
|
||||||
|
f->ops.readdir(filedesc->PosixPath, &dh, fsp_fuse_intf_CanDeleteAddDirInfo, 0, &fi);
|
||||||
|
else if (0 != f->ops.getdir)
|
||||||
|
f->ops.getdir(filedesc->PosixPath, &dh, fsp_fuse_intf_CanDeleteAddDirInfoOld);
|
||||||
|
|
||||||
|
return dh.HasChild ? STATUS_DIRECTORY_NOT_EMPTY : STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_Rename(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Rename(FSP_FILE_SYSTEM *FileSystem,
|
||||||
@ -853,17 +894,6 @@ exit:
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct fuse_dirhandle
|
|
||||||
{
|
|
||||||
FSP_FILE_SYSTEM *FileSystem;
|
|
||||||
char *PosixPath, *PosixName;
|
|
||||||
PVOID OriginalBuffer;
|
|
||||||
ULONG OriginalLength;
|
|
||||||
PVOID Buffer;
|
|
||||||
ULONG Length;
|
|
||||||
ULONG BytesTransferred;
|
|
||||||
};
|
|
||||||
|
|
||||||
int fsp_fuse_intf_AddDirInfo(void *buf, const char *name,
|
int fsp_fuse_intf_AddDirInfo(void *buf, const char *name,
|
||||||
const struct fuse_stat *stbuf, fuse_off_t off)
|
const struct fuse_stat *stbuf, fuse_off_t off)
|
||||||
{
|
{
|
||||||
@ -1033,7 +1063,7 @@ static NTSTATUS fsp_fuse_intf_ReadDirectory(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
fi.flags = filedesc->OpenFlags;
|
fi.flags = filedesc->OpenFlags;
|
||||||
fi.fh = filedesc->FileHandle;
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
err = f->ops.readdir(filedesc->PosixPath, &dh, fsp_fuse_intf_AddDirInfo, 0, &fi);
|
err = f->ops.readdir(filedesc->PosixPath, &dh, fsp_fuse_intf_AddDirInfo, Offset, &fi);
|
||||||
Result = fsp_fuse_ntstatus_from_errno(f->env, err);
|
Result = fsp_fuse_ntstatus_from_errno(f->env, err);
|
||||||
}
|
}
|
||||||
else if (0 != f->ops.getdir)
|
else if (0 != f->ops.getdir)
|
||||||
|
@ -55,6 +55,18 @@ struct fsp_fuse_file_desc
|
|||||||
ULONG DirBufferSize;
|
ULONG DirBufferSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct fuse_dirhandle
|
||||||
|
{
|
||||||
|
FSP_FILE_SYSTEM *FileSystem;
|
||||||
|
char *PosixPath, *PosixName;
|
||||||
|
PVOID OriginalBuffer;
|
||||||
|
ULONG OriginalLength;
|
||||||
|
PVOID Buffer;
|
||||||
|
ULONG Length;
|
||||||
|
ULONG BytesTransferred;
|
||||||
|
BOOLEAN HasChild;
|
||||||
|
};
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
struct fsp_fuse_context_header *fsp_fuse_context_header(VOID)
|
struct fsp_fuse_context_header *fsp_fuse_context_header(VOID)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user