| //go:build !plan9 |
| // +build !plan9 |
| |
| package sftp |
| |
| import ( |
| "os" |
| "syscall" |
| ) |
| |
| const EBADF = syscall.EBADF |
| |
| func wrapPathError(filepath string, err error) error { |
| if errno, ok := err.(syscall.Errno); ok { |
| return &os.PathError{Path: filepath, Err: errno} |
| } |
| return err |
| } |
| |
| // translateErrno translates a syscall error number to a SFTP error code. |
| func translateErrno(errno syscall.Errno) uint32 { |
| switch errno { |
| case 0: |
| return sshFxOk |
| case syscall.ENOENT: |
| return sshFxNoSuchFile |
| case syscall.EACCES, syscall.EPERM: |
| return sshFxPermissionDenied |
| } |
| |
| return sshFxFailure |
| } |
| |
| func translateSyscallError(err error) (uint32, bool) { |
| switch e := err.(type) { |
| case syscall.Errno: |
| return translateErrno(e), true |
| case *os.PathError: |
| debug("statusFromError,pathError: error is %T %#v", e.Err, e.Err) |
| if errno, ok := e.Err.(syscall.Errno); ok { |
| return translateErrno(errno), true |
| } |
| } |
| return 0, false |
| } |