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  }