fuse: implementation checkpoint

This commit is contained in:
Bill Zissimopoulos 2016-05-25 18:34:36 -07:00
parent 1f22bd3517
commit 7db0f68dd7

View File

@ -29,8 +29,8 @@ struct fuse_chan
struct fuse struct fuse
{ {
HANDLE LoopEvent;
FSP_FILE_SYSTEM *FileSystem; FSP_FILE_SYSTEM *FileSystem;
FSP_SERVICE *Service;
const struct fuse_operations *Ops; const struct fuse_operations *Ops;
size_t OpSize; size_t OpSize;
void *Data; void *Data;
@ -107,26 +107,30 @@ FSP_FUSE_API const char *fsp_fuse_pkgversion(void)
FSP_FUSE_API struct fuse_chan *fsp_fuse_mount(const char *mountpoint, struct fuse_args *args) FSP_FUSE_API struct fuse_chan *fsp_fuse_mount(const char *mountpoint, struct fuse_args *args)
{ {
struct fuse_chan *ch; struct fuse_chan *ch = 0;
int Size; int Size;
Size = MultiByteToWideChar(CP_UTF8, 0, mountpoint, -1, 0, 0); Size = MultiByteToWideChar(CP_UTF8, 0, mountpoint, -1, 0, 0);
if (0 == Size) if (0 == Size)
return 0; goto fail;
ch = MemAlloc(sizeof *ch + Size); ch = MemAlloc(sizeof *ch + Size);
if (0 == ch) if (0 == ch)
return 0; goto fail;
ch->MountPoint = (PVOID)ch->Buffer; ch->MountPoint = (PVOID)ch->Buffer;
Size = MultiByteToWideChar(CP_UTF8, 0, mountpoint, -1, ch->MountPoint, Size); Size = MultiByteToWideChar(CP_UTF8, 0, mountpoint, -1, ch->MountPoint, Size);
if (0 == Size) if (0 == Size)
{ goto fail;
MemFree(ch);
return 0;
}
return ch; return ch;
fail:
FspServiceLog(EVENTLOG_ERROR_TYPE, L"Invalid mount point.");
MemFree(ch);
return 0;
} }
FSP_FUSE_API void fsp_fuse_unmount(const char *mountpoint, struct fuse_chan *ch) FSP_FUSE_API void fsp_fuse_unmount(const char *mountpoint, struct fuse_chan *ch)
@ -149,23 +153,31 @@ FSP_FUSE_API int fsp_fuse_main_real(int argc, char *argv[],
return 0; return 0;
} }
static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
{
struct fuse *f = Service->UserContext;
return FspFileSystemStartDispatcher(f->FileSystem, 0);
}
static NTSTATUS fsp_fuse_svcstop(FSP_SERVICE *Service)
{
struct fuse *f = Service->UserContext;
FspFileSystemStopDispatcher(f->FileSystem);
return STATUS_SUCCESS;
}
FSP_FUSE_API struct fuse *fsp_fuse_new(struct fuse_chan *ch, struct fuse_args *args, FSP_FUSE_API struct fuse *fsp_fuse_new(struct fuse_chan *ch, struct fuse_args *args,
const struct fuse_operations *ops, size_t opsize, void *data, const struct fuse_operations *ops, size_t opsize, void *data,
int environment) int environment)
{ {
struct fuse *f = 0; struct fuse *f = 0;
PWSTR ServiceName = FspDiagIdent();
FSP_FSCTL_VOLUME_PARAMS VolumeParams; FSP_FSCTL_VOLUME_PARAMS VolumeParams;
NTSTATUS Result; NTSTATUS Result;
f = MemAlloc(sizeof *f);
if (0 == f)
goto fail;
memset(f, 0, sizeof *f);
f->LoopEvent = CreateEvent(0, TRUE, FALSE, 0);
if (0 == f->LoopEvent)
goto fail;
memset(&VolumeParams, 0, sizeof VolumeParams); memset(&VolumeParams, 0, sizeof VolumeParams);
#if 0 #if 0
/* initialize VolumeParams from command line args */ /* initialize VolumeParams from command line args */
@ -182,6 +194,17 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fuse_chan *ch, struct fuse_args *a
wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), VolumePrefix); wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), VolumePrefix);
#endif #endif
f = MemAlloc(sizeof *f);
if (0 == f)
goto fail;
memset(f, 0, sizeof *f);
Result = FspServiceCreate(ServiceName, fsp_fuse_svcstart, fsp_fuse_svcstop, 0, &f->Service);
if (!NT_SUCCESS(Result))
goto fail;
FspServiceAllowConsoleMode(f->Service);
f->Service->UserContext = f;
Result = FspFileSystemCreate(L"" FSP_FSCTL_NET_DEVICE_NAME, &VolumeParams, 0, &f->FileSystem); Result = FspFileSystemCreate(L"" FSP_FSCTL_NET_DEVICE_NAME, &VolumeParams, 0, &f->FileSystem);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
goto fail; goto fail;
@ -200,13 +223,15 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fuse_chan *ch, struct fuse_args *a
return f; return f;
fail: fail:
FspServiceLog(EVENTLOG_ERROR_TYPE, L"Unable to create FUSE file system.");
if (0 != f) if (0 != f)
{ {
if (0 != f->FileSystem) if (0 != f->FileSystem)
FspFileSystemDelete(f->FileSystem); FspFileSystemDelete(f->FileSystem);
if (0 != f->LoopEvent) if (0 != f->Service)
CloseHandle(f->LoopEvent); FspServiceDelete(f->Service);
MemFree(f); MemFree(f);
} }
@ -220,7 +245,7 @@ FSP_FUSE_API void fsp_fuse_destroy(struct fuse *f)
FspFileSystemDelete(f->FileSystem); FspFileSystemDelete(f->FileSystem);
CloseHandle(f->LoopEvent); FspServiceDelete(f->Service);
MemFree(f); MemFree(f);
} }
@ -228,16 +253,25 @@ FSP_FUSE_API void fsp_fuse_destroy(struct fuse *f)
FSP_FUSE_API int fsp_fuse_loop(struct fuse *f) FSP_FUSE_API int fsp_fuse_loop(struct fuse *f)
{ {
NTSTATUS Result; NTSTATUS Result;
ULONG ExitCode;
Result = FspServiceLoop(f->Service);
ExitCode = FspServiceGetExitCode(f->Service);
Result = FspFileSystemStartDispatcher(f->FileSystem, 0);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return -1; goto fail;
WaitForSingleObject(f->LoopEvent, INFINITE); if (0 != ExitCode)
FspServiceLog(EVENTLOG_WARNING_TYPE,
FspFileSystemStopDispatcher(f->FileSystem); L"The service %s has exited (ExitCode=%ld).", f->Service->ServiceName, ExitCode);
return 0; return 0;
fail:
FspServiceLog(EVENTLOG_ERROR_TYPE,
L"The service %s has failed to run (Status=%lx).", f->Service->ServiceName, Result);
return -1;
} }
FSP_FUSE_API int fsp_fuse_loop_mt(struct fuse *f) FSP_FUSE_API int fsp_fuse_loop_mt(struct fuse *f)
@ -247,7 +281,7 @@ FSP_FUSE_API int fsp_fuse_loop_mt(struct fuse *f)
FSP_FUSE_API void fsp_fuse_exit(struct fuse *f) FSP_FUSE_API void fsp_fuse_exit(struct fuse *f)
{ {
SetEvent(f->LoopEvent); FspServiceStop(f->Service);
} }
FSP_FUSE_API struct fuse_context *fsp_fuse_get_context(void) FSP_FUSE_API struct fuse_context *fsp_fuse_get_context(void)