| package filexfer |
| |
| // LStatPacket defines the SSH_FXP_LSTAT packet. |
| type LStatPacket struct { |
| Path string |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *LStatPacket) Type() PacketType { |
| return PacketTypeLStat |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *LStatPacket) 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(PacketTypeLStat, 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 *LStatPacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.Path, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return nil |
| } |
| |
| // SetstatPacket defines the SSH_FXP_SETSTAT packet. |
| type SetstatPacket struct { |
| Path string |
| Attrs Attributes |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *SetstatPacket) Type() PacketType { |
| return PacketTypeSetstat |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *SetstatPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) { |
| buf := NewBuffer(b) |
| if buf.Cap() < 9 { |
| size := 4 + len(p.Path) + p.Attrs.Len() // string(path) + ATTRS(attrs) |
| buf = NewMarshalBuffer(size) |
| } |
| |
| buf.StartPacket(PacketTypeSetstat, reqid) |
| buf.AppendString(p.Path) |
| |
| 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 *SetstatPacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.Path, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return p.Attrs.UnmarshalFrom(buf) |
| } |
| |
| // RemovePacket defines the SSH_FXP_REMOVE packet. |
| type RemovePacket struct { |
| Path string |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *RemovePacket) Type() PacketType { |
| return PacketTypeRemove |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *RemovePacket) 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(PacketTypeRemove, 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 *RemovePacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.Path, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return nil |
| } |
| |
| // MkdirPacket defines the SSH_FXP_MKDIR packet. |
| type MkdirPacket struct { |
| Path string |
| Attrs Attributes |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *MkdirPacket) Type() PacketType { |
| return PacketTypeMkdir |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *MkdirPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) { |
| buf := NewBuffer(b) |
| if buf.Cap() < 9 { |
| size := 4 + len(p.Path) + p.Attrs.Len() // string(path) + ATTRS(attrs) |
| buf = NewMarshalBuffer(size) |
| } |
| |
| buf.StartPacket(PacketTypeMkdir, reqid) |
| buf.AppendString(p.Path) |
| |
| 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 *MkdirPacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.Path, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return p.Attrs.UnmarshalFrom(buf) |
| } |
| |
| // RmdirPacket defines the SSH_FXP_RMDIR packet. |
| type RmdirPacket struct { |
| Path string |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *RmdirPacket) Type() PacketType { |
| return PacketTypeRmdir |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *RmdirPacket) 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(PacketTypeRmdir, 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 *RmdirPacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.Path, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return nil |
| } |
| |
| // RealPathPacket defines the SSH_FXP_REALPATH packet. |
| type RealPathPacket struct { |
| Path string |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *RealPathPacket) Type() PacketType { |
| return PacketTypeRealPath |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *RealPathPacket) 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(PacketTypeRealPath, 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 *RealPathPacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.Path, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return nil |
| } |
| |
| // StatPacket defines the SSH_FXP_STAT packet. |
| type StatPacket struct { |
| Path string |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *StatPacket) Type() PacketType { |
| return PacketTypeStat |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *StatPacket) 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(PacketTypeStat, 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 *StatPacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.Path, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return nil |
| } |
| |
| // RenamePacket defines the SSH_FXP_RENAME packet. |
| type RenamePacket struct { |
| OldPath string |
| NewPath string |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *RenamePacket) Type() PacketType { |
| return PacketTypeRename |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *RenamePacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) { |
| buf := NewBuffer(b) |
| if buf.Cap() < 9 { |
| // string(oldpath) + string(newpath) |
| size := 4 + len(p.OldPath) + 4 + len(p.NewPath) |
| buf = NewMarshalBuffer(size) |
| } |
| |
| buf.StartPacket(PacketTypeRename, reqid) |
| buf.AppendString(p.OldPath) |
| buf.AppendString(p.NewPath) |
| |
| 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 *RenamePacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.OldPath, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| if p.NewPath, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return nil |
| } |
| |
| // ReadLinkPacket defines the SSH_FXP_READLINK packet. |
| type ReadLinkPacket struct { |
| Path string |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *ReadLinkPacket) Type() PacketType { |
| return PacketTypeReadLink |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *ReadLinkPacket) 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(PacketTypeReadLink, 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 *ReadLinkPacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| if p.Path, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return nil |
| } |
| |
| // SymlinkPacket defines the SSH_FXP_SYMLINK packet. |
| // |
| // The order of the arguments to the SSH_FXP_SYMLINK method was inadvertently reversed. |
| // Unfortunately, the reversal was not noticed until the server was widely deployed. |
| // Covered in Section 3.1 of https://github.com/openssh/openssh-portable/blob/master/PROTOCOL |
| type SymlinkPacket struct { |
| LinkPath string |
| TargetPath string |
| } |
| |
| // Type returns the SSH_FXP_xy value associated with this packet type. |
| func (p *SymlinkPacket) Type() PacketType { |
| return PacketTypeSymlink |
| } |
| |
| // MarshalPacket returns p as a two-part binary encoding of p. |
| func (p *SymlinkPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) { |
| buf := NewBuffer(b) |
| if buf.Cap() < 9 { |
| // string(targetpath) + string(linkpath) |
| size := 4 + len(p.TargetPath) + 4 + len(p.LinkPath) |
| buf = NewMarshalBuffer(size) |
| } |
| |
| buf.StartPacket(PacketTypeSymlink, reqid) |
| |
| // Arguments were inadvertently reversed. |
| buf.AppendString(p.TargetPath) |
| buf.AppendString(p.LinkPath) |
| |
| 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 *SymlinkPacket) UnmarshalPacketBody(buf *Buffer) (err error) { |
| // Arguments were inadvertently reversed. |
| if p.TargetPath, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| if p.LinkPath, err = buf.ConsumeString(); err != nil { |
| return err |
| } |
| |
| return nil |
| } |