sftp/errno_posix.go

52 lines
1.1 KiB
Go
Raw Normal View History

2024-10-01 01:38:18 +08:00
//go:build !plan9
// +build !plan9
package sftp
import (
"errors"
"io/fs"
"os"
"syscall"
sshfx "github.com/pkg/sftp/v2/encoding/ssh/filexfer"
)
// translateErrno translates a syscall error number to a SFTP error code.
func translateErrno(errno syscall.Errno) sshfx.Status {
switch errno {
case 0:
return sshfx.StatusOK
case syscall.ENOENT:
return sshfx.StatusNoSuchFile
case syscall.EACCES, syscall.EPERM:
return sshfx.StatusPermissionDenied
case syscall.ENOTSUP:
return sshfx.StatusOPUnsupported
}
return sshfx.StatusFailure
}
func syscallErrorAsStatus(err error, pkt *sshfx.StatusPacket) bool {
var pathErr *fs.PathError
if errors.As(err, &pathErr) {
err = pathErr.Err // Replace the error with the underlying error.
pkt.ErrorMessage = err.Error()
}
var linkErr *os.LinkError
if errors.As(err, &linkErr) {
err = linkErr.Err // Replace the error with the underlying error.
pkt.ErrorMessage = err.Error()
}
var errno syscall.Errno
if errors.As(err, &errno) {
pkt.StatusCode = translateErrno(errno)
return true
}
return false
}