dll: fuse: implementation checkpoint

This commit is contained in:
Bill Zissimopoulos 2016-06-09 16:03:40 -07:00
parent 9d42c625cc
commit a9868ba883
2 changed files with 41 additions and 16 deletions

View File

@ -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;
{ memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf);
*PFileNode = 0;
//memcpy(FileInfo, &contexthdr->FileInfo, sizeof *FileInfo);
filedesc->PosixPath = contexthdr->PosixPath; filedesc->PosixPath = contexthdr->PosixPath;
filedesc->FileHandle = fi.fh; filedesc->OpenFlags = fi.flags;
contexthdr->PosixPath = 0; filedesc->FileHandle = fi.fh;
contexthdr->Response->Rsp.Create.Opened.UserContext2 = (UINT64)(UINT_PTR)filedesc; contexthdr->PosixPath = 0;
} 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;

View File

@ -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;
}; };