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 }