package sshfx
import (
"fmt"
)
type StatusPacket struct {
StatusCode Status
ErrorMessage string
LanguageTag string
}
func (p *StatusPacket ) Error () string {
if p .ErrorMessage == "" {
return "sftp: " + p .StatusCode .String ()
}
return fmt .Sprintf ("sftp: %s: %q" , p .StatusCode , p .ErrorMessage )
}
func (p *StatusPacket ) Is (target error ) bool {
if target , ok := target .(*StatusPacket ); ok {
return p .StatusCode == target .StatusCode
}
return p .StatusCode == target
}
func (p *StatusPacket ) Type () PacketType {
return PacketTypeStatus
}
func (p *StatusPacket ) MarshalPacket (reqid uint32 , b []byte ) (header , payload []byte , err error ) {
buf := NewBuffer (b )
if buf .Cap () < 9 {
size := 4 + 4 + len (p .ErrorMessage ) + 4 + len (p .LanguageTag )
buf = NewMarshalBuffer (size )
}
buf .StartPacket (PacketTypeStatus , reqid )
buf .AppendUint32 (uint32 (p .StatusCode ))
buf .AppendString (p .ErrorMessage )
buf .AppendString (p .LanguageTag )
return buf .Packet (payload )
}
func (p *StatusPacket ) UnmarshalPacketBody (buf *Buffer ) (err error ) {
*p = StatusPacket {
StatusCode : Status (buf .ConsumeUint32 ()),
ErrorMessage : buf .ConsumeString (),
LanguageTag : buf .ConsumeString (),
}
return buf .Err
}
type HandlePacket struct {
Handle string
}
func (p *HandlePacket ) Type () PacketType {
return PacketTypeHandle
}
func (p *HandlePacket ) MarshalPacket (reqid uint32 , b []byte ) (header , payload []byte , err error ) {
buf := NewBuffer (b )
if buf .Cap () < 9 {
size := 4 + len (p .Handle )
buf = NewMarshalBuffer (size )
}
buf .StartPacket (PacketTypeHandle , reqid )
buf .AppendString (p .Handle )
return buf .Packet (payload )
}
func (p *HandlePacket ) UnmarshalPacketBody (buf *Buffer ) (err error ) {
*p = HandlePacket {
Handle : buf .ConsumeString (),
}
return buf .Err
}
type DataPacket struct {
Data []byte
}
func (p *DataPacket ) Type () PacketType {
return PacketTypeData
}
func (p *DataPacket ) MarshalPacket (reqid uint32 , b []byte ) (header , payload []byte , err error ) {
buf := NewBuffer (b )
if buf .Cap () < 9 {
size := 4
buf = NewMarshalBuffer (size )
}
buf .StartPacket (PacketTypeData , reqid )
buf .AppendUint32 (uint32 (len (p .Data )))
return buf .Packet (p .Data )
}
func (p *DataPacket ) UnmarshalPacketBody (buf *Buffer ) (err error ) {
*p = DataPacket {
Data : buf .ConsumeByteSliceCopy (p .Data ),
}
return buf .Err
}
type NamePacket struct {
Entries []*NameEntry
}
func (p *NamePacket ) Type () PacketType {
return PacketTypeName
}
func (p *NamePacket ) MarshalPacket (reqid uint32 , b []byte ) (header , payload []byte , err error ) {
buf := NewBuffer (b )
if buf .Cap () < 9 {
size := 4
for _ , e := range p .Entries {
size += e .Len ()
}
buf = NewMarshalBuffer (size )
}
buf .StartPacket (PacketTypeName , reqid )
buf .AppendUint32 (uint32 (len (p .Entries )))
for _ , e := range p .Entries {
e .MarshalInto (buf )
}
return buf .Packet (payload )
}
func (p *NamePacket ) UnmarshalPacketBody (buf *Buffer ) (err error ) {
count := buf .ConsumeCount ()
if buf .Err != nil {
return buf .Err
}
*p = NamePacket {
Entries : make ([]*NameEntry , 0 , count ),
}
for i := 0 ; i < count ; i ++ {
var e NameEntry
if err := e .UnmarshalFrom (buf ); err != nil {
return err
}
p .Entries = append (p .Entries , &e )
}
return buf .Err
}
type AttrsPacket struct {
Attrs Attributes
}
func (p *AttrsPacket ) Type () PacketType {
return PacketTypeAttrs
}
func (p *AttrsPacket ) MarshalPacket (reqid uint32 , b []byte ) (header , payload []byte , err error ) {
buf := NewBuffer (b )
if buf .Cap () < 9 {
size := p .Attrs .Len ()
buf = NewMarshalBuffer (size )
}
buf .StartPacket (PacketTypeAttrs , reqid )
p .Attrs .MarshalInto (buf )
return buf .Packet (payload )
}
func (p *AttrsPacket ) UnmarshalPacketBody (buf *Buffer ) (err error ) {
return p .Attrs .UnmarshalFrom (buf )
}
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 .