100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
|
package filexfer
|
||
|
|
||
|
// InitPacket defines the SSH_FXP_INIT packet.
|
||
|
type InitPacket struct {
|
||
|
Version uint32
|
||
|
Extensions []*ExtensionPair
|
||
|
}
|
||
|
|
||
|
// MarshalBinary returns p as the binary encoding of p.
|
||
|
func (p *InitPacket) MarshalBinary() ([]byte, error) {
|
||
|
size := 1 + 4 // byte(type) + uint32(version)
|
||
|
|
||
|
for _, ext := range p.Extensions {
|
||
|
size += ext.Len()
|
||
|
}
|
||
|
|
||
|
b := NewBuffer(make([]byte, 4, 4+size))
|
||
|
b.AppendUint8(uint8(PacketTypeInit))
|
||
|
b.AppendUint32(p.Version)
|
||
|
|
||
|
for _, ext := range p.Extensions {
|
||
|
ext.MarshalInto(b)
|
||
|
}
|
||
|
|
||
|
b.PutLength(size)
|
||
|
|
||
|
return b.Bytes(), nil
|
||
|
}
|
||
|
|
||
|
// UnmarshalBinary unmarshals a full raw packet out of the given data.
|
||
|
// It is assumed that the uint32(length) has already been consumed to receive the data.
|
||
|
// It is also assumed that the uint8(type) has already been consumed to which packet to unmarshal into.
|
||
|
func (p *InitPacket) UnmarshalBinary(data []byte) (err error) {
|
||
|
buf := NewBuffer(data)
|
||
|
|
||
|
if p.Version, err = buf.ConsumeUint32(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for buf.Len() > 0 {
|
||
|
var ext ExtensionPair
|
||
|
if err := ext.UnmarshalFrom(buf); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
p.Extensions = append(p.Extensions, &ext)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// VersionPacket defines the SSH_FXP_VERSION packet.
|
||
|
type VersionPacket struct {
|
||
|
Version uint32
|
||
|
Extensions []*ExtensionPair
|
||
|
}
|
||
|
|
||
|
// MarshalBinary returns p as the binary encoding of p.
|
||
|
func (p *VersionPacket) MarshalBinary() ([]byte, error) {
|
||
|
size := 1 + 4 // byte(type) + uint32(version)
|
||
|
|
||
|
for _, ext := range p.Extensions {
|
||
|
size += ext.Len()
|
||
|
}
|
||
|
|
||
|
b := NewBuffer(make([]byte, 4, 4+size))
|
||
|
b.AppendUint8(uint8(PacketTypeVersion))
|
||
|
b.AppendUint32(p.Version)
|
||
|
|
||
|
for _, ext := range p.Extensions {
|
||
|
ext.MarshalInto(b)
|
||
|
}
|
||
|
|
||
|
b.PutLength(size)
|
||
|
|
||
|
return b.Bytes(), nil
|
||
|
}
|
||
|
|
||
|
// UnmarshalBinary unmarshals a full raw packet out of the given data.
|
||
|
// It is assumed that the uint32(length) has already been consumed to receive the data.
|
||
|
// It is also assumed that the uint8(type) has already been consumed to which packet to unmarshal into.
|
||
|
func (p *VersionPacket) UnmarshalBinary(data []byte) (err error) {
|
||
|
buf := NewBuffer(data)
|
||
|
|
||
|
if p.Version, err = buf.ConsumeUint32(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for buf.Len() > 0 {
|
||
|
var ext ExtensionPair
|
||
|
if err := ext.UnmarshalFrom(buf); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
p.Extensions = append(p.Extensions, &ext)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|