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
}
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
}
func isRegular(mode uint32 ) bool {
return mode &S_IFMT == syscall .S_IFREG
}
func toFileMode(mode uint32 ) os .FileMode {
var fm = os .FileMode (mode & 0777 )
switch mode & S_IFMT {
case syscall .S_IFBLK :
fm |= os .ModeDevice
case syscall .S_IFCHR :
fm |= os .ModeDevice | os .ModeCharDevice
case syscall .S_IFDIR :
fm |= os .ModeDir
case syscall .S_IFIFO :
fm |= os .ModeNamedPipe
case syscall .S_IFLNK :
fm |= os .ModeSymlink
case syscall .S_IFREG :
case syscall .S_IFSOCK :
fm |= os .ModeSocket
}
if mode &syscall .S_ISUID != 0 {
fm |= os .ModeSetuid
}
if mode &syscall .S_ISGID != 0 {
fm |= os .ModeSetgid
}
if mode &syscall .S_ISVTX != 0 {
fm |= os .ModeSticky
}
return fm
}
func fromFileMode(mode os .FileMode ) uint32 {
ret := uint32 (mode & os .ModePerm )
switch mode & os .ModeType {
case os .ModeDevice | os .ModeCharDevice :
ret |= syscall .S_IFCHR
case os .ModeDevice :
ret |= syscall .S_IFBLK
case os .ModeDir :
ret |= syscall .S_IFDIR
case os .ModeNamedPipe :
ret |= syscall .S_IFIFO
case os .ModeSymlink :
ret |= syscall .S_IFLNK
case 0 :
ret |= syscall .S_IFREG
case os .ModeSocket :
ret |= syscall .S_IFSOCK
}
if mode &os .ModeSetuid != 0 {
ret |= syscall .S_ISUID
}
if mode &os .ModeSetgid != 0 {
ret |= syscall .S_ISGID
}
if mode &os .ModeSticky != 0 {
ret |= syscall .S_ISVTX
}
return ret
}
const (
s_ISUID = syscall .S_ISUID
s_ISGID = syscall .S_ISGID
s_ISVTX = syscall .S_ISVTX
)
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .