github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/stdlib/os/util.go (about) 1 package os 2 3 import ( 4 "os" 5 "os/exec" 6 "syscall" 7 8 "github.com/hirochachacha/plua/object" 9 ) 10 11 func fileResult(th object.Thread, err error) ([]object.Value, *object.RuntimeError) { 12 if err == nil { 13 return []object.Value{object.True}, nil 14 } 15 16 switch err { 17 case os.ErrInvalid: 18 return []object.Value{nil, object.String(err.Error()), object.Integer(syscall.EINVAL)}, nil 19 case os.ErrPermission: 20 return []object.Value{nil, object.String(err.Error()), object.Integer(syscall.EPERM)}, nil 21 case os.ErrExist: 22 return []object.Value{nil, object.String(err.Error()), object.Integer(syscall.EEXIST)}, nil 23 case os.ErrNotExist: 24 return []object.Value{nil, object.String(err.Error()), object.Integer(syscall.ENOENT)}, nil 25 default: 26 switch err := err.(type) { 27 case *os.PathError: 28 if errno, ok := err.Err.(syscall.Errno); ok { 29 return []object.Value{nil, object.String(err.Error()), object.Integer(errno)}, nil 30 } 31 case *os.LinkError: 32 if errno, ok := err.Err.(syscall.Errno); ok { 33 return []object.Value{nil, object.String(err.Error()), object.Integer(errno)}, nil 34 } 35 case *os.SyscallError: 36 if errno, ok := err.Err.(syscall.Errno); ok { 37 return []object.Value{nil, object.String(err.Error()), object.Integer(errno)}, nil 38 } 39 } 40 } 41 42 return []object.Value{nil, object.String(err.Error()), object.Integer(-1)}, nil 43 } 44 45 func execResult(th object.Thread, err error) ([]object.Value, *object.RuntimeError) { 46 if err == nil { 47 return []object.Value{object.True, object.String("exit"), object.Integer(0)}, nil 48 } 49 50 if exitErr, ok := err.(*exec.ExitError); ok { 51 if status, ok := exitErr.Sys().(syscall.WaitStatus); ok { 52 if status.Signaled() { 53 return []object.Value{object.False, object.String("signal"), object.Integer(status.ExitStatus())}, nil 54 } 55 return []object.Value{object.False, object.String("exit"), object.Integer(status.ExitStatus())}, nil 56 } 57 return []object.Value{object.False, object.String("exit"), object.Integer(-1)}, nil 58 } 59 60 if eErr, ok := err.(*exec.Error); ok { 61 switch eErr.Err { 62 case exec.ErrNotFound: 63 return []object.Value{object.False, object.String("exit"), object.Integer(syscall.ENOENT)}, nil 64 case os.ErrPermission: 65 return []object.Value{object.False, object.String("exit"), object.Integer(syscall.EPERM)}, nil 66 case os.ErrNotExist: 67 return []object.Value{object.False, object.String("exit"), object.Integer(syscall.ENOENT)}, nil 68 } 69 } 70 71 return []object.Value{object.False, object.String("exit"), object.Integer(-1)}, nil 72 }