SetXattr support
parent
d20c4665c1
commit
cbeaa55087
|
@ -487,6 +487,35 @@ func convertInMessage(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case fusekernel.OpSetxattr:
|
||||||
|
type input fusekernel.SetxattrIn
|
||||||
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{})))
|
||||||
|
if in == nil {
|
||||||
|
err = errors.New("Corrupt OpSetxattr")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
payload := inMsg.ConsumeBytes(inMsg.Len())
|
||||||
|
// payload should be "name\x00value"
|
||||||
|
if len(payload) < 3 {
|
||||||
|
err = errors.New("Corrupt OpSetxattr")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i := bytes.IndexByte(payload, '\x00')
|
||||||
|
if i < 0 {
|
||||||
|
err = errors.New("Corrupt OpSetxattr")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
name, value := payload[:i], payload[i+1:len(payload)]
|
||||||
|
fmt.Printf("Setting %v to %v\n", name, value)
|
||||||
|
|
||||||
|
o = &fuseops.SetXattrOp{
|
||||||
|
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||||
|
Name: string(name),
|
||||||
|
Data: value,
|
||||||
|
Flags: in.Flags,
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
o = &unknownOp{
|
o = &unknownOp{
|
||||||
|
@ -726,6 +755,9 @@ func (c *Connection) kernelResponseForOp(
|
||||||
m.ShrinkTo(buffer.OutMessageHeaderSize + o.BytesRead)
|
m.ShrinkTo(buffer.OutMessageHeaderSize + o.BytesRead)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case *fuseops.SetXattrOp:
|
||||||
|
// Empty response
|
||||||
|
|
||||||
case *initOp:
|
case *initOp:
|
||||||
out := (*fusekernel.InitOut)(m.Grow(int(unsafe.Sizeof(fusekernel.InitOut{}))))
|
out := (*fusekernel.InitOut)(m.Grow(int(unsafe.Sizeof(fusekernel.InitOut{}))))
|
||||||
|
|
||||||
|
|
3
debug.go
3
debug.go
|
@ -95,6 +95,9 @@ func describeRequest(op interface{}) (s string) {
|
||||||
|
|
||||||
case *fuseops.GetXattrOp:
|
case *fuseops.GetXattrOp:
|
||||||
addComponent("name %s", typed.Name)
|
addComponent("name %s", typed.Name)
|
||||||
|
|
||||||
|
case *fuseops.SetXattrOp:
|
||||||
|
addComponent("name %s", typed.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use just the name if there is no extra info.
|
// Use just the name if there is no extra info.
|
||||||
|
|
|
@ -815,3 +815,18 @@ type ListXattrOp struct {
|
||||||
// big enough
|
// big enough
|
||||||
BytesRead int
|
BytesRead int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SetXattrOp struct {
|
||||||
|
// The inode that we are changing
|
||||||
|
Inode InodeID
|
||||||
|
|
||||||
|
// The name of the extended attribute
|
||||||
|
Name string
|
||||||
|
|
||||||
|
// The data to for the extened attribute.
|
||||||
|
Data []byte
|
||||||
|
|
||||||
|
// If Flags is 0x1, and the attribute exists already, EEXIST should be returned.
|
||||||
|
// If Flags is 0x2, and the attribute does not exist, ENOATTR should be returned.
|
||||||
|
Flags uint32
|
||||||
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ type FileSystem interface {
|
||||||
RemoveXattr(context.Context, *fuseops.RemoveXattrOp) error
|
RemoveXattr(context.Context, *fuseops.RemoveXattrOp) error
|
||||||
GetXattr(context.Context, *fuseops.GetXattrOp) error
|
GetXattr(context.Context, *fuseops.GetXattrOp) error
|
||||||
ListXattr(context.Context, *fuseops.ListXattrOp) error
|
ListXattr(context.Context, *fuseops.ListXattrOp) error
|
||||||
|
SetXattr(context.Context, *fuseops.SetXattrOp) error
|
||||||
|
|
||||||
// Regard all inodes (including the root inode) as having their lookup counts
|
// Regard all inodes (including the root inode) as having their lookup counts
|
||||||
// decremented to zero, and clean up any resources associated with the file
|
// decremented to zero, and clean up any resources associated with the file
|
||||||
|
@ -198,6 +199,9 @@ func (s *fileSystemServer) handleOp(
|
||||||
|
|
||||||
case *fuseops.ListXattrOp:
|
case *fuseops.ListXattrOp:
|
||||||
err = s.fs.ListXattr(ctx, typed)
|
err = s.fs.ListXattr(ctx, typed)
|
||||||
|
|
||||||
|
case *fuseops.SetXattrOp:
|
||||||
|
err = s.fs.SetXattr(ctx, typed)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Reply(ctx, err)
|
c.Reply(ctx, err)
|
||||||
|
|
|
@ -204,5 +204,12 @@ func (fs *NotImplementedFileSystem) ListXattr(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fs *NotImplementedFileSystem) SetXattr(
|
||||||
|
ctx context.Context,
|
||||||
|
op *fuseops.SetXattrOp) (err error) {
|
||||||
|
err = fuse.ENOSYS
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (fs *NotImplementedFileSystem) Destroy() {
|
func (fs *NotImplementedFileSystem) Destroy() {
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue