Added an RmDir method.
parent
9f984e1aa6
commit
63408f6a0d
|
@ -62,6 +62,24 @@ type FileSystem interface {
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *MkDirRequest) (*MkDirResponse, error)
|
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
|
// Directory handles
|
||||||
///////////////////////////////////
|
///////////////////////////////////
|
||||||
|
@ -360,6 +378,18 @@ type MkDirResponse struct {
|
||||||
Entry ChildInodeEntry
|
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 {
|
type OpenDirRequest struct {
|
||||||
Header RequestHeader
|
Header RequestHeader
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,12 @@ func (fs *NotImplementedFileSystem) MkDir(
|
||||||
return nil, fuse.ENOSYS
|
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(
|
func (fs *NotImplementedFileSystem) OpenDir(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *fuse.OpenDirRequest) (*fuse.OpenDirResponse, error) {
|
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)
|
s.logger.Println("Responding:", fuseResp)
|
||||||
typed.Respond(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:
|
case *bazilfuse.OpenRequest:
|
||||||
// Directory or file?
|
// Directory or file?
|
||||||
if typed.Dir {
|
if typed.Dir {
|
||||||
|
|
Loading…
Reference in New Issue