Added an RmDir method.
parent
9f984e1aa6
commit
63408f6a0d
|
@ -62,6 +62,24 @@ type FileSystem interface {
|
|||
ctx context.Context,
|
||||
req *MkDirRequest) (*MkDirResponse, error)
|
||||
|
||||
///////////////////////////////////
|
||||
// Inode destruction
|
||||
///////////////////////////////////
|
||||
|
||||
// Unlink a directory from its parent. Because directories cannot have a link
|
||||
// count above one, this means the directory inode should be deleted as well
|
||||
// once the kernel calls ForgetInode.
|
||||
//
|
||||
// The file system is responsible for checking that the directory is empty.
|
||||
//
|
||||
// Sample implementation in ext2: ext2_rmdir (http://goo.gl/B9QmFf)
|
||||
//
|
||||
// TODO(jacobsa): Add tests for the assertion about directory link counts
|
||||
// above (on a real file system and on memfs).
|
||||
RmDir(
|
||||
ctx context.Context,
|
||||
req *RmDirRequest) (*RmDirResponse, error)
|
||||
|
||||
///////////////////////////////////
|
||||
// Directory handles
|
||||
///////////////////////////////////
|
||||
|
@ -360,6 +378,18 @@ type MkDirResponse struct {
|
|||
Entry ChildInodeEntry
|
||||
}
|
||||
|
||||
type RmDirRequest struct {
|
||||
Header RequestHeader
|
||||
|
||||
// The ID of parent directory inode, and the name of the directory being
|
||||
// removed within it.
|
||||
Parent InodeID
|
||||
Name string
|
||||
}
|
||||
|
||||
type RmDirResponse struct {
|
||||
}
|
||||
|
||||
type OpenDirRequest struct {
|
||||
Header RequestHeader
|
||||
|
||||
|
|
|
@ -46,6 +46,12 @@ func (fs *NotImplementedFileSystem) MkDir(
|
|||
return nil, fuse.ENOSYS
|
||||
}
|
||||
|
||||
func (fs *NotImplementedFileSystem) RmDir(
|
||||
ctx context.Context,
|
||||
req *fuse.RmDirRequest) (*fuse.RmDirResponse, error) {
|
||||
return nil, fuse.ENOSYS
|
||||
}
|
||||
|
||||
func (fs *NotImplementedFileSystem) OpenDir(
|
||||
ctx context.Context,
|
||||
req *fuse.OpenDirRequest) (*fuse.OpenDirResponse, error) {
|
||||
|
|
27
server.go
27
server.go
|
@ -184,6 +184,33 @@ func (s *server) handleFuseRequest(fuseReq bazilfuse.Request) {
|
|||
s.logger.Println("Responding:", fuseResp)
|
||||
typed.Respond(fuseResp)
|
||||
|
||||
case *bazilfuse.RemoveRequest:
|
||||
// We don't yet support files.
|
||||
if !typed.Dir {
|
||||
s.logger.Println("Not supported for files. Returning ENOSYS.")
|
||||
typed.RespondError(ENOSYS)
|
||||
return
|
||||
}
|
||||
|
||||
// Convert the request.
|
||||
req := &RmDirRequest{
|
||||
Header: convertHeader(typed.Header),
|
||||
Parent: InodeID(typed.Header.Node),
|
||||
Name: typed.Name,
|
||||
}
|
||||
|
||||
// Call the file system.
|
||||
_, err := s.fs.RmDir(ctx, req)
|
||||
if err != nil {
|
||||
s.logger.Println("Responding:", err)
|
||||
typed.RespondError(err)
|
||||
return
|
||||
}
|
||||
|
||||
// Respond successfully.
|
||||
s.logger.Println("Responding OK.")
|
||||
typed.Respond()
|
||||
|
||||
case *bazilfuse.OpenRequest:
|
||||
// Directory or file?
|
||||
if typed.Dir {
|
||||
|
|
Loading…
Reference in New Issue