package filexfer // SSH_FXF_* flags. const ( FlagRead = 1 << iota // SSH_FXF_READ FlagWrite // SSH_FXF_WRITE FlagAppend // SSH_FXF_APPEND FlagCreate // SSH_FXF_CREAT FlagTruncate // SSH_FXF_TRUNC FlagExclusive // SSH_FXF_EXCL ) // OpenPacket defines the SSH_FXP_OPEN packet. type OpenPacket struct { Filename string PFlags uint32 Attrs Attributes } // Type returns the SSH_FXP_xy value associated with this packet type. func (p *OpenPacket) Type() PacketType { return PacketTypeOpen } // MarshalPacket returns p as a two-part binary encoding of p. func (p *OpenPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) { buf := NewBuffer(b) if buf.Cap() < 9 { // string(filename) + uint32(pflags) + ATTRS(attrs) size := 4 + len(p.Filename) + 4 + p.Attrs.Len() buf = NewMarshalBuffer(size) } buf.StartPacket(PacketTypeOpen, reqid) buf.AppendString(p.Filename) buf.AppendUint32(p.PFlags) p.Attrs.MarshalInto(buf) return buf.Packet(payload) } // UnmarshalPacketBody unmarshals the packet body from the given Buffer. // It is assumed that the uint32(request-id) has already been consumed. func (p *OpenPacket) UnmarshalPacketBody(buf *Buffer) (err error) { if p.Filename, err = buf.ConsumeString(); err != nil { return err } if p.PFlags, err = buf.ConsumeUint32(); err != nil { return err } return p.Attrs.UnmarshalFrom(buf) } // OpenDirPacket defines the SSH_FXP_OPENDIR packet. type OpenDirPacket struct { Path string } // Type returns the SSH_FXP_xy value associated with this packet type. func (p *OpenDirPacket) Type() PacketType { return PacketTypeOpenDir } // MarshalPacket returns p as a two-part binary encoding of p. func (p *OpenDirPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) { buf := NewBuffer(b) if buf.Cap() < 9 { size := 4 + len(p.Path) // string(path) buf = NewMarshalBuffer(size) } buf.StartPacket(PacketTypeOpenDir, reqid) buf.AppendString(p.Path) return buf.Packet(payload) } // UnmarshalPacketBody unmarshals the packet body from the given Buffer. // It is assumed that the uint32(request-id) has already been consumed. func (p *OpenDirPacket) UnmarshalPacketBody(buf *Buffer) (err error) { if p.Path, err = buf.ConsumeString(); err != nil { return err } return nil }