forked from Deuxfleurs/bagage
148 lines
3.9 KiB
Go
148 lines
3.9 KiB
Go
|
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)
|
||
|
}
|
||
|
}
|