Implemented memFS.ReadFile.

geesefs-0-30-9
Aaron Jacobs 2015-03-06 04:56:56 +11:00
parent d307babe25
commit 96c65235b8
2 changed files with 49 additions and 0 deletions

View File

@ -459,6 +459,28 @@ func (fs *memFS) OpenFile(
return return
} }
func (fs *memFS) ReadFile(
ctx context.Context,
req *fuse.ReadFileRequest) (resp *fuse.ReadFileResponse, err error) {
resp = &fuse.ReadFileResponse{}
fs.mu.RLock()
defer fs.mu.RUnlock()
// Find the inode in question.
inode := fs.getInodeForReadingOrDie(req.Inode)
defer inode.mu.RUnlock()
// Serve the request.
//
// TODO(jacobsa): Add tests involving EOF matching posix_test.go.
resp.Data = make([]byte, req.Size)
n, err := inode.ReadAt(resp.Data, req.Offset)
resp.Data = resp.Data[:n]
return
}
func (fs *memFS) WriteFile( func (fs *memFS) WriteFile(
ctx context.Context, ctx context.Context,
req *fuse.WriteFileRequest) (resp *fuse.WriteFileResponse, err error) { req *fuse.WriteFileRequest) (resp *fuse.WriteFileResponse, err error) {
@ -472,6 +494,8 @@ func (fs *memFS) WriteFile(
defer inode.mu.Unlock() defer inode.mu.Unlock()
// Serve the request. // Serve the request.
//
// TODO(jacobsa): Add tests involving EOF matching posix_test.go.
_, err = inode.WriteAt(req.Data, req.Offset) _, err = inode.WriteAt(req.Data, req.Offset)
return return

View File

@ -16,6 +16,7 @@ package memfs
import ( import (
"fmt" "fmt"
"io"
"os" "os"
"github.com/jacobsa/fuse" "github.com/jacobsa/fuse"
@ -290,6 +291,30 @@ func (inode *inode) ReadDir(offset int, size int) (data []byte, err error) {
return return
} }
// Read from the file's contents. See documentation for ioutil.ReaderAt.
//
// REQUIRES: !inode.dir
// SHARED_LOCKS_REQUIRED(inode.mu)
func (inode *inode) ReadAt(p []byte, off int64) (n int, err error) {
if inode.dir {
panic("ReadAt called on directory.")
}
// Ensure the offset is in range.
if off > int64(len(inode.contents)) {
err = io.EOF
return
}
// Read what we can.
n = copy(p, inode.contents[off:])
if n < len(p) {
err = io.EOF
}
return
}
// Write to the file's contents. See documentation for ioutil.WriterAt. // Write to the file's contents. See documentation for ioutil.WriterAt.
// //
// REQUIRES: !inode.dir // REQUIRES: !inode.dir