mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 00:43:00 -05:00
dll: fuse: implementation checkpoint
This commit is contained in:
parent
9d42c625cc
commit
a9868ba883
@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/fuse/library.h>
|
#include <dll/fuse/library.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
|
NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
@ -307,20 +308,40 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_context_header *contexthdr = fsp_fuse_context_header();
|
struct fsp_fuse_context_header *contexthdr = fsp_fuse_context_header();
|
||||||
struct fsp_fuse_file_desc *filedesc;
|
UINT32 Uid, Gid, Mode;
|
||||||
|
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
||||||
|
struct fsp_fuse_file_desc *filedesc = 0;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
int err;
|
int err;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
Result = fsp_fuse_intf_GetFileInfoByPath(FileSystem, contexthdr->PosixPath,
|
||||||
|
&Uid, &Gid, &Mode, &FileInfoBuf);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
filedesc = MemAlloc(sizeof *filedesc);
|
filedesc = MemAlloc(sizeof *filedesc);
|
||||||
if (0 == filedesc)
|
if (0 == filedesc)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
{
|
||||||
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&fi, 0, sizeof fi);
|
memset(&fi, 0, sizeof fi);
|
||||||
fi.flags = 0;
|
switch (Request->Req.Create.DesiredAccess & (FILE_READ_DATA | FILE_WRITE_DATA))
|
||||||
|
{
|
||||||
|
case FILE_READ_DATA:
|
||||||
|
fi.flags = _O_RDONLY;
|
||||||
|
break;
|
||||||
|
case FILE_WRITE_DATA:
|
||||||
|
fi.flags = _O_WRONLY;
|
||||||
|
break;
|
||||||
|
case FILE_READ_DATA | FILE_WRITE_DATA:
|
||||||
|
fi.flags = _O_RDWR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
if (FileInfoBuf.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
if (contexthdr->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
||||||
{
|
{
|
||||||
if (0 != f->ops.opendir)
|
if (0 != f->ops.opendir)
|
||||||
{
|
{
|
||||||
@ -340,7 +361,8 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
else
|
else
|
||||||
Result = STATUS_INVALID_DEVICE_REQUEST;
|
Result = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
#endif
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ignore fuse_file_info::direct_io, fuse_file_info::keep_cache
|
* Ignore fuse_file_info::direct_io, fuse_file_info::keep_cache
|
||||||
@ -351,17 +373,19 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
* Ignore fuse_file_info::nonseekable.
|
* Ignore fuse_file_info::nonseekable.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (NT_SUCCESS(Result))
|
|
||||||
{
|
|
||||||
*PFileNode = 0;
|
*PFileNode = 0;
|
||||||
//memcpy(FileInfo, &contexthdr->FileInfo, sizeof *FileInfo);
|
memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf);
|
||||||
|
|
||||||
filedesc->PosixPath = contexthdr->PosixPath;
|
filedesc->PosixPath = contexthdr->PosixPath;
|
||||||
|
filedesc->OpenFlags = fi.flags;
|
||||||
filedesc->FileHandle = fi.fh;
|
filedesc->FileHandle = fi.fh;
|
||||||
contexthdr->PosixPath = 0;
|
contexthdr->PosixPath = 0;
|
||||||
contexthdr->Response->Rsp.Create.Opened.UserContext2 = (UINT64)(UINT_PTR)filedesc;
|
contexthdr->Response->Rsp.Create.Opened.UserContext2 = (UINT64)(UINT_PTR)filedesc;
|
||||||
}
|
|
||||||
else
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
MemFree(filedesc);
|
MemFree(filedesc);
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
|
@ -48,6 +48,7 @@ struct fsp_fuse_context_header
|
|||||||
struct fsp_fuse_file_desc
|
struct fsp_fuse_file_desc
|
||||||
{
|
{
|
||||||
char *PosixPath;
|
char *PosixPath;
|
||||||
|
int OpenFlags;
|
||||||
UINT64 FileHandle;
|
UINT64 FileHandle;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user