package sshfx
import (
"encoding"
"sync"
)
type ExtendedData = interface {
encoding .BinaryMarshaler
encoding .BinaryUnmarshaler
}
type ExtendedDataConstructor func () ExtendedData
var extendedPacketTypes = struct {
mu sync .RWMutex
constructors map [string ]ExtendedDataConstructor
}{
constructors : make (map [string ]ExtendedDataConstructor ),
}
func RegisterExtendedPacketType (extension string , constructor ExtendedDataConstructor ) {
extendedPacketTypes .mu .Lock ()
defer extendedPacketTypes .mu .Unlock ()
if _ , exist := extendedPacketTypes .constructors [extension ]; exist {
panic ("encoding/ssh/filexfer: multiple registration of extended packet type " + extension )
}
extendedPacketTypes .constructors [extension ] = constructor
}
func newExtendedPacket(extension string ) ExtendedData {
extendedPacketTypes .mu .RLock ()
defer extendedPacketTypes .mu .RUnlock ()
if f := extendedPacketTypes .constructors [extension ]; f != nil {
return f ()
}
return new (Buffer )
}
type ExtendedPacket struct {
ExtendedRequest string
Data ExtendedData
}
func (p *ExtendedPacket ) Type () PacketType {
return PacketTypeExtended
}
func (p *ExtendedPacket ) MarshalPacket (reqid uint32 , b []byte ) (header , payload []byte , err error ) {
buf := NewBuffer (b )
if buf .Cap () < 9 {
size := 4 + len (p .ExtendedRequest )
buf = NewMarshalBuffer (size )
}
buf .StartPacket (PacketTypeExtended , reqid )
buf .AppendString (p .ExtendedRequest )
if p .Data != nil {
payload , err = p .Data .MarshalBinary ()
if err != nil {
return nil , nil , err
}
}
return buf .Packet (payload )
}
func (p *ExtendedPacket ) UnmarshalPacketBody (buf *Buffer ) (err error ) {
p .ExtendedRequest = buf .ConsumeString ()
if buf .Err != nil {
return buf .Err
}
if p .Data == nil {
p .Data = newExtendedPacket (p .ExtendedRequest )
}
return p .Data .UnmarshalBinary (buf .Bytes ())
}
type ExtendedReplyPacket struct {
Data ExtendedData
}
func (p *ExtendedReplyPacket ) Type () PacketType {
return PacketTypeExtendedReply
}
func (p *ExtendedReplyPacket ) MarshalPacket (reqid uint32 , b []byte ) (header , payload []byte , err error ) {
buf := NewBuffer (b )
if buf .Cap () < 9 {
buf = NewMarshalBuffer (0 )
}
buf .StartPacket (PacketTypeExtendedReply , reqid )
if p .Data != nil {
payload , err = p .Data .MarshalBinary ()
if err != nil {
return nil , nil , err
}
}
return buf .Packet (payload )
}
func (p *ExtendedReplyPacket ) UnmarshalPacketBody (buf *Buffer ) (err error ) {
if p .Data == nil {
p .Data = new (Buffer )
}
return p .Data .UnmarshalBinary (buf .Bytes ())
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .