Implemented memFS.WriteFile.
parent
fcf3be2896
commit
163b303731
|
@ -437,3 +437,21 @@ func (fs *memFS) ReadDir(
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fs *memFS) WriteFile(
|
||||||
|
ctx context.Context,
|
||||||
|
req *fuse.WriteFileRequest) (resp *fuse.WriteFileResponse, err error) {
|
||||||
|
resp = &fuse.WriteFileResponse{}
|
||||||
|
|
||||||
|
fs.mu.RLock()
|
||||||
|
defer fs.mu.RUnlock()
|
||||||
|
|
||||||
|
// Find the inode in question.
|
||||||
|
inode := fs.getInodeForModifyingOrDie(req.Inode)
|
||||||
|
defer inode.mu.Unlock()
|
||||||
|
|
||||||
|
// Serve the request.
|
||||||
|
_, err = inode.WriteAt(req.Data, req.Offset)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
@ -279,3 +279,30 @@ func (inode *inode) ReadDir(offset int, size int) (data []byte, err error) {
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Write to the file's contents. See documentation for ioutil.WriterAt.
|
||||||
|
//
|
||||||
|
// REQUIRES: !inode.dir
|
||||||
|
// EXCLUSIVE_LOCKS_REQUIRED(inode.mu)
|
||||||
|
func (inode *inode) WriteAt(p []byte, off int64) (n int, err error) {
|
||||||
|
if inode.dir {
|
||||||
|
panic("WriteAt called on directory.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that the contents slice is long enough.
|
||||||
|
newLen := int(off) + len(p)
|
||||||
|
if len(inode.contents) < newLen {
|
||||||
|
padding := make([]byte, newLen-len(inode.contents))
|
||||||
|
inode.contents = append(inode.contents, padding...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy in the data.
|
||||||
|
n = copy(inode.contents[off:], p)
|
||||||
|
|
||||||
|
// Sanity check.
|
||||||
|
if n != len(p) {
|
||||||
|
panic(fmt.Sprintf("Unexpected short copy: %v", n))
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue