|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- //go:build linux || (darwin && amd64)
-
- package fuse
-
- import (
- "context"
- "io"
- "syscall"
-
- fusefs "github.com/hanwen/go-fuse/v2/fs"
- "github.com/hanwen/go-fuse/v2/fuse"
- )
-
- // 作为本模块的FileHandle与fusefs.FileHandle的桥梁,用于实现fusefs.FileHandle接口
- type fileHandle struct {
- hd FileHandle
- }
-
- func newFileHandle(hd FileHandle) *fileHandle {
- return &fileHandle{
- hd: hd,
- }
- }
-
- // Read data from a file. The data should be returned as
- // ReadResult, which may be constructed from the incoming
- // `dest` buffer.
- func (f *fileHandle) Read(ctx context.Context, dest []byte, off int64) (res fuse.ReadResult, errno syscall.Errno) {
- var n int
- var err error
- n, err = f.hd.ReadAt(dest, off)
- if err == io.EOF {
- err = nil
- }
- return fuse.ReadResultData(dest[:n]), translateError(err)
- }
-
- var _ fusefs.FileReader = (*fileHandle)(nil)
-
- // Write the data into the file handle at given offset. After
- // returning, the data will be reused and may not referenced.
- func (f *fileHandle) Write(ctx context.Context, data []byte, off int64) (written uint32, errno syscall.Errno) {
- var n int
- var err error
- n, err = f.hd.WriteAt(data, off)
- return uint32(n), translateError(err)
- }
-
- var _ fusefs.FileWriter = (*fileHandle)(nil)
-
- // Flush is called for the close(2) call on a file descriptor. In case
- // of a descriptor that was duplicated using dup(2), it may be called
- // more than once for the same fileHandle.
- func (f *fileHandle) Flush(ctx context.Context) syscall.Errno {
- return translateError(f.hd.Close())
- }
-
- var _ fusefs.FileFlusher = (*fileHandle)(nil)
-
- // Release is called to before a fileHandle is forgotten. The
- // kernel ignores the return value of this method,
- // so any cleanup that requires specific synchronization or
- // could fail with I/O errors should happen in Flush instead.
- func (f *fileHandle) Release(ctx context.Context) syscall.Errno {
- return translateError(f.hd.Release())
- }
-
- var _ fusefs.FileReleaser = (*fileHandle)(nil)
-
- // Fsync is a signal to ensure writes to the Inode are flushed
- // to stable storage.
- func (f *fileHandle) Fsync(ctx context.Context, flags uint32) (errno syscall.Errno) {
- return translateError(f.hd.Sync())
- }
-
- var _ fusefs.FileFsyncer = (*fileHandle)(nil)
|