Implemented memFS.ReadFile.
parent
d307babe25
commit
96c65235b8
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue