diff --git a/filesystem.go b/filesystem.go index 2d18cfd..43173d6 100644 --- a/filesystem.go +++ b/filesystem.go @@ -240,7 +240,7 @@ func (fs *WsFs) Truncate(name string, offset uint64, context *fuse.Context) (cod r := Request{ Method: MethodChown, Path: name, - Offset: offset, + Offset: int64(offset), } resp, ok := fs.getResponse(&r) if !ok { @@ -275,7 +275,10 @@ func (fs *WsFs) Open(name string, flags uint32, context *fuse.Context) (file nod if !ok { return nil, fuse.ENOSYS } - return newWsFsFile(*resp.FileHandle, fs), resp.Code + if resp.Code != fuse.OK { + return nil, resp.Code + } + return newWsFsFile(resp.FileHandle, fs), resp.Code } func (fs *WsFs) Create(name string, flags uint32, mode uint32, context *fuse.Context) (file nodefs.File, code fuse.Status) { @@ -288,5 +291,8 @@ func (fs *WsFs) Create(name string, flags uint32, mode uint32, context *fuse.Con if !ok { return nil, fuse.ENOSYS } - return newWsFsFile(*resp.FileHandle, fs), resp.Code + if resp.Code != fuse.OK { + return nil, resp.Code + } + return newWsFsFile(resp.FileHandle, fs), resp.Code } diff --git a/fs_file.go b/fs_file.go index 14422f9..6c8f06f 100644 --- a/fs_file.go +++ b/fs_file.go @@ -1,6 +1,7 @@ package kubelwagen import ( + "fmt" "time" "github.com/hanwen/go-fuse/fuse" @@ -21,32 +22,87 @@ func newWsFsFile(handle int, fs *WsFs) *WsFsFile { } } func (f *WsFsFile) String() string { - return "WsFsFile" + return fmt.Sprintf("WsFsFile:%d", f.h) } func (f *WsFsFile) Read(buf []byte, off int64) (fuse.ReadResult, fuse.Status) { - return nil, fuse.ENOSYS + r := Request{ + Method: MethodFileRead, + FileHandle: f.h, + Offset: off, + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return nil, fuse.ENOSYS + } + return fuse.ReadResultData(resp.Data), resp.Code } func (f *WsFsFile) Write(data []byte, off int64) (uint32, fuse.Status) { - return 0, fuse.ENOSYS + r := Request{ + Method: MethodFileWrite, + FileHandle: f.h, + Offset: off, + Data: data, + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return 0, fuse.ENOSYS + } + return uint32(resp.WriteSize), resp.Code +} + +func (f *WsFsFile) Flock(flags int) fuse.Status { + r := Request{ + Method: MethodFileFlock, + FileHandle: f.h, + Flags: uint32(flags), + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return fuse.ENOSYS + } + return resp.Code } -func (f *WsFsFile) Flock(flags int) fuse.Status { return fuse.ENOSYS } func (f *WsFsFile) Flush() fuse.Status { - return fuse.OK + return f.Fsync(0) } func (f *WsFsFile) Release() { - + r := Request{ + Method: MethodFileRelease, + FileHandle: f.h, + } + f.fs.getResponse(&r) } -func (f *WsFsFile) GetAttr(*fuse.Attr) fuse.Status { - return fuse.ENOSYS +func (f *WsFsFile) GetAttr(attr *fuse.Attr) fuse.Status { + r := Request{ + Method: MethodFileGetAttr, + FileHandle: f.h, + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return fuse.ENOSYS + } + if resp.Stat != nil { + *attr = *resp.Stat + } + return resp.Code } func (f *WsFsFile) Fsync(flags int) (code fuse.Status) { - return fuse.ENOSYS + r := Request{ + Method: MethodFileFsync, + FileHandle: f.h, + Flags: uint32(flags), + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return fuse.ENOSYS + } + return resp.Code } func (f *WsFsFile) Utimens(atime *time.Time, mtime *time.Time) fuse.Status { @@ -54,17 +110,55 @@ func (f *WsFsFile) Utimens(atime *time.Time, mtime *time.Time) fuse.Status { } func (f *WsFsFile) Truncate(size uint64) fuse.Status { - return fuse.ENOSYS + r := Request{ + Method: MethodFileTruncate, + FileHandle: f.h, + Size: uint32(size), + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return fuse.ENOSYS + } + return resp.Code } func (f *WsFsFile) Chown(uid uint32, gid uint32) fuse.Status { - return fuse.ENOSYS + r := Request{ + Method: MethodFileChown, + FileHandle: f.h, + UID: uid, + GID: gid, + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return fuse.ENOSYS + } + return resp.Code } func (f *WsFsFile) Chmod(perms uint32) fuse.Status { - return fuse.ENOSYS + r := Request{ + Method: MethodFileChmod, + FileHandle: f.h, + Flags: perms, + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return fuse.ENOSYS + } + return resp.Code } func (f *WsFsFile) Allocate(off uint64, size uint64, mode uint32) (code fuse.Status) { - return fuse.ENOSYS + r := Request{ + Method: MethodFileAllocate, + FileHandle: f.h, + Mode: mode, + Size: uint32(size), + } + resp, ok := f.fs.getResponse(&r) + if !ok { + return fuse.ENOSYS + } + return resp.Code } diff --git a/request.go b/request.go index 5596017..2c70315 100644 --- a/request.go +++ b/request.go @@ -23,22 +23,34 @@ const ( MethodAccess MethodOpen MethodCreate + + MethodFileRead + MethodFileWrite + MethodFileFlock + MethodFileRelease + MethodFileGetAttr + MethodFileFsync + MethodFileTruncate + MethodFileChown + MethodFileChmod + MethodFileAllocate ) type Request struct { - ID int `json:"id"` - Method Method `json:"method"` - Path string `json:"path"` - Mode uint32 - UID uint32 - GID uint32 - Size uint32 - Dev int32 - Flags uint32 - Offset uint64 - NewPath string `json:"newpath,omitempty"` - Attr string `json:"attr,omitempty"` - Data []byte `json:"data,omitempty"` + ID int `json:"id"` + Method Method `json:"method"` + Path string `json:"path"` + Mode uint32 + UID uint32 + GID uint32 + Size uint32 + Dev int32 + Flags uint32 + Offset int64 + NewPath string `json:"newpath,omitempty"` + Attr string `json:"attr,omitempty"` + Data []byte `json:"data,omitempty"` + FileHandle int `json:"handle,omitempty"` } type RequestCallback struct { @@ -55,5 +67,6 @@ type Response struct { Dirents []fuse.DirEntry `json:"dirents,omitempty"` LinkStr string `json:"linkstr,omitempty"` Statfs *fuse.StatfsOut `json:"statfs,omitempty"` - FileHandle *int `json:"filehandle,omitempty"` + FileHandle int `json:"filehandle,omitempty"` + WriteSize int `json:"wsize,omitempty"` }