vendor: update github.com/billziss-gh/cgofuse - fixes #1481
This commit is contained in:
+30
-15
@@ -12,10 +12,15 @@
|
||||
|
||||
// Package fuse allows the creation of user mode file systems in Go.
|
||||
//
|
||||
// A user mode file system must implement the methods in FileSystemInterface
|
||||
// and be hosted (mounted) by a FileSystemHost.
|
||||
// Alternatively a user mode file system can use the FileSystemBase struct which
|
||||
// provides default implementations of the methods in FileSystemInterface.
|
||||
// A user mode file system is a user mode process that receives file system operations
|
||||
// from the OS FUSE layer and satisfies them in user mode. A user mode file system
|
||||
// implements the interface FileSystemInterface either directly or by embedding a
|
||||
// FileSystemBase struct which provides a default (empty) implementation of all methods
|
||||
// in FileSystemInterface.
|
||||
//
|
||||
// In order to expose the user mode file system to the OS, the file system must be hosted
|
||||
// (mounted) by a FileSystemHost. The FileSystemHost Mount() method is used for this
|
||||
// purpose.
|
||||
package fuse
|
||||
|
||||
/*
|
||||
@@ -397,18 +402,28 @@ type Lock_t struct {
|
||||
}
|
||||
*/
|
||||
|
||||
// FileSystemInterface is the interface that all file systems must implement.
|
||||
// The file system will receive an Init() call when it is mounted and a Destroy()
|
||||
// call when it is unmounted (note that depending on how the file system is
|
||||
// terminated the file system may not receive the Destroy() call). All other
|
||||
// operations must return 0 on success or a FUSE error on failure. To return an
|
||||
// error return the NEGATIVE value of a particular error. For example, to report
|
||||
// "file not found" return -fuse.ENOENT.
|
||||
// FileSystemInterface is the interface that a user mode interface must implement.
|
||||
//
|
||||
// The file system will receive an Init() call when the file system is created;
|
||||
// the Init() call will happen prior to receiving any other file system calls.
|
||||
// Note that there are no guarantees on the exact timing of when Init() is called.
|
||||
// For example, it cannot be assumed that the file system is mounted at the time
|
||||
// the Init() call is received.
|
||||
//
|
||||
// The file system will receive a Destroy() call when the file system is destroyed;
|
||||
// the Destroy() call will always be the last call to be received by the file system.
|
||||
// Note that depending on how the file system is terminated the file system may not
|
||||
// receive the Destroy() call. For example, it will not receive the Destroy() call
|
||||
// if the file system process is forcibly killed.
|
||||
//
|
||||
// Except for Init() and Destroy() all file system operations must return 0 on success
|
||||
// or a FUSE error on failure. To return an error return the NEGATIVE value of a
|
||||
// particular error. For example, to report "file not found" return -fuse.ENOENT.
|
||||
type FileSystemInterface interface {
|
||||
// Init is called when the file system is mounted.
|
||||
// Init is called when the file system is created.
|
||||
Init()
|
||||
|
||||
// Destroy is called when the file system is unmounted.
|
||||
// Destroy is called when the file system is destroyed.
|
||||
Destroy()
|
||||
|
||||
// Statfs gets file system statistics.
|
||||
@@ -526,12 +541,12 @@ var _ error = (*Error)(nil)
|
||||
type FileSystemBase struct {
|
||||
}
|
||||
|
||||
// Init is called when the file system is mounted.
|
||||
// Init is called when the file system is created.
|
||||
// The FileSystemBase implementation does nothing.
|
||||
func (*FileSystemBase) Init() {
|
||||
}
|
||||
|
||||
// Destroy is called when the file system is unmounted.
|
||||
// Destroy is called when the file system is destroyed.
|
||||
// The FileSystemBase implementation does nothing.
|
||||
func (*FileSystemBase) Destroy() {
|
||||
}
|
||||
|
||||
+30
-10
@@ -15,9 +15,13 @@ package fuse
|
||||
/*
|
||||
#cgo darwin CFLAGS: -DFUSE_USE_VERSION=28 -D_FILE_OFFSET_BITS=64 -I/usr/local/include/osxfuse/fuse
|
||||
#cgo darwin LDFLAGS: -L/usr/local/lib -losxfuse
|
||||
|
||||
#cgo linux CFLAGS: -DFUSE_USE_VERSION=28 -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse
|
||||
#cgo linux LDFLAGS: -lfuse
|
||||
#cgo windows CFLAGS: -D_WIN32_WINNT=0x0600 -DFUSE_USE_VERSION=28
|
||||
|
||||
// Use `set CPATH=C:\Program Files (x86)\WinFsp\inc\fuse` on Windows.
|
||||
// The flag `I/usr/local/include/winfsp` only works on xgo and docker.
|
||||
#cgo windows CFLAGS: -D_WIN32_WINNT=0x0501 -DFUSE_USE_VERSION=28 -I/usr/local/include/winfsp
|
||||
|
||||
#if !(defined(__APPLE__) || defined(__linux__) || defined(_WIN32))
|
||||
#error platform not supported
|
||||
@@ -42,7 +46,7 @@ static PVOID cgofuse_init_slow(int hardfail);
|
||||
static VOID cgofuse_init_fail(VOID);
|
||||
static PVOID cgofuse_init_winfsp(VOID);
|
||||
|
||||
static SRWLOCK cgofuse_lock = SRWLOCK_INIT;
|
||||
static CRITICAL_SECTION cgofuse_lock;
|
||||
static PVOID cgofuse_module = 0;
|
||||
|
||||
static inline PVOID cgofuse_init_fast(int hardfail)
|
||||
@@ -57,7 +61,7 @@ static inline PVOID cgofuse_init_fast(int hardfail)
|
||||
static PVOID cgofuse_init_slow(int hardfail)
|
||||
{
|
||||
PVOID Module;
|
||||
AcquireSRWLockExclusive(&cgofuse_lock);
|
||||
EnterCriticalSection(&cgofuse_lock);
|
||||
Module = cgofuse_module;
|
||||
if (0 == Module)
|
||||
{
|
||||
@@ -65,7 +69,7 @@ static PVOID cgofuse_init_slow(int hardfail)
|
||||
MemoryBarrier();
|
||||
cgofuse_module = Module;
|
||||
}
|
||||
ReleaseSRWLockExclusive(&cgofuse_lock);
|
||||
LeaveCriticalSection(&cgofuse_lock);
|
||||
if (0 == Module && hardfail)
|
||||
cgofuse_init_fail();
|
||||
return Module;
|
||||
@@ -351,7 +355,22 @@ static int _hostGetxattr(char *path, char *name, char *value, size_t size,
|
||||
#define _hostGetxattr hostGetxattr
|
||||
#endif
|
||||
|
||||
static int hostInitializeFuse(void)
|
||||
// hostStaticInit, hostFuseInit and hostInit serve different purposes.
|
||||
//
|
||||
// hostStaticInit and hostFuseInit are needed to provide static and dynamic initialization
|
||||
// of the FUSE layer. This is currently useful on Windows only.
|
||||
//
|
||||
// hostInit is simply the .init implementation of struct fuse_operations.
|
||||
|
||||
static void hostStaticInit(void)
|
||||
{
|
||||
#if defined(__APPLE__) || defined(__linux__)
|
||||
#elif defined(_WIN32)
|
||||
InitializeCriticalSection(&cgofuse_lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int hostFuseInit(void)
|
||||
{
|
||||
#if defined(__APPLE__) || defined(__linux__)
|
||||
return 1;
|
||||
@@ -907,7 +926,7 @@ func hostInit(conn0 *C.struct_fuse_conn_info) (user_data unsafe.Pointer) {
|
||||
C.bool(host.capCaseInsensitive),
|
||||
C.bool(host.capReaddirPlus))
|
||||
if nil != host.sigc {
|
||||
signal.Notify(host.sigc, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
|
||||
signal.Notify(host.sigc, syscall.SIGINT, syscall.SIGTERM)
|
||||
}
|
||||
host.fsop.Init()
|
||||
return
|
||||
@@ -1023,11 +1042,8 @@ func (host *FileSystemHost) SetCapReaddirPlus(value bool) {
|
||||
// It is allowed for the mountpoint to be the empty string ("") in which case opts is assumed
|
||||
// to contain the mountpoint. It is also allowed for opts to be nil, although in this case the
|
||||
// mountpoint must be non-empty.
|
||||
//
|
||||
// The file system is considered mounted only after its Init() method has been called
|
||||
// and before its Destroy() method has been called.
|
||||
func (host *FileSystemHost) Mount(mountpoint string, opts []string) bool {
|
||||
if 0 == C.hostInitializeFuse() {
|
||||
if 0 == C.hostFuseInit() {
|
||||
panic("cgofuse: cannot find winfsp")
|
||||
}
|
||||
|
||||
@@ -1127,3 +1143,7 @@ func Getcontext() (uid uint32, gid uint32, pid int) {
|
||||
pid = int(C.fuse_get_context().pid)
|
||||
return
|
||||
}
|
||||
|
||||
func init() {
|
||||
C.hostStaticInit()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user