Added an Init method.
parent
99dca8b42c
commit
63b70540e3
|
@ -21,6 +21,12 @@ import (
|
||||||
//
|
//
|
||||||
// Must be safe for concurrent access via all methods.
|
// Must be safe for concurrent access via all methods.
|
||||||
type FileSystem interface {
|
type FileSystem interface {
|
||||||
|
// This method is called once when mounting the file system. It must succeed
|
||||||
|
// in order for the mount to succeed.
|
||||||
|
Init(
|
||||||
|
ctx context.Context,
|
||||||
|
req *InitRequest) (*InitResponse, error)
|
||||||
|
|
||||||
// Look up a child by name within a parent directory. The kernel calls this
|
// Look up a child by name within a parent directory. The kernel calls this
|
||||||
// when resolving user paths to dentry structs, which are then cached.
|
// when resolving user paths to dentry structs, which are then cached.
|
||||||
LookUpInode(
|
LookUpInode(
|
||||||
|
@ -129,6 +135,15 @@ type DirOffset uint64
|
||||||
// Requests and responses
|
// Requests and responses
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
type InitRequest struct {
|
||||||
|
// User and group IDs for the process that is mounting the file system.
|
||||||
|
Uid uint32
|
||||||
|
Gid uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type InitResponse struct {
|
||||||
|
}
|
||||||
|
|
||||||
type LookUpInodeRequest struct {
|
type LookUpInodeRequest struct {
|
||||||
// The ID of the directory inode to which the child belongs.
|
// The ID of the directory inode to which the child belongs.
|
||||||
Parent InodeID
|
Parent InodeID
|
||||||
|
|
|
@ -15,6 +15,12 @@ type NotImplementedFileSystem struct {
|
||||||
|
|
||||||
var _ fuse.FileSystem = &NotImplementedFileSystem{}
|
var _ fuse.FileSystem = &NotImplementedFileSystem{}
|
||||||
|
|
||||||
|
func (fs *NotImplementedFileSystem) Init(
|
||||||
|
ctx context.Context,
|
||||||
|
req *fuse.InitRequest) (*fuse.InitResponse, error) {
|
||||||
|
return nil, fuse.ENOSYS
|
||||||
|
}
|
||||||
|
|
||||||
func (fs *NotImplementedFileSystem) LookUpInode(
|
func (fs *NotImplementedFileSystem) LookUpInode(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *fuse.LookUpInodeRequest) (*fuse.LookUpInodeResponse, error) {
|
req *fuse.LookUpInodeRequest) (*fuse.LookUpInodeResponse, error) {
|
||||||
|
|
|
@ -50,7 +50,7 @@ var gInodeInfo = map[fuse.InodeID]inodeInfo{
|
||||||
attributes: fuse.InodeAttributes{
|
attributes: fuse.InodeAttributes{
|
||||||
// TODO(jacobsa): Why do we get premission denied errors when this is
|
// TODO(jacobsa): Why do we get premission denied errors when this is
|
||||||
// 0500?
|
// 0500?
|
||||||
Mode: 0555 | os.ModeDir,
|
Mode: 0500 | os.ModeDir,
|
||||||
},
|
},
|
||||||
dir: true,
|
dir: true,
|
||||||
children: []fuseutil.Dirent{
|
children: []fuseutil.Dirent{
|
||||||
|
|
20
server.go
20
server.go
|
@ -71,11 +71,23 @@ func (s *server) handleFuseRequest(fuseReq bazilfuse.Request) {
|
||||||
// Attempt to handle it.
|
// Attempt to handle it.
|
||||||
switch typed := fuseReq.(type) {
|
switch typed := fuseReq.(type) {
|
||||||
case *bazilfuse.InitRequest:
|
case *bazilfuse.InitRequest:
|
||||||
// Responding to this is required to make mounting work, at least on OS X.
|
// Convert the request.
|
||||||
// We don't currently expose the capability for the file system to
|
req := &InitRequest{
|
||||||
// intercept this.
|
Uid: typed.Header.Uid,
|
||||||
|
Gid: typed.Header.Gid,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the file system.
|
||||||
|
_, err := s.fs.Init(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
s.logger.Print("Responding:", err)
|
||||||
|
typed.RespondError(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the response.
|
||||||
fuseResp := &bazilfuse.InitResponse{}
|
fuseResp := &bazilfuse.InitResponse{}
|
||||||
s.logger.Println("Responding:", fuseResp)
|
s.logger.Print("Responding:", fuseResp)
|
||||||
typed.Respond(fuseResp)
|
typed.Respond(fuseResp)
|
||||||
|
|
||||||
case *bazilfuse.StatfsRequest:
|
case *bazilfuse.StatfsRequest:
|
||||||
|
|
Loading…
Reference in New Issue