package sshfx import ( "fmt" ) // PacketType defines the various SFTP packet types. type PacketType uint8 // Request packet types. const ( // https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-3 PacketTypeInit = PacketType(iota + 1) PacketTypeVersion PacketTypeOpen PacketTypeClose PacketTypeRead PacketTypeWrite PacketTypeLStat PacketTypeFStat PacketTypeSetstat PacketTypeFSetstat PacketTypeOpenDir PacketTypeReadDir PacketTypeRemove PacketTypeMkdir PacketTypeRmdir PacketTypeRealPath PacketTypeStat PacketTypeRename PacketTypeReadLink PacketTypeSymlink // https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-07.txt#section-3.3 PacketTypeV6Link // https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-08.txt#section-3.3 PacketTypeV6Block PacketTypeV6Unblock ) // Response packet types. const ( // https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-3 PacketTypeStatus = PacketType(iota + 101) PacketTypeHandle PacketTypeData PacketTypeName PacketTypeAttrs ) // Extended packet types. const ( // https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-3 PacketTypeExtended = PacketType(iota + 200) PacketTypeExtendedReply ) func (f PacketType) String() string { switch f { case PacketTypeInit: return "SSH_FXP_INIT" case PacketTypeVersion: return "SSH_FXP_VERSION" case PacketTypeOpen: return "SSH_FXP_OPEN" case PacketTypeClose: return "SSH_FXP_CLOSE" case PacketTypeRead: return "SSH_FXP_READ" case PacketTypeWrite: return "SSH_FXP_WRITE" case PacketTypeLStat: return "SSH_FXP_LSTAT" case PacketTypeFStat: return "SSH_FXP_FSTAT" case PacketTypeSetstat: return "SSH_FXP_SETSTAT" case PacketTypeFSetstat: return "SSH_FXP_FSETSTAT" case PacketTypeOpenDir: return "SSH_FXP_OPENDIR" case PacketTypeReadDir: return "SSH_FXP_READDIR" case PacketTypeRemove: return "SSH_FXP_REMOVE" case PacketTypeMkdir: return "SSH_FXP_MKDIR" case PacketTypeRmdir: return "SSH_FXP_RMDIR" case PacketTypeRealPath: return "SSH_FXP_REALPATH" case PacketTypeStat: return "SSH_FXP_STAT" case PacketTypeRename: return "SSH_FXP_RENAME" case PacketTypeReadLink: return "SSH_FXP_READLINK" case PacketTypeSymlink: return "SSH_FXP_SYMLINK" case PacketTypeV6Link: return "SSH_FXP_LINK" case PacketTypeV6Block: return "SSH_FXP_BLOCK" case PacketTypeV6Unblock: return "SSH_FXP_UNBLOCK" case PacketTypeStatus: return "SSH_FXP_STATUS" case PacketTypeHandle: return "SSH_FXP_HANDLE" case PacketTypeData: return "SSH_FXP_DATA" case PacketTypeName: return "SSH_FXP_NAME" case PacketTypeAttrs: return "SSH_FXP_ATTRS" case PacketTypeExtended: return "SSH_FXP_EXTENDED" case PacketTypeExtendedReply: return "SSH_FXP_EXTENDED_REPLY" default: return fmt.Sprintf("SSH_FXP_UNKNOWN(%d)", f) } } func newPacketFromType(typ PacketType) (Packet, error) { switch typ { case PacketTypeOpen: return new(OpenPacket), nil case PacketTypeClose: return new(ClosePacket), nil case PacketTypeRead: return new(ReadPacket), nil case PacketTypeWrite: return new(WritePacket), nil case PacketTypeLStat: return new(LStatPacket), nil case PacketTypeFStat: return new(FStatPacket), nil case PacketTypeSetstat: return new(SetstatPacket), nil case PacketTypeFSetstat: return new(FSetstatPacket), nil case PacketTypeOpenDir: return new(OpenDirPacket), nil case PacketTypeReadDir: return new(ReadDirPacket), nil case PacketTypeRemove: return new(RemovePacket), nil case PacketTypeMkdir: return new(MkdirPacket), nil case PacketTypeRmdir: return new(RmdirPacket), nil case PacketTypeRealPath: return new(RealPathPacket), nil case PacketTypeStat: return new(StatPacket), nil case PacketTypeRename: return new(RenamePacket), nil case PacketTypeReadLink: return new(ReadLinkPacket), nil case PacketTypeSymlink: return new(SymlinkPacket), nil case PacketTypeExtended: return new(ExtendedPacket), nil default: return nil, fmt.Errorf("unexpected request packet type: %v", typ) } }