mirror of https://github.com/pkg/sftp.git
				
				
				
			
		
			
	
	
		
			43 lines
		
	
	
		
			923 B
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			43 lines
		
	
	
		
			923 B
		
	
	
	
		
			Go
		
	
	
	
|  | package sftp | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"os" | ||
|  | 	"syscall" | ||
|  | ) | ||
|  | 
 | ||
|  | var EBADF = syscall.NewError("fd out of range or not open") | ||
|  | 
 | ||
|  | func wrapPathError(filepath string, err error) error { | ||
|  | 	if errno, ok := err.(syscall.ErrorString); 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.ErrorString) uint32 { | ||
|  | 	switch errno { | ||
|  | 	case "": | ||
|  | 		return sshFxOk | ||
|  | 	case syscall.ENOENT: | ||
|  | 		return sshFxNoSuchFile | ||
|  | 	case syscall.EPERM: | ||
|  | 		return sshFxPermissionDenied | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return sshFxFailure | ||
|  | } | ||
|  | 
 | ||
|  | func translateSyscallError(err error) (uint32, bool) { | ||
|  | 	switch e := err.(type) { | ||
|  | 	case syscall.ErrorString: | ||
|  | 		return translateErrno(e), true | ||
|  | 	case *os.PathError: | ||
|  | 		debug("statusFromError,pathError: error is %T %#v", e.Err, e.Err) | ||
|  | 		if errno, ok := e.Err.(syscall.ErrorString); ok { | ||
|  | 			return translateErrno(errno), true | ||
|  | 		} | ||
|  | 	} | ||
|  | 	return 0, false | ||
|  | } |