package filexfer import ( "fmt" ) // Status defines the SFTP error codes used in SSH_FXP_STATUS response packets. type Status uint32 // Defines the various SSH_FX_* values. const ( // see draft-ietf-secsh-filexfer-02 // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-7 StatusOK = Status(iota) StatusEOF StatusNoSuchFile StatusPermissionDenied StatusFailure StatusBadMessage StatusNoConnection StatusConnectionLost StatusOPUnsupported // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-03#section-7 StatusV4InvalidHandle StatusV4NoSuchPath StatusV4FileAlreadyExists StatusV4WriteProtect // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-7 StatusV4NoMedia // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-7 StatusV5NoSpaceOnFilesystem StatusV5QuotaExceeded StatusV5UnknownPrincipal StatusV5LockConflict // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-06#section-8 StatusV6DirNotEmpty StatusV6NotADirectory StatusV6InvalidFilename StatusV6LinkLoop // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-07#section-8 StatusV6CannotDelete StatusV6InvalidParameter StatusV6FileIsADirectory StatusV6ByteRangeLockConflict StatusV6ByteRangeLockRefused StatusV6DeletePending // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-08#section-8.1 StatusV6FileCorrupt // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-10#section-9.1 StatusV6OwnerInvalid StatusV6GroupInvalid // https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.1 StatusV6NoMatchingByteRangeLock ) func (s Status) Error() string { return s.String() } // Is returns true if the target is the same Status code, // or target is a StatusPacket with the same Status code. func (s Status) Is(target error) bool { if target, ok := target.(*StatusPacket); ok { return target.StatusCode == s } return s == target } func (s Status) String() string { switch s { case StatusOK: return "SSH_FX_OK" case StatusEOF: return "SSH_FX_EOF" case StatusNoSuchFile: return "SSH_FX_NO_SUCH_FILE" case StatusPermissionDenied: return "SSH_FX_PERMISSION_DENIED" case StatusFailure: return "SSH_FX_FAILURE" case StatusBadMessage: return "SSH_FX_BAD_MESSAGE" case StatusNoConnection: return "SSH_FX_NO_CONNECTION" case StatusConnectionLost: return "SSH_FX_CONNECTION_LOST" case StatusOPUnsupported: return "SSH_FX_OP_UNSUPPORTED" case StatusV4InvalidHandle: return "SSH_FX_INVALID_HANDLE" case StatusV4NoSuchPath: return "SSH_FX_NO_SUCH_PATH" case StatusV4FileAlreadyExists: return "SSH_FX_FILE_ALREADY_EXISTS" case StatusV4WriteProtect: return "SSH_FX_WRITE_PROTECT" case StatusV4NoMedia: return "SSH_FX_NO_MEDIA" case StatusV5NoSpaceOnFilesystem: return "SSH_FX_NO_SPACE_ON_FILESYSTEM" case StatusV5QuotaExceeded: return "SSH_FX_QUOTA_EXCEEDED" case StatusV5UnknownPrincipal: return "SSH_FX_UNKNOWN_PRINCIPAL" case StatusV5LockConflict: return "SSH_FX_LOCK_CONFLICT" case StatusV6DirNotEmpty: return "SSH_FX_DIR_NOT_EMPTY" case StatusV6NotADirectory: return "SSH_FX_NOT_A_DIRECTORY" case StatusV6InvalidFilename: return "SSH_FX_INVALID_FILENAME" case StatusV6LinkLoop: return "SSH_FX_LINK_LOOP" case StatusV6CannotDelete: return "SSH_FX_CANNOT_DELETE" case StatusV6InvalidParameter: return "SSH_FX_INVALID_PARAMETER" case StatusV6FileIsADirectory: return "SSH_FX_FILE_IS_A_DIRECTORY" case StatusV6ByteRangeLockConflict: return "SSH_FX_BYTE_RANGE_LOCK_CONFLICT" case StatusV6ByteRangeLockRefused: return "SSH_FX_BYTE_RANGE_LOCK_REFUSED" case StatusV6DeletePending: return "SSH_FX_DELETE_PENDING" case StatusV6FileCorrupt: return "SSH_FX_FILE_CORRUPT" case StatusV6OwnerInvalid: return "SSH_FX_OWNER_INVALID" case StatusV6GroupInvalid: return "SSH_FX_GROUP_INVALID" case StatusV6NoMatchingByteRangeLock: return "SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK" default: return fmt.Sprintf("SSH_FX_UNKNOWN(%d)", s) } }