Documentation ¶
Overview ¶
Package fuse enables writing FUSE file systems on Linux, OS X, and FreeBSD.
On OS X, it requires OSXFUSE (http://osxfuse.github.com/).
There are two approaches to writing a FUSE file system. The first is to speak the low-level message protocol, reading from a Conn using ReadRequest and writing using the various Respond methods. This approach is closest to the actual interaction with the kernel and can be the simplest one in contexts such as protocol translators.
Servers of synthesized file systems tend to share common bookkeeping abstracted away by the second approach, which is to call fs.Serve to serve the FUSE protocol using an implementation of the service methods in the interfaces FS* (file system), Node* (file or directory), and Handle* (opened file or directory). There are a daunting number of such methods that can be written, but few are required. The specific methods are described in the documentation for those interfaces.
The hellofs subdirectory contains a simple illustration of the fs.Serve approach.
Service Methods ¶
The required and optional methods for the FS, Node, and Handle interfaces have the general form
Op(ctx context.Context, req *OpRequest, resp *OpResponse) error
where Op is the name of a FUSE operation. Op reads request parameters from req and writes results to resp. An operation whose only result is the error result omits the resp parameter.
Multiple goroutines may call service methods simultaneously; the methods being called are responsible for appropriate synchronization.
The operation must not hold on to the request or response, including any []byte fields such as WriteRequest.Data or SetxattrRequest.Xattr.
Errors ¶
Operations can return errors. The FUSE interface can only communicate POSIX errno error numbers to file system clients, the message is not visible to file system clients. The returned error can implement ErrorNumber to control the errno returned. Without ErrorNumber, a generic errno (EIO) is returned.
Error messages will be visible in the debug log as part of the response.
Interrupted Operations ¶
In some file systems, some operations may take an undetermined amount of time. For example, a Read waiting for a network message or a matching Write might wait indefinitely. If the request is cancelled and no longer needed, the context will be cancelled. Blocking operations should select on a receive from ctx.Done() and attempt to abort the operation early if the receive succeeds (meaning the channel is closed). To indicate that the operation failed because it was aborted, return syscall.EINTR.
If an operation does not block for an indefinite amount of time, supporting cancellation is not necessary.
Authentication ¶
All requests types embed a Header, meaning that the method can inspect req.Pid, req.Uid, and req.Gid as necessary to implement permission checking. The kernel FUSE layer normally prevents other users from accessing the FUSE file system (to change this, see AllowOther), but does not enforce access modes (to change this, see DefaultPermissions).
Mount Options ¶
Behavior and metadata of the mounted file system can be changed by passing MountOption values to Mount.
Index ¶
- Constants
- Variables
- func AppendDirent(data []byte, dir Dirent) []byte
- func Unmount(dir string) error
- type AccessRequest
- type Attr
- type Conn
- type CreateRequest
- type CreateResponse
- type DestroyRequest
- type Dirent
- type DirentType
- type Errno
- type ErrorNumber
- type ExchangeDataRequest
- type FlushRequest
- type ForgetRequest
- type FsyncRequest
- type GetattrFlags
- type GetattrRequest
- type GetattrResponse
- type GetxattrRequest
- type GetxattrResponse
- type HandleID
- type Header
- type InitFlags
- type InitRequest
- type InitResponse
- type InterruptRequest
- type LinkRequest
- type ListxattrRequest
- type ListxattrResponse
- type LookupRequest
- type LookupResponse
- type MkdirRequest
- type MkdirResponse
- type MknodRequest
- type MountOption
- func AllowDev() MountOption
- func AllowNonEmptyMount() MountOption
- func AllowOther() MountOption
- func AllowSUID() MountOption
- func AsyncRead() MountOption
- func DaemonTimeout(name string) MountOption
- func DefaultPermissions() MountOption
- func ExclCreate() MountOption
- func FSName(name string) MountOption
- func LocalVolume() MountOption
- func MaxReadahead(n uint32) MountOption
- func NoAppleDouble() MountOption
- func NoAppleXattr() MountOption
- func NoBrowse() MountOption
- func OSXFUSELocations(paths ...OSXFUSEPaths) MountOption
- func ReadOnly() MountOption
- func Subtype(fstype string) MountOption
- func VolumeName(name string) MountOption
- func WritebackCache() MountOption
- type MountpointDoesNotExistError
- type NodeID
- type OSXFUSEPaths
- type OldVersionError
- type OpenFlags
- type OpenRequest
- type OpenResponse
- type OpenResponseFlags
- type Protocol
- func (a Protocol) GE(b Protocol) bool
- func (a Protocol) HasAttrBlockSize() bool
- func (a Protocol) HasGetattrFlags() bool
- func (a Protocol) HasInvalidate() bool
- func (a Protocol) HasOpenNonSeekable() bool
- func (a Protocol) HasReadWriteFlags() bool
- func (a Protocol) HasUmask() bool
- func (a Protocol) LT(b Protocol) bool
- func (p Protocol) String() string
- type ReadFlags
- type ReadRequest
- type ReadResponse
- type ReadlinkRequest
- type ReleaseFlags
- type ReleaseRequest
- type RemoveRequest
- type RemovexattrRequest
- type RenameRequest
- type Request
- type RequestID
- type SetattrRequest
- type SetattrResponse
- type SetattrValid
- func (fl SetattrValid) Atime() bool
- func (fl SetattrValid) AtimeNow() bool
- func (fl SetattrValid) Bkuptime() bool
- func (fl SetattrValid) Chgtime() bool
- func (fl SetattrValid) Crtime() bool
- func (fl SetattrValid) Flags() bool
- func (fl SetattrValid) Gid() bool
- func (fl SetattrValid) Handle() bool
- func (fl SetattrValid) LockOwner() bool
- func (fl SetattrValid) Mode() bool
- func (fl SetattrValid) Mtime() bool
- func (fl SetattrValid) MtimeNow() bool
- func (fl SetattrValid) Size() bool
- func (fl SetattrValid) String() string
- func (fl SetattrValid) Uid() bool
- type SetxattrRequest
- type StatfsRequest
- type StatfsResponse
- type SymlinkRequest
- type SymlinkResponse
- type WriteFlags
- type WriteRequest
- type WriteResponse
Constants ¶
const ( // ENOSYS indicates that the call is not supported. ENOSYS = Errno(syscall.ENOSYS) // ESTALE is used by Serve to respond to violations of the FUSE protocol. ESTALE = Errno(syscall.ESTALE) ENOENT = Errno(syscall.ENOENT) EIO = Errno(syscall.EIO) EPERM = Errno(syscall.EPERM) // EINTR indicates request was interrupted by an InterruptRequest. // See also fs.Intr. EINTR = Errno(syscall.EINTR) ERANGE = Errno(syscall.ERANGE) ENOTSUP = Errno(syscall.ENOTSUP) EEXIST = Errno(syscall.EEXIST) )
Deprecated: Return a syscall.Errno directly. See ToErrno for exact rules.
const DefaultErrno = EIO
DefaultErrno is the errno used when error returned does not implement ErrorNumber.
const (
ENODATA = Errno(syscall.ENODATA)
)
const ErrNoXattr = errNoXattr
ErrNoXattr is a platform-independent error value meaning the extended attribute was not found. It can be used to respond to GetxattrRequest and such.
Variables ¶
var ( MacFuseLocation = OSXFUSEPaths{ DevicePrefix: "/dev/macfuse", Load: "/Library/Filesystems/macfuse.fs/Contents/Resources/load_macfuse", Mount: "/Library/Filesystems/macfuse.fs/Contents/Resources/mount_macfuse", DaemonVar: "MOUNT_FUSEFS_DAEMON_PATH", } OSXFUSELocationV3 = OSXFUSEPaths{ DevicePrefix: "/dev/osxfuse", Load: "/Library/Filesystems/osxfuse.fs/Contents/Resources/load_osxfuse", Mount: "/Library/Filesystems/osxfuse.fs/Contents/Resources/mount_osxfuse", DaemonVar: "MOUNT_OSXFUSE_DAEMON_PATH", } OSXFUSELocationV2 = OSXFUSEPaths{ DevicePrefix: "/dev/osxfuse", Load: "/Library/Filesystems/osxfusefs.fs/Support/load_osxfusefs", Mount: "/Library/Filesystems/osxfusefs.fs/Support/mount_osxfusefs", DaemonVar: "MOUNT_FUSEFS_DAEMON_PATH", } )
Default paths for OSXFUSE. See OSXFUSELocations.
var Debug func(msg interface{}) = nop
Debug is called to output debug messages, including protocol traces. The default behavior is to do nothing.
The messages have human-friendly string representations and are safe to marshal to JSON.
Implementations must not retain msg.
var (
ErrClosedWithoutInit = errors.New("fuse connection closed without init")
)
var (
ErrNotCached = notCachedError{}
)
var ( // ErrOSXFUSENotFound is returned from Mount when the OSXFUSE // installation is not detected. // // Only happens on OS X. Make sure OSXFUSE is installed, or see // OSXFUSELocations for customization. ErrOSXFUSENotFound = errors.New("cannot locate OSXFUSE") )
Functions ¶
func AppendDirent ¶
AppendDirent appends the encoded form of a directory entry to data and returns the resulting slice.
Types ¶
type AccessRequest ¶
An AccessRequest asks whether the file can be accessed for the purpose specified by the mask.
func (*AccessRequest) Respond ¶
func (r *AccessRequest) Respond()
Respond replies to the request indicating that access is allowed. To deny access, use RespondError.
func (*AccessRequest) String ¶
func (r *AccessRequest) String() string
type Attr ¶
type Attr struct { Valid time.Duration // how long Attr can be cached Inode uint64 // inode number Size uint64 // size in bytes Blocks uint64 // size in 512-byte units Atime time.Time // time of last access Mtime time.Time // time of last modification Ctime time.Time // time of last inode change Crtime time.Time // time of creation (OS X only) Mode os.FileMode // file mode Nlink uint32 // number of links (usually 1) Uid uint32 // owner uid Gid uint32 // group gid Rdev uint32 // device numbers Flags uint32 // chflags(2) flags (OS X only) BlockSize uint32 // preferred blocksize for filesystem I/O }
An Attr is the metadata for a single file or directory.
type Conn ¶
type Conn struct { // Ready is closed when the mount is complete or has failed. Ready <-chan struct{} // MountError stores any error from the mount process. Only valid // after Ready is closed. MountError error // contains filtered or unexported fields }
A Conn represents a connection to a mounted FUSE file system.
func Mount ¶
func Mount(dir string, options ...MountOption) (*Conn, error)
Mount mounts a new FUSE connection on the named directory and returns a connection for reading and writing FUSE messages.
After a successful return, caller must call Close to free resources.
Even on successful return, the new mount is not guaranteed to be visible until after Conn.Ready is closed. See Conn.MountError for possible errors. Incoming requests on Conn must be served to make progress.
func (*Conn) InvalidateEntry ¶
InvalidateEntry invalidates the kernel cache of the directory entry identified by parent directory node ID and entry basename.
Kernel may or may not cache directory listings. To invalidate those, use InvalidateNode to invalidate all of the data for a directory. (As of 2015-06, Linux FUSE does not cache directory listings.)
Returns ErrNotCached if the kernel is not currently caching the node.
func (*Conn) InvalidateNode ¶
InvalidateNode invalidates the kernel cache of the attributes and a range of the data of a node.
Giving offset 0 and size -1 means all data. To invalidate just the attributes, give offset 0 and size 0.
Returns ErrNotCached if the kernel is not currently caching the node.
func (*Conn) ReadRequest ¶
ReadRequest returns the next FUSE request from the kernel.
Caller must call either Request.Respond or Request.RespondError in a reasonable time. Caller must not retain Request after that call.
type CreateRequest ¶
type CreateRequest struct { Header `json:"-"` Name string Flags OpenFlags Mode os.FileMode // Umask of the request. Not supported on OS X. Umask os.FileMode }
A CreateRequest asks to create and open a file (not a directory).
func (*CreateRequest) Respond ¶
func (r *CreateRequest) Respond(resp *CreateResponse)
Respond replies to the request with the given response.
func (*CreateRequest) String ¶
func (r *CreateRequest) String() string
type CreateResponse ¶
type CreateResponse struct { LookupResponse OpenResponse }
A CreateResponse is the response to a CreateRequest. It describes the created node and opened handle.
func (*CreateResponse) String ¶
func (r *CreateResponse) String() string
type DestroyRequest ¶
type DestroyRequest struct {
Header `json:"-"`
}
A DestroyRequest is sent by the kernel when unmounting the file system. No more requests will be received after this one, but it should still be responded to.
func (*DestroyRequest) String ¶
func (r *DestroyRequest) String() string
type Dirent ¶
type Dirent struct { // Inode this entry names. Inode uint64 // Type of the entry, for example DT_File. // // Setting this is optional. The zero value (DT_Unknown) means // callers will just need to do a Getattr when the type is // needed. Providing a type can speed up operations // significantly. Type DirentType // Name of the entry Name string }
A Dirent represents a single directory entry.
type DirentType ¶
type DirentType uint32
Type of an entry in a directory listing.
const ( DT_Unknown DirentType = 0 DT_Socket DirentType = syscall.S_IFSOCK >> 12 DT_Link DirentType = syscall.S_IFLNK >> 12 DT_File DirentType = syscall.S_IFREG >> 12 DT_Block DirentType = syscall.S_IFBLK >> 12 DT_Dir DirentType = syscall.S_IFDIR >> 12 DT_Char DirentType = syscall.S_IFCHR >> 12 DT_FIFO DirentType = syscall.S_IFIFO >> 12 )
func (DirentType) String ¶
func (t DirentType) String() string
type Errno ¶
Errno implements Error and ErrorNumber using a syscall.Errno.
func ToErrno ¶
ToErrno converts arbitrary errors to Errno.
If the underlying type of err is syscall.Errno, it is used directly. No unwrapping is done, to prevent wrong errors from leaking via e.g. *os.PathError.
If err unwraps to implement ErrorNumber, that is used.
Finally, returns DefaultErrno.
func (Errno) ErrnoName ¶
ErrnoName returns the short non-numeric identifier for this errno. For example, "EIO".
func (Errno) MarshalText ¶
type ErrorNumber ¶
type ErrorNumber interface { // Errno returns the the error number (errno) for this error. Errno() Errno }
An ErrorNumber is an error with a specific error number.
Operations may return an error value that implements ErrorNumber to control what specific error number (errno) to return.
type ExchangeDataRequest ¶
An ExchangeDataRequest is a request to exchange the contents of two files, while leaving most metadata untouched.
This request comes from OS X exchangedata(2) and represents its specific semantics. Crucially, it is very different from Linux renameat(2) RENAME_EXCHANGE.
func (*ExchangeDataRequest) Respond ¶
func (r *ExchangeDataRequest) Respond()
func (*ExchangeDataRequest) String ¶
func (r *ExchangeDataRequest) String() string
type FlushRequest ¶
A FlushRequest asks for the current state of an open file to be flushed to storage, as when a file descriptor is being closed. A single opened Handle may receive multiple FlushRequests over its lifetime.
func (*FlushRequest) Respond ¶
func (r *FlushRequest) Respond()
Respond replies to the request, indicating that the flush succeeded.
func (*FlushRequest) String ¶
func (r *FlushRequest) String() string
type ForgetRequest ¶
A ForgetRequest is sent by the kernel when forgetting about r.Node as returned by r.N lookup requests.
func (*ForgetRequest) Respond ¶
func (r *ForgetRequest) Respond()
Respond replies to the request, indicating that the forgetfulness has been recorded.
func (*ForgetRequest) String ¶
func (r *ForgetRequest) String() string
type FsyncRequest ¶
type FsyncRequest struct { Header `json:"-"` Handle HandleID // TODO bit 1 is datasync, not well documented upstream Flags uint32 Dir bool }
func (*FsyncRequest) Respond ¶
func (r *FsyncRequest) Respond()
func (*FsyncRequest) String ¶
func (r *FsyncRequest) String() string
type GetattrFlags ¶
type GetattrFlags uint32
GetattrFlags are bit flags that can be seen in GetattrRequest.
const ( // Indicates the handle is valid. GetattrFh GetattrFlags = 1 << 0 )
func (GetattrFlags) String ¶
func (fl GetattrFlags) String() string
type GetattrRequest ¶
type GetattrRequest struct { Header `json:"-"` Flags GetattrFlags Handle HandleID }
A GetattrRequest asks for the metadata for the file denoted by r.Node.
func (*GetattrRequest) Respond ¶
func (r *GetattrRequest) Respond(resp *GetattrResponse)
Respond replies to the request with the given response.
func (*GetattrRequest) String ¶
func (r *GetattrRequest) String() string
type GetattrResponse ¶
type GetattrResponse struct {
Attr Attr // file attributes
}
A GetattrResponse is the response to a GetattrRequest.
func (*GetattrResponse) String ¶
func (r *GetattrResponse) String() string
type GetxattrRequest ¶
type GetxattrRequest struct { Header `json:"-"` // Maximum size to return. Size uint32 // Name of the attribute requested. Name string // Offset within extended attributes. // // Only valid for OS X, and then only with the resource fork // attribute. Position uint32 }
A GetxattrRequest asks for the extended attributes associated with r.Node.
func (*GetxattrRequest) Respond ¶
func (r *GetxattrRequest) Respond(resp *GetxattrResponse)
Respond replies to the request with the given response.
func (*GetxattrRequest) String ¶
func (r *GetxattrRequest) String() string
type GetxattrResponse ¶
type GetxattrResponse struct {
Xattr []byte
}
A GetxattrResponse is the response to a GetxattrRequest.
func (*GetxattrResponse) String ¶
func (r *GetxattrResponse) String() string
type HandleID ¶
type HandleID uint64
A HandleID is a number identifying an open directory or file. It only needs to be unique while the directory or file is open.
type Header ¶
type Header struct { Conn *Conn `json:"-"` // connection this request was received on ID RequestID // unique ID for request Node NodeID // file or directory the request is about Uid uint32 // user ID of process making request Gid uint32 // group ID of process making request Pid uint32 // process ID of process making request // contains filtered or unexported fields }
A Header describes the basic information sent in every request.
func (*Header) RespondError ¶
type InitFlags ¶
type InitFlags uint32
The InitFlags are used in the Init exchange.
const ( InitAsyncRead InitFlags = 1 << 0 InitPosixLocks InitFlags = 1 << 1 InitFileOps InitFlags = 1 << 2 InitAtomicTrunc InitFlags = 1 << 3 InitExportSupport InitFlags = 1 << 4 InitBigWrites InitFlags = 1 << 5 // Do not mask file access modes with umask. Not supported on OS X. InitDontMask InitFlags = 1 << 6 InitSpliceWrite InitFlags = 1 << 7 InitSpliceMove InitFlags = 1 << 8 InitSpliceRead InitFlags = 1 << 9 InitFlockLocks InitFlags = 1 << 10 InitHasIoctlDir InitFlags = 1 << 11 InitAutoInvalData InitFlags = 1 << 12 InitDoReaddirplus InitFlags = 1 << 13 InitReaddirplusAuto InitFlags = 1 << 14 InitAsyncDIO InitFlags = 1 << 15 InitWritebackCache InitFlags = 1 << 16 InitNoOpenSupport InitFlags = 1 << 17 InitCaseSensitive InitFlags = 1 << 29 // OS X only InitVolRename InitFlags = 1 << 30 // OS X only InitXtimes InitFlags = 1 << 31 // OS X only )
type InitRequest ¶
type InitRequest struct { Header `json:"-"` Kernel Protocol // Maximum readahead in bytes that the kernel plans to use. MaxReadahead uint32 Flags InitFlags }
An InitRequest is the first request sent on a FUSE file system.
func (*InitRequest) Respond ¶
func (r *InitRequest) Respond(resp *InitResponse)
Respond replies to the request with the given response.
func (*InitRequest) String ¶
func (r *InitRequest) String() string
type InitResponse ¶
type InitResponse struct { Library Protocol // Maximum readahead in bytes that the kernel can use. Ignored if // greater than InitRequest.MaxReadahead. MaxReadahead uint32 Flags InitFlags // Maximum size of a single write operation. // Linux enforces a minimum of 4 KiB. MaxWrite uint32 }
An InitResponse is the response to an InitRequest.
func (*InitResponse) String ¶
func (r *InitResponse) String() string
type InterruptRequest ¶
type InterruptRequest struct { Header `json:"-"` IntrID RequestID // ID of the request to be interrupt. }
An InterruptRequest is a request to interrupt another pending request. The response to that request should return an error status of EINTR.
func (*InterruptRequest) Respond ¶
func (r *InterruptRequest) Respond()
func (*InterruptRequest) String ¶
func (r *InterruptRequest) String() string
type LinkRequest ¶
A LinkRequest is a request to create a hard link.
func (*LinkRequest) Respond ¶
func (r *LinkRequest) Respond(resp *LookupResponse)
func (*LinkRequest) String ¶
func (r *LinkRequest) String() string
type ListxattrRequest ¶
type ListxattrRequest struct { Header `json:"-"` Size uint32 // maximum size to return Position uint32 // offset within attribute list }
A ListxattrRequest asks to list the extended attributes associated with r.Node.
func (*ListxattrRequest) Respond ¶
func (r *ListxattrRequest) Respond(resp *ListxattrResponse)
Respond replies to the request with the given response.
func (*ListxattrRequest) String ¶
func (r *ListxattrRequest) String() string
type ListxattrResponse ¶
type ListxattrResponse struct {
Xattr []byte
}
A ListxattrResponse is the response to a ListxattrRequest.
func (*ListxattrResponse) Append ¶
func (r *ListxattrResponse) Append(names ...string)
Append adds an extended attribute name to the response.
func (*ListxattrResponse) String ¶
func (r *ListxattrResponse) String() string
type LookupRequest ¶
A LookupRequest asks to look up the given name in the directory named by r.Node.
func (*LookupRequest) Respond ¶
func (r *LookupRequest) Respond(resp *LookupResponse)
Respond replies to the request with the given response.
func (*LookupRequest) String ¶
func (r *LookupRequest) String() string
type LookupResponse ¶
A LookupResponse is the response to a LookupRequest.
func (*LookupResponse) String ¶
func (r *LookupResponse) String() string
type MkdirRequest ¶
type MkdirRequest struct { Header `json:"-"` Name string Mode os.FileMode // Umask of the request. Not supported on OS X. Umask os.FileMode }
A MkdirRequest asks to create (but not open) a directory.
func (*MkdirRequest) Respond ¶
func (r *MkdirRequest) Respond(resp *MkdirResponse)
Respond replies to the request with the given response.
func (*MkdirRequest) String ¶
func (r *MkdirRequest) String() string
type MkdirResponse ¶
type MkdirResponse struct {
LookupResponse
}
A MkdirResponse is the response to a MkdirRequest.
func (*MkdirResponse) String ¶
func (r *MkdirResponse) String() string
type MknodRequest ¶
type MknodRequest struct { Header `json:"-"` Name string Mode os.FileMode Rdev uint32 // Umask of the request. Not supported on OS X. Umask os.FileMode }
func (*MknodRequest) Respond ¶
func (r *MknodRequest) Respond(resp *LookupResponse)
func (*MknodRequest) String ¶
func (r *MknodRequest) String() string
type MountOption ¶
type MountOption mountOption
MountOption is passed to Mount to change the behavior of the mount.
func AllowDev ¶
func AllowDev() MountOption
AllowDev enables interpreting character or block special devices on the filesystem.
func AllowNonEmptyMount ¶
func AllowNonEmptyMount() MountOption
AllowNonEmptyMount allows the mounting over a non-empty directory.
The files in it will be shadowed by the freshly created mount. By default these mounts are rejected to prevent accidental covering up of data, which could for example prevent automatic backup.
func AllowOther ¶
func AllowOther() MountOption
AllowOther allows other users to access the file system.
func AllowSUID ¶
func AllowSUID() MountOption
AllowSUID allows set-user-identifier or set-group-identifier bits to take effect.
func AsyncRead ¶
func AsyncRead() MountOption
AsyncRead enables multiple outstanding read requests for the same handle. Without this, there is at most one request in flight at a time.
func DaemonTimeout ¶
func DaemonTimeout(name string) MountOption
DaemonTimeout sets the time in seconds between a request and a reply before the FUSE mount is declared dead.
OS X and FreeBSD only. Others ignore this option.
func DefaultPermissions ¶
func DefaultPermissions() MountOption
DefaultPermissions makes the kernel enforce access control based on the file mode (as in chmod).
Without this option, the Node itself decides what is and is not allowed. This is normally ok because FUSE file systems cannot be accessed by other users without AllowOther.
FreeBSD ignores this option.
func ExclCreate ¶
func ExclCreate() MountOption
ExclCreate causes O_EXCL flag to be set for only "truly" exclusive creates, i.e. create calls for which the initiator explicitly set the O_EXCL flag.
OSXFUSE expects all create calls to return EEXIST in case the file already exists, regardless of whether O_EXCL was specified or not. To ensure this behavior, it normally sets OpenExclusive for all Create calls, regardless of whether the original call had it set. For distributed filesystems, that may force every file create to be a distributed consensus action, causing undesirable delays.
This option makes the FUSE filesystem see the original flag value, and better decide when to ensure global consensus.
Note that returning EEXIST on existing file create is still expected with OSXFUSE, regardless of the presence of the OpenExclusive flag.
For more information, see https://github.com/osxfuse/osxfuse/issues/209
OS X only. Others ignore this options. Requires OSXFUSE 3.4.1 or newer.
func FSName ¶
func FSName(name string) MountOption
FSName sets the file system name (also called source) that is visible in the list of mounted file systems.
FreeBSD ignores this option.
func LocalVolume ¶
func LocalVolume() MountOption
LocalVolume sets the volume to be local (instead of network), changing the behavior of Finder, Spotlight, and such.
OS X only. Others ignore this option.
func MaxReadahead ¶
func MaxReadahead(n uint32) MountOption
MaxReadahead sets the number of bytes that can be prefetched for sequential reads. The kernel can enforce a maximum value lower than this.
This setting makes the kernel perform speculative reads that do not originate from any client process. This usually tremendously improves read performance.
func NoAppleDouble ¶
func NoAppleDouble() MountOption
NoAppleDouble makes OSXFUSE disallow files with names used by OS X to store extended attributes on file systems that do not support them natively.
Such file names are:
._* .DS_Store
OS X only. Others ignore this option.
func NoAppleXattr ¶
func NoAppleXattr() MountOption
NoAppleXattr makes OSXFUSE disallow extended attributes with the prefix "com.apple.". This disables persistent Finder state and other such information.
OS X only. Others ignore this option.
func NoBrowse ¶
func NoBrowse() MountOption
NoBrowse makes OSXFUSE mark the volume as non-browsable, so that Finder won't automatically browse it.
OS X only. Others ignore this option.
func OSXFUSELocations ¶
func OSXFUSELocations(paths ...OSXFUSEPaths) MountOption
OSXFUSELocations sets where to look for OSXFUSE files. The arguments are all the possible locations. The previous locations are replaced.
Without this option, OSXFUSELocationV3 and OSXFUSELocationV2 are used.
OS X only. Others ignore this option.
func Subtype ¶
func Subtype(fstype string) MountOption
Subtype sets the subtype of the mount. The main type is always `fuse`. The type in a list of mounted file systems will look like `fuse.foo`.
OS X ignores this option. FreeBSD ignores this option.
func VolumeName ¶
func VolumeName(name string) MountOption
VolumeName sets the volume name shown in Finder.
OS X only. Others ignore this option.
func WritebackCache ¶
func WritebackCache() MountOption
WritebackCache enables the kernel to buffer writes before sending them to the FUSE server. Without this, writethrough caching is used.
type MountpointDoesNotExistError ¶
type MountpointDoesNotExistError struct {
Path string
}
MountpointDoesNotExistError is an error returned when the mountpoint does not exist.
func (*MountpointDoesNotExistError) Error ¶
func (e *MountpointDoesNotExistError) Error() string
type NodeID ¶
type NodeID uint64
A NodeID is a number identifying a directory or file. It must be unique among IDs returned in LookupResponses that have not yet been forgotten by ForgetRequests.
const RootID NodeID = rootID
The RootID identifies the root directory of a FUSE file system.
type OSXFUSEPaths ¶
type OSXFUSEPaths struct { // Prefix for the device file. At mount time, an incrementing // number is suffixed until a free FUSE device is found. DevicePrefix string // Path of the load helper, used to load the kernel extension if // no device files are found. Load string // Path of the mount helper, used for the actual mount operation. Mount string // Environment variable used to pass the path to the executable // calling the mount helper. DaemonVar string }
OSXFUSEPaths describes the paths used by an installed OSXFUSE version. See OSXFUSELocationV3 for typical values.
type OldVersionError ¶
func (*OldVersionError) Error ¶
func (e *OldVersionError) Error() string
type OpenFlags ¶
type OpenFlags uint32
OpenFlags are the O_FOO flags passed to open/create/etc calls. For example, os.O_WRONLY | os.O_APPEND.
const ( // Access modes. These are not 1-bit flags, but alternatives where // only one can be chosen. See the IsReadOnly etc convenience // methods. OpenReadOnly OpenFlags = syscall.O_RDONLY OpenWriteOnly OpenFlags = syscall.O_WRONLY OpenReadWrite OpenFlags = syscall.O_RDWR // File was opened in append-only mode, all writes will go to end // of file. OS X does not provide this information. OpenAppend OpenFlags = syscall.O_APPEND OpenCreate OpenFlags = syscall.O_CREAT OpenDirectory OpenFlags = syscall.O_DIRECTORY OpenExclusive OpenFlags = syscall.O_EXCL OpenNonblock OpenFlags = syscall.O_NONBLOCK OpenSync OpenFlags = syscall.O_SYNC OpenTruncate OpenFlags = syscall.O_TRUNC )
Flags that can be seen in OpenRequest.Flags.
OpenAccessModeMask is a bitmask that separates the access mode from the other flags in OpenFlags.
func (OpenFlags) IsReadOnly ¶
Return true if OpenReadOnly is set.
func (OpenFlags) IsReadWrite ¶
Return true if OpenReadWrite is set.
func (OpenFlags) IsWriteOnly ¶
Return true if OpenWriteOnly is set.
type OpenRequest ¶
An OpenRequest asks to open a file or directory
func (*OpenRequest) Respond ¶
func (r *OpenRequest) Respond(resp *OpenResponse)
Respond replies to the request with the given response.
func (*OpenRequest) String ¶
func (r *OpenRequest) String() string
type OpenResponse ¶
type OpenResponse struct { Handle HandleID Flags OpenResponseFlags }
A OpenResponse is the response to a OpenRequest.
func (*OpenResponse) String ¶
func (r *OpenResponse) String() string
type OpenResponseFlags ¶
type OpenResponseFlags uint32
The OpenResponseFlags are returned in the OpenResponse.
const ( OpenDirectIO OpenResponseFlags = 1 << 0 // bypass page cache for this open file OpenKeepCache OpenResponseFlags = 1 << 1 // don't invalidate the data cache on open OpenNonSeekable OpenResponseFlags = 1 << 2 // mark the file as non-seekable (not supported on OS X or FreeBSD) OpenPurgeAttr OpenResponseFlags = 1 << 30 // OS X OpenPurgeUBC OpenResponseFlags = 1 << 31 // OS X )
func (OpenResponseFlags) String ¶
func (fl OpenResponseFlags) String() string
type Protocol ¶
Protocol is a FUSE protocol version number.
func (Protocol) HasAttrBlockSize ¶
HasAttrBlockSize returns whether Attr.BlockSize is respected by the kernel.
func (Protocol) HasGetattrFlags ¶
HasGetattrFlags returns whether GetattrRequest field Flags is valid.
func (Protocol) HasInvalidate ¶
HasInvalidate returns whether InvalidateNode/InvalidateEntry are supported.
func (Protocol) HasOpenNonSeekable ¶
HasOpenNonSeekable returns whether OpenResponse field Flags flag OpenNonSeekable is supported.
func (Protocol) HasReadWriteFlags ¶
HasReadWriteFlags returns whether ReadRequest/WriteRequest fields Flags and FileFlags are valid.
type ReadFlags ¶
type ReadFlags uint32
The ReadFlags are passed in ReadRequest.
const ( // LockOwner field is valid. ReadLockOwner ReadFlags = 1 << 1 )
type ReadRequest ¶
type ReadRequest struct { Header `json:"-"` Dir bool // is this Readdir? Handle HandleID Offset int64 Size int Flags ReadFlags LockOwner uint64 FileFlags OpenFlags }
A ReadRequest asks to read from an open file.
func (*ReadRequest) Respond ¶
func (r *ReadRequest) Respond(resp *ReadResponse)
Respond replies to the request with the given response.
func (*ReadRequest) String ¶
func (r *ReadRequest) String() string
type ReadResponse ¶
type ReadResponse struct {
Data []byte
}
A ReadResponse is the response to a ReadRequest.
func (*ReadResponse) MarshalJSON ¶
func (r *ReadResponse) MarshalJSON() ([]byte, error)
func (*ReadResponse) String ¶
func (r *ReadResponse) String() string
type ReadlinkRequest ¶
type ReadlinkRequest struct {
Header `json:"-"`
}
A ReadlinkRequest is a request to read a symlink's target.
func (*ReadlinkRequest) Respond ¶
func (r *ReadlinkRequest) Respond(target string)
func (*ReadlinkRequest) String ¶
func (r *ReadlinkRequest) String() string
type ReleaseFlags ¶
type ReleaseFlags uint32
The ReleaseFlags are used in the Release exchange.
const (
ReleaseFlush ReleaseFlags = 1 << 0
)
func (ReleaseFlags) String ¶
func (fl ReleaseFlags) String() string
type ReleaseRequest ¶
type ReleaseRequest struct { Header `json:"-"` Dir bool // is this Releasedir? Handle HandleID Flags OpenFlags // flags from OpenRequest ReleaseFlags ReleaseFlags LockOwner uint32 }
A ReleaseRequest asks to release (close) an open file handle.
func (*ReleaseRequest) Respond ¶
func (r *ReleaseRequest) Respond()
Respond replies to the request, indicating that the handle has been released.
func (*ReleaseRequest) String ¶
func (r *ReleaseRequest) String() string
type RemoveRequest ¶
type RemoveRequest struct { Header `json:"-"` Name string // name of the entry to remove Dir bool // is this rmdir? }
A RemoveRequest asks to remove a file or directory from the directory r.Node.
func (*RemoveRequest) Respond ¶
func (r *RemoveRequest) Respond()
Respond replies to the request, indicating that the file was removed.
func (*RemoveRequest) String ¶
func (r *RemoveRequest) String() string
type RemovexattrRequest ¶
A RemovexattrRequest asks to remove an extended attribute associated with r.Node.
func (*RemovexattrRequest) Respond ¶
func (r *RemovexattrRequest) Respond()
Respond replies to the request, indicating that the attribute was removed.
func (*RemovexattrRequest) String ¶
func (r *RemovexattrRequest) String() string
type RenameRequest ¶
A RenameRequest is a request to rename a file.
func (*RenameRequest) Respond ¶
func (r *RenameRequest) Respond()
func (*RenameRequest) String ¶
func (r *RenameRequest) String() string
type Request ¶
type Request interface { // Hdr returns the Header associated with this request. Hdr() *Header // RespondError responds to the request with the given error. RespondError(error) String() string }
A Request represents a single FUSE request received from the kernel. Use a type switch to determine the specific kind. A request of unrecognized type will have concrete type *Header.
type SetattrRequest ¶
type SetattrRequest struct { Header `json:"-"` Valid SetattrValid Handle HandleID Size uint64 Atime time.Time Mtime time.Time // Mode is the file mode to set (when valid). // // The type of the node (as in os.ModeType, os.ModeDir etc) is not // guaranteed to be sent by the kernel, in which case // os.ModeIrregular will be set. Mode os.FileMode Uid uint32 Gid uint32 // OS X only Bkuptime time.Time Chgtime time.Time Crtime time.Time Flags uint32 // see chflags(2) }
A SetattrRequest asks to change one or more attributes associated with a file, as indicated by Valid.
func (*SetattrRequest) Respond ¶
func (r *SetattrRequest) Respond(resp *SetattrResponse)
Respond replies to the request with the given response, giving the updated attributes.
func (*SetattrRequest) String ¶
func (r *SetattrRequest) String() string
type SetattrResponse ¶
type SetattrResponse struct {
Attr Attr // file attributes
}
A SetattrResponse is the response to a SetattrRequest.
func (*SetattrResponse) String ¶
func (r *SetattrResponse) String() string
type SetattrValid ¶
type SetattrValid uint32
The SetattrValid are bit flags describing which fields in the SetattrRequest are included in the change.
const ( SetattrMode SetattrValid = 1 << 0 SetattrUid SetattrValid = 1 << 1 SetattrGid SetattrValid = 1 << 2 SetattrSize SetattrValid = 1 << 3 SetattrAtime SetattrValid = 1 << 4 SetattrMtime SetattrValid = 1 << 5 SetattrHandle SetattrValid = 1 << 6 // Linux only(?) SetattrAtimeNow SetattrValid = 1 << 7 SetattrMtimeNow SetattrValid = 1 << 8 SetattrLockOwner SetattrValid = 1 << 9 // http://www.mail-archive.com/git-commits-head@vger.kernel.org/msg27852.html // OS X only SetattrCrtime SetattrValid = 1 << 28 SetattrChgtime SetattrValid = 1 << 29 SetattrBkuptime SetattrValid = 1 << 30 SetattrFlags SetattrValid = 1 << 31 )
func (SetattrValid) Atime ¶
func (fl SetattrValid) Atime() bool
func (SetattrValid) AtimeNow ¶
func (fl SetattrValid) AtimeNow() bool
func (SetattrValid) Bkuptime ¶
func (fl SetattrValid) Bkuptime() bool
func (SetattrValid) Chgtime ¶
func (fl SetattrValid) Chgtime() bool
func (SetattrValid) Crtime ¶
func (fl SetattrValid) Crtime() bool
func (SetattrValid) Flags ¶
func (fl SetattrValid) Flags() bool
func (SetattrValid) Gid ¶
func (fl SetattrValid) Gid() bool
func (SetattrValid) Handle ¶
func (fl SetattrValid) Handle() bool
func (SetattrValid) LockOwner ¶
func (fl SetattrValid) LockOwner() bool
func (SetattrValid) Mode ¶
func (fl SetattrValid) Mode() bool
func (SetattrValid) Mtime ¶
func (fl SetattrValid) Mtime() bool
func (SetattrValid) MtimeNow ¶
func (fl SetattrValid) MtimeNow() bool
func (SetattrValid) Size ¶
func (fl SetattrValid) Size() bool
func (SetattrValid) String ¶
func (fl SetattrValid) String() string
func (SetattrValid) Uid ¶
func (fl SetattrValid) Uid() bool
type SetxattrRequest ¶
type SetxattrRequest struct { Header `json:"-"` // Flags can make the request fail if attribute does/not already // exist. Unfortunately, the constants are platform-specific and // not exposed by Go1.2. Look for XATTR_CREATE, XATTR_REPLACE. // // TODO improve this later // // TODO XATTR_CREATE and exist -> EEXIST // // TODO XATTR_REPLACE and not exist -> ENODATA Flags uint32 // Offset within extended attributes. // // Only valid for OS X, and then only with the resource fork // attribute. Position uint32 Name string Xattr []byte }
A SetxattrRequest asks to set an extended attribute associated with a file.
func (*SetxattrRequest) Respond ¶
func (r *SetxattrRequest) Respond()
Respond replies to the request, indicating that the extended attribute was set.
func (*SetxattrRequest) String ¶
func (r *SetxattrRequest) String() string
type StatfsRequest ¶
type StatfsRequest struct {
Header `json:"-"`
}
A StatfsRequest requests information about the mounted file system.
func (*StatfsRequest) Respond ¶
func (r *StatfsRequest) Respond(resp *StatfsResponse)
Respond replies to the request with the given response.
func (*StatfsRequest) String ¶
func (r *StatfsRequest) String() string
type StatfsResponse ¶
type StatfsResponse struct { Blocks uint64 // Total data blocks in file system. Bfree uint64 // Free blocks in file system. Bavail uint64 // Free blocks in file system if you're not root. Files uint64 // Total files in file system. Ffree uint64 // Free files in file system. Bsize uint32 // Block size Namelen uint32 // Maximum file name length? Frsize uint32 // Fragment size, smallest addressable data size in the file system. }
A StatfsResponse is the response to a StatfsRequest.
func (*StatfsResponse) String ¶
func (r *StatfsResponse) String() string
type SymlinkRequest ¶
A SymlinkRequest is a request to create a symlink making NewName point to Target.
func (*SymlinkRequest) Respond ¶
func (r *SymlinkRequest) Respond(resp *SymlinkResponse)
Respond replies to the request, indicating that the symlink was created.
func (*SymlinkRequest) String ¶
func (r *SymlinkRequest) String() string
type SymlinkResponse ¶
type SymlinkResponse struct {
LookupResponse
}
A SymlinkResponse is the response to a SymlinkRequest.
func (*SymlinkResponse) String ¶
func (r *SymlinkResponse) String() string
type WriteFlags ¶
type WriteFlags uint32
The WriteFlags are passed in WriteRequest.
const ( WriteCache WriteFlags = 1 << 0 // LockOwner field is valid. WriteLockOwner WriteFlags = 1 << 1 )
func (WriteFlags) String ¶
func (fl WriteFlags) String() string
type WriteRequest ¶
type WriteRequest struct { Header Handle HandleID Offset int64 Data []byte Flags WriteFlags LockOwner uint64 FileFlags OpenFlags }
A WriteRequest asks to write to an open file.
func (*WriteRequest) MarshalJSON ¶
func (r *WriteRequest) MarshalJSON() ([]byte, error)
func (*WriteRequest) Respond ¶
func (r *WriteRequest) Respond(resp *WriteResponse)
Respond replies to the request with the given response.
func (*WriteRequest) String ¶
func (r *WriteRequest) String() string
type WriteResponse ¶
type WriteResponse struct {
Size int
}
A WriteResponse replies to a write indicating how many bytes were written.
func (*WriteResponse) String ¶
func (r *WriteResponse) String() string
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
examples
|
|
clockfs
Clockfs implements a file system with the current time in a file.
|
Clockfs implements a file system with the current time in a file. |
hellofs
Hellofs implements a simple "hello world" file system.
|
Hellofs implements a simple "hello world" file system. |
bench
Package bench contains benchmarks.
|
Package bench contains benchmarks. |
fstestutil/spawntest
Package spawntest helps write tests that use subprocesses.
|
Package spawntest helps write tests that use subprocesses. |
fstestutil/spawntest/httpjson
Package httpjson helps transporting JSON over HTTP.
|
Package httpjson helps transporting JSON over HTTP. |
Package syscallx provides wrappers that make syscalls on various platforms more interoperable.
|
Package syscallx provides wrappers that make syscalls on various platforms more interoperable. |