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 }