|
|
|
@ -46,8 +46,7 @@ func convertInMessage( |
|
|
|
|
buf := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
n := len(buf) |
|
|
|
|
if n == 0 || buf[n-1] != '\x00' { |
|
|
|
|
err = errors.New("Corrupt OpLookup") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpLookup") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.LookUpInodeOp{ |
|
|
|
@ -64,8 +63,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.SetattrIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpSetattr") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpSetattr") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
to := &fuseops.SetInodeAttributesOp{ |
|
|
|
@ -102,8 +100,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.ForgetIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpForget") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpForget") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.ForgetInodeOp{ |
|
|
|
@ -114,15 +111,13 @@ func convertInMessage( |
|
|
|
|
case fusekernel.OpMkdir: |
|
|
|
|
in := (*fusekernel.MkdirIn)(inMsg.Consume(fusekernel.MkdirInSize(protocol))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpMkdir") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpMkdir") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
name := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
i := bytes.IndexByte(name, '\x00') |
|
|
|
|
if i < 0 { |
|
|
|
|
err = errors.New("Corrupt OpMkdir") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpMkdir") |
|
|
|
|
} |
|
|
|
|
name = name[:i] |
|
|
|
|
|
|
|
|
@ -142,15 +137,13 @@ func convertInMessage( |
|
|
|
|
case fusekernel.OpMknod: |
|
|
|
|
in := (*fusekernel.MknodIn)(inMsg.Consume(fusekernel.MknodInSize(protocol))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpMknod") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpMknod") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
name := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
i := bytes.IndexByte(name, '\x00') |
|
|
|
|
if i < 0 { |
|
|
|
|
err = errors.New("Corrupt OpMknod") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpMknod") |
|
|
|
|
} |
|
|
|
|
name = name[:i] |
|
|
|
|
|
|
|
|
@ -163,15 +156,13 @@ func convertInMessage( |
|
|
|
|
case fusekernel.OpCreate: |
|
|
|
|
in := (*fusekernel.CreateIn)(inMsg.Consume(fusekernel.CreateInSize(protocol))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpCreate") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpCreate") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
name := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
i := bytes.IndexByte(name, '\x00') |
|
|
|
|
if i < 0 { |
|
|
|
|
err = errors.New("Corrupt OpCreate") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpCreate") |
|
|
|
|
} |
|
|
|
|
name = name[:i] |
|
|
|
|
|
|
|
|
@ -185,13 +176,11 @@ func convertInMessage( |
|
|
|
|
// The message is "newName\0target\0".
|
|
|
|
|
names := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
if len(names) == 0 || names[len(names)-1] != 0 { |
|
|
|
|
err = errors.New("Corrupt OpSymlink") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpSymlink") |
|
|
|
|
} |
|
|
|
|
i := bytes.IndexByte(names, '\x00') |
|
|
|
|
if i < 0 { |
|
|
|
|
err = errors.New("Corrupt OpSymlink") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpSymlink") |
|
|
|
|
} |
|
|
|
|
newName, target := names[0:i], names[i+1:len(names)-1] |
|
|
|
|
|
|
|
|
@ -205,24 +194,20 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.RenameIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpRename") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpRename") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
names := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
// names should be "old\x00new\x00"
|
|
|
|
|
if len(names) < 4 { |
|
|
|
|
err = errors.New("Corrupt OpRename") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpRename") |
|
|
|
|
} |
|
|
|
|
if names[len(names)-1] != '\x00' { |
|
|
|
|
err = errors.New("Corrupt OpRename") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpRename") |
|
|
|
|
} |
|
|
|
|
i := bytes.IndexByte(names, '\x00') |
|
|
|
|
if i < 0 { |
|
|
|
|
err = errors.New("Corrupt OpRename") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpRename") |
|
|
|
|
} |
|
|
|
|
oldName, newName := names[:i], names[i+1:len(names)-1] |
|
|
|
|
|
|
|
|
@ -237,8 +222,7 @@ func convertInMessage( |
|
|
|
|
buf := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
n := len(buf) |
|
|
|
|
if n == 0 || buf[n-1] != '\x00' { |
|
|
|
|
err = errors.New("Corrupt OpUnlink") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpUnlink") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.UnlinkOp{ |
|
|
|
@ -250,8 +234,7 @@ func convertInMessage( |
|
|
|
|
buf := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
n := len(buf) |
|
|
|
|
if n == 0 || buf[n-1] != '\x00' { |
|
|
|
|
err = errors.New("Corrupt OpRmdir") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpRmdir") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.RmDirOp{ |
|
|
|
@ -272,8 +255,7 @@ func convertInMessage( |
|
|
|
|
case fusekernel.OpRead: |
|
|
|
|
in := (*fusekernel.ReadIn)(inMsg.Consume(fusekernel.ReadInSize(protocol))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpRead") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpRead") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
to := &fuseops.ReadFileOp{ |
|
|
|
@ -286,8 +268,7 @@ func convertInMessage( |
|
|
|
|
readSize := int(in.Size) |
|
|
|
|
p := outMsg.GrowNoZero(readSize) |
|
|
|
|
if p == nil { |
|
|
|
|
err = fmt.Errorf("Can't grow for %d-byte read", readSize) |
|
|
|
|
return |
|
|
|
|
return nil, fmt.Errorf("Can't grow for %d-byte read", readSize) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sh := (*reflect.SliceHeader)(unsafe.Pointer(&to.Dst)) |
|
|
|
@ -298,8 +279,7 @@ func convertInMessage( |
|
|
|
|
case fusekernel.OpReaddir: |
|
|
|
|
in := (*fusekernel.ReadIn)(inMsg.Consume(fusekernel.ReadInSize(protocol))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpReaddir") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpReaddir") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
to := &fuseops.ReadDirOp{ |
|
|
|
@ -312,8 +292,7 @@ func convertInMessage( |
|
|
|
|
readSize := int(in.Size) |
|
|
|
|
p := outMsg.GrowNoZero(readSize) |
|
|
|
|
if p == nil { |
|
|
|
|
err = fmt.Errorf("Can't grow for %d-byte read", readSize) |
|
|
|
|
return |
|
|
|
|
return nil, fmt.Errorf("Can't grow for %d-byte read", readSize) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sh := (*reflect.SliceHeader)(unsafe.Pointer(&to.Dst)) |
|
|
|
@ -325,8 +304,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.ReleaseIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpRelease") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpRelease") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.ReleaseFileHandleOp{ |
|
|
|
@ -337,8 +315,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.ReleaseIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpReleasedir") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpReleasedir") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.ReleaseDirHandleOp{ |
|
|
|
@ -348,14 +325,12 @@ func convertInMessage( |
|
|
|
|
case fusekernel.OpWrite: |
|
|
|
|
in := (*fusekernel.WriteIn)(inMsg.Consume(fusekernel.WriteInSize(protocol))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpWrite") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpWrite") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
buf := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
if len(buf) < int(in.Size) { |
|
|
|
|
err = errors.New("Corrupt OpWrite") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpWrite") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.WriteFileOp{ |
|
|
|
@ -369,8 +344,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.FsyncIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpFsync") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpFsync") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.SyncFileOp{ |
|
|
|
@ -382,8 +356,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.FlushIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpFlush") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpFlush") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.FlushFileOp{ |
|
|
|
@ -403,8 +376,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.InterruptIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpInterrupt") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpInterrupt") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &interruptOp{ |
|
|
|
@ -415,8 +387,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.InitIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpInit") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpInit") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &initOp{ |
|
|
|
@ -429,20 +400,17 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.LinkIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpLink") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpLink") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
name := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
i := bytes.IndexByte(name, '\x00') |
|
|
|
|
if i < 0 { |
|
|
|
|
err = errors.New("Corrupt OpLink") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpLink") |
|
|
|
|
} |
|
|
|
|
name = name[:i] |
|
|
|
|
if len(name) == 0 { |
|
|
|
|
err = errors.New("Corrupt OpLink (Name not read)") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpLink (Name not read)") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.CreateLinkOp{ |
|
|
|
@ -455,8 +423,7 @@ func convertInMessage( |
|
|
|
|
buf := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
n := len(buf) |
|
|
|
|
if n == 0 || buf[n-1] != '\x00' { |
|
|
|
|
err = errors.New("Corrupt OpRemovexattr") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpRemovexattr") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.RemoveXattrOp{ |
|
|
|
@ -468,15 +435,13 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.GetxattrIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpGetxattr") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpGetxattr") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
name := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
i := bytes.IndexByte(name, '\x00') |
|
|
|
|
if i < 0 { |
|
|
|
|
err = errors.New("Corrupt OpGetxattr") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpGetxattr") |
|
|
|
|
} |
|
|
|
|
name = name[:i] |
|
|
|
|
|
|
|
|
@ -489,8 +454,7 @@ func convertInMessage( |
|
|
|
|
readSize := int(in.Size) |
|
|
|
|
p := outMsg.GrowNoZero(readSize) |
|
|
|
|
if p == nil { |
|
|
|
|
err = fmt.Errorf("Can't grow for %d-byte read", readSize) |
|
|
|
|
return |
|
|
|
|
return nil, fmt.Errorf("Can't grow for %d-byte read", readSize) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sh := (*reflect.SliceHeader)(unsafe.Pointer(&to.Dst)) |
|
|
|
@ -502,8 +466,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.ListxattrIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpListxattr") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpListxattr") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
to := &fuseops.ListXattrOp{ |
|
|
|
@ -515,8 +478,7 @@ func convertInMessage( |
|
|
|
|
if readSize != 0 { |
|
|
|
|
p := outMsg.GrowNoZero(readSize) |
|
|
|
|
if p == nil { |
|
|
|
|
err = fmt.Errorf("Can't grow for %d-byte read", readSize) |
|
|
|
|
return |
|
|
|
|
return nil, fmt.Errorf("Can't grow for %d-byte read", readSize) |
|
|
|
|
} |
|
|
|
|
sh := (*reflect.SliceHeader)(unsafe.Pointer(&to.Dst)) |
|
|
|
|
sh.Data = uintptr(p) |
|
|
|
@ -527,20 +489,17 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.SetxattrIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpSetxattr") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpSetxattr") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
payload := inMsg.ConsumeBytes(inMsg.Len()) |
|
|
|
|
// payload should be "name\x00value"
|
|
|
|
|
if len(payload) < 3 { |
|
|
|
|
err = errors.New("Corrupt OpSetxattr") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpSetxattr") |
|
|
|
|
} |
|
|
|
|
i := bytes.IndexByte(payload, '\x00') |
|
|
|
|
if i < 0 { |
|
|
|
|
err = errors.New("Corrupt OpSetxattr") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpSetxattr") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
name, value := payload[:i], payload[i+1:len(payload)] |
|
|
|
@ -555,8 +514,7 @@ func convertInMessage( |
|
|
|
|
type input fusekernel.FallocateIn |
|
|
|
|
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) |
|
|
|
|
if in == nil { |
|
|
|
|
err = errors.New("Corrupt OpFallocate") |
|
|
|
|
return |
|
|
|
|
return nil, errors.New("Corrupt OpFallocate") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o = &fuseops.FallocateOp{ |
|
|
|
@ -574,7 +532,7 @@ func convertInMessage( |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
return o, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
@ -595,12 +553,10 @@ func (c *Connection) kernelResponse( |
|
|
|
|
// interruptOp .
|
|
|
|
|
switch op.(type) { |
|
|
|
|
case *fuseops.ForgetInodeOp: |
|
|
|
|
noResponse = true |
|
|
|
|
return |
|
|
|
|
return true |
|
|
|
|
|
|
|
|
|
case *interruptOp: |
|
|
|
|
noResponse = true |
|
|
|
|
return |
|
|
|
|
return true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If the user returned the error, fill in the error field of the outgoing
|
|
|
|
@ -629,7 +585,7 @@ func (c *Connection) kernelResponse( |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
h.Len = uint32(m.Len()) |
|
|
|
|
return |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Like kernelResponse, but assumes the user replied with a nil error to the
|
|
|
|
@ -829,7 +785,7 @@ func convertTime(t time.Time) (secs uint64, nsec uint32) { |
|
|
|
|
totalNano := t.UnixNano() |
|
|
|
|
secs = uint64(totalNano / 1e9) |
|
|
|
|
nsec = uint32(totalNano % 1e9) |
|
|
|
|
return |
|
|
|
|
return secs, nsec |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func convertAttributes( |
|
|
|
@ -886,7 +842,7 @@ func convertExpirationTime(t time.Time) (secs uint64, nsecs uint32) { |
|
|
|
|
nsecs = uint32((d % time.Second) / time.Nanosecond) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
return secs, nsecs |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func convertChildInodeEntry( |
|
|
|
|