github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/tools/go/ssa/interp/external_unix.go (about)

     1  // Copyright 2013 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // +build !windows,!plan9
     6  
     7  package interp
     8  
     9  import "syscall"
    10  
    11  func ext۰os۰Pipe(fr *frame, args []value) value {
    12  	// func os.Pipe() (r *File, w *File, err error)
    13  
    14  	// The portable POSIX pipe(2) call is good enough for our needs.
    15  	var p [2]int
    16  	if err := syscall.Pipe(p[:]); err != nil {
    17  		// TODO(adonovan): fix: return an *os.SyscallError.
    18  		return tuple{nil, nil, wrapError(err)}
    19  	}
    20  
    21  	NewFile := fr.i.prog.ImportedPackage("os").Func("NewFile")
    22  	r := call(fr.i, fr, 0, NewFile, []value{uintptr(p[0]), "|0"})
    23  	w := call(fr.i, fr, 0, NewFile, []value{uintptr(p[1]), "|1"})
    24  	return tuple{r, w, wrapError(nil)}
    25  }
    26  
    27  func fillStat(st *syscall.Stat_t, stat structure) {
    28  	stat[0] = st.Dev
    29  	stat[1] = st.Ino
    30  	stat[2] = st.Nlink
    31  	stat[3] = st.Mode
    32  	stat[4] = st.Uid
    33  	stat[5] = st.Gid
    34  
    35  	stat[7] = st.Rdev
    36  	stat[8] = st.Size
    37  	stat[9] = st.Blksize
    38  	stat[10] = st.Blocks
    39  	// TODO(adonovan): fix: copy Timespecs.
    40  	// stat[11] = st.Atim
    41  	// stat[12] = st.Mtim
    42  	// stat[13] = st.Ctim
    43  }
    44  
    45  func ext۰syscall۰Close(fr *frame, args []value) value {
    46  	// func Close(fd int) (err error)
    47  	return wrapError(syscall.Close(args[0].(int)))
    48  }
    49  
    50  func ext۰syscall۰Fstat(fr *frame, args []value) value {
    51  	// func Fstat(fd int, stat *Stat_t) (err error)
    52  	fd := args[0].(int)
    53  	stat := (*args[1].(*value)).(structure)
    54  
    55  	var st syscall.Stat_t
    56  	err := syscall.Fstat(fd, &st)
    57  	fillStat(&st, stat)
    58  	return wrapError(err)
    59  }
    60  
    61  func ext۰syscall۰ReadDirent(fr *frame, args []value) value {
    62  	// func ReadDirent(fd int, buf []byte) (n int, err error)
    63  	fd := args[0].(int)
    64  	p := args[1].([]value)
    65  	b := make([]byte, len(p))
    66  	n, err := syscall.ReadDirent(fd, b)
    67  	for i := 0; i < n; i++ {
    68  		p[i] = b[i]
    69  	}
    70  	return tuple{n, wrapError(err)}
    71  }
    72  
    73  func ext۰syscall۰Kill(fr *frame, args []value) value {
    74  	// func Kill(pid int, sig Signal) (err error)
    75  	return wrapError(syscall.Kill(args[0].(int), syscall.Signal(args[1].(int))))
    76  }
    77  
    78  func ext۰syscall۰Lstat(fr *frame, args []value) value {
    79  	// func Lstat(name string, stat *Stat_t) (err error)
    80  	name := args[0].(string)
    81  	stat := (*args[1].(*value)).(structure)
    82  
    83  	var st syscall.Stat_t
    84  	err := syscall.Lstat(name, &st)
    85  	fillStat(&st, stat)
    86  	return wrapError(err)
    87  }
    88  
    89  func ext۰syscall۰Open(fr *frame, args []value) value {
    90  	// func Open(path string, mode int, perm uint32) (fd int, err error) {
    91  	path := args[0].(string)
    92  	mode := args[1].(int)
    93  	perm := args[2].(uint32)
    94  	fd, err := syscall.Open(path, mode, perm)
    95  	return tuple{fd, wrapError(err)}
    96  }
    97  
    98  func ext۰syscall۰ParseDirent(fr *frame, args []value) value {
    99  	// func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string)
   100  	max := args[1].(int)
   101  	var names []string
   102  	for _, iname := range args[2].([]value) {
   103  		names = append(names, iname.(string))
   104  	}
   105  	consumed, count, newnames := syscall.ParseDirent(valueToBytes(args[0]), max, names)
   106  	var inewnames []value
   107  	for _, newname := range newnames {
   108  		inewnames = append(inewnames, newname)
   109  	}
   110  	return tuple{consumed, count, inewnames}
   111  }
   112  
   113  func ext۰syscall۰Read(fr *frame, args []value) value {
   114  	// func Read(fd int, p []byte) (n int, err error)
   115  	fd := args[0].(int)
   116  	p := args[1].([]value)
   117  	b := make([]byte, len(p))
   118  	n, err := syscall.Read(fd, b)
   119  	for i := 0; i < n; i++ {
   120  		p[i] = b[i]
   121  	}
   122  	return tuple{n, wrapError(err)}
   123  }
   124  
   125  func ext۰syscall۰Stat(fr *frame, args []value) value {
   126  	// func Stat(name string, stat *Stat_t) (err error)
   127  	name := args[0].(string)
   128  	stat := (*args[1].(*value)).(structure)
   129  
   130  	var st syscall.Stat_t
   131  	err := syscall.Stat(name, &st)
   132  	fillStat(&st, stat)
   133  	return wrapError(err)
   134  }
   135  
   136  func ext۰syscall۰Write(fr *frame, args []value) value {
   137  	// func Write(fd int, p []byte) (n int, err error)
   138  	n, err := write(args[0].(int), valueToBytes(args[1]))
   139  	return tuple{n, wrapError(err)}
   140  }
   141  
   142  func ext۰syscall۰RawSyscall(fr *frame, args []value) value {
   143  	return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)}
   144  }
   145  
   146  func syswrite(fd int, b []byte) (int, error) {
   147  	return syscall.Write(fd, b)
   148  }