github.com/likebike/go--@v0.0.0-20190911215757-0bd925d16e96/go/src/syscall/syscall_nacl.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 package syscall 6 7 import ( 8 "sync" 9 "unsafe" 10 ) 11 12 //sys naclClose(fd int) (err error) = sys_close 13 //sys naclFstat(fd int, stat *Stat_t) (err error) = sys_fstat 14 //sys naclRead(fd int, b []byte) (n int, err error) = sys_read 15 //sys naclSeek(fd int, off *int64, whence int) (err error) = sys_lseek 16 //sys naclGetRandomBytes(b []byte) (err error) = sys_get_random_bytes 17 18 const direntSize = 8 + 8 + 2 + 256 19 20 // native_client/src/trusted/service_runtime/include/sys/dirent.h 21 type Dirent struct { 22 Ino int64 23 Off int64 24 Reclen uint16 25 Name [256]byte 26 } 27 28 func direntIno(buf []byte) (uint64, bool) { 29 return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) 30 } 31 32 func direntReclen(buf []byte) (uint64, bool) { 33 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) 34 } 35 36 func direntNamlen(buf []byte) (uint64, bool) { 37 reclen, ok := direntReclen(buf) 38 if !ok { 39 return 0, false 40 } 41 return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true 42 } 43 44 const PathMax = 256 45 46 // An Errno is an unsigned number describing an error condition. 47 // It implements the error interface. The zero Errno is by convention 48 // a non-error, so code to convert from Errno to error should use: 49 // err = nil 50 // if errno != 0 { 51 // err = errno 52 // } 53 type Errno uintptr 54 55 func (e Errno) Error() string { 56 if 0 <= int(e) && int(e) < len(errorstr) { 57 s := errorstr[e] 58 if s != "" { 59 return s 60 } 61 } 62 return "errno " + itoa(int(e)) 63 } 64 65 func (e Errno) Temporary() bool { 66 return e == EINTR || e == EMFILE || e.Timeout() 67 } 68 69 func (e Errno) Timeout() bool { 70 return e == EAGAIN || e == EWOULDBLOCK || e == ETIMEDOUT 71 } 72 73 // A Signal is a number describing a process signal. 74 // It implements the os.Signal interface. 75 type Signal int 76 77 const ( 78 _ Signal = iota 79 SIGCHLD 80 SIGINT 81 SIGKILL 82 SIGTRAP 83 SIGQUIT 84 ) 85 86 func (s Signal) Signal() {} 87 88 func (s Signal) String() string { 89 if 0 <= s && int(s) < len(signals) { 90 str := signals[s] 91 if str != "" { 92 return str 93 } 94 } 95 return "signal " + itoa(int(s)) 96 } 97 98 var signals = [...]string{} 99 100 // File system 101 102 const ( 103 Stdin = 0 104 Stdout = 1 105 Stderr = 2 106 ) 107 108 // native_client/src/trusted/service_runtime/include/sys/fcntl.h 109 const ( 110 O_RDONLY = 0 111 O_WRONLY = 1 112 O_RDWR = 2 113 O_ACCMODE = 3 114 115 O_CREAT = 0100 116 O_CREATE = O_CREAT // for ken 117 O_TRUNC = 01000 118 O_APPEND = 02000 119 O_EXCL = 0200 120 O_NONBLOCK = 04000 121 O_NDELAY = O_NONBLOCK 122 O_SYNC = 010000 123 O_FSYNC = O_SYNC 124 O_ASYNC = 020000 125 126 O_CLOEXEC = 0 127 128 FD_CLOEXEC = 1 129 ) 130 131 // native_client/src/trusted/service_runtime/include/sys/fcntl.h 132 const ( 133 F_DUPFD = 0 134 F_GETFD = 1 135 F_SETFD = 2 136 F_GETFL = 3 137 F_SETFL = 4 138 F_GETOWN = 5 139 F_SETOWN = 6 140 F_GETLK = 7 141 F_SETLK = 8 142 F_SETLKW = 9 143 F_RGETLK = 10 144 F_RSETLK = 11 145 F_CNVT = 12 146 F_RSETLKW = 13 147 148 F_RDLCK = 1 149 F_WRLCK = 2 150 F_UNLCK = 3 151 F_UNLKSYS = 4 152 ) 153 154 // native_client/src/trusted/service_runtime/include/bits/stat.h 155 const ( 156 S_IFMT = 0000370000 157 S_IFSHM_SYSV = 0000300000 158 S_IFSEMA = 0000270000 159 S_IFCOND = 0000260000 160 S_IFMUTEX = 0000250000 161 S_IFSHM = 0000240000 162 S_IFBOUNDSOCK = 0000230000 163 S_IFSOCKADDR = 0000220000 164 S_IFDSOCK = 0000210000 165 166 S_IFSOCK = 0000140000 167 S_IFLNK = 0000120000 168 S_IFREG = 0000100000 169 S_IFBLK = 0000060000 170 S_IFDIR = 0000040000 171 S_IFCHR = 0000020000 172 S_IFIFO = 0000010000 173 174 S_UNSUP = 0000370000 175 176 S_ISUID = 0004000 177 S_ISGID = 0002000 178 S_ISVTX = 0001000 179 180 S_IREAD = 0400 181 S_IWRITE = 0200 182 S_IEXEC = 0100 183 184 S_IRWXU = 0700 185 S_IRUSR = 0400 186 S_IWUSR = 0200 187 S_IXUSR = 0100 188 189 S_IRWXG = 070 190 S_IRGRP = 040 191 S_IWGRP = 020 192 S_IXGRP = 010 193 194 S_IRWXO = 07 195 S_IROTH = 04 196 S_IWOTH = 02 197 S_IXOTH = 01 198 ) 199 200 // native_client/src/trusted/service_runtime/include/sys/stat.h 201 // native_client/src/trusted/service_runtime/include/machine/_types.h 202 type Stat_t struct { 203 Dev int64 204 Ino uint64 205 Mode uint32 206 Nlink uint32 207 Uid uint32 208 Gid uint32 209 Rdev int64 210 Size int64 211 Blksize int32 212 Blocks int32 213 Atime int64 214 AtimeNsec int64 215 Mtime int64 216 MtimeNsec int64 217 Ctime int64 218 CtimeNsec int64 219 } 220 221 // Processes 222 // Not supported on NaCl - just enough for package os. 223 224 var ForkLock sync.RWMutex 225 226 type WaitStatus uint32 227 228 func (w WaitStatus) Exited() bool { return false } 229 func (w WaitStatus) ExitStatus() int { return 0 } 230 func (w WaitStatus) Signaled() bool { return false } 231 func (w WaitStatus) Signal() Signal { return 0 } 232 func (w WaitStatus) CoreDump() bool { return false } 233 func (w WaitStatus) Stopped() bool { return false } 234 func (w WaitStatus) Continued() bool { return false } 235 func (w WaitStatus) StopSignal() Signal { return 0 } 236 func (w WaitStatus) TrapCause() int { return 0 } 237 238 // XXX made up 239 type Rusage struct { 240 Utime Timeval 241 Stime Timeval 242 } 243 244 // XXX made up 245 type ProcAttr struct { 246 Dir string 247 Env []string 248 Files []uintptr 249 Sys *SysProcAttr 250 } 251 252 type SysProcAttr struct { 253 } 254 255 // System 256 257 func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) 258 func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { return 0, 0, ENOSYS } 259 func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { return 0, 0, ENOSYS } 260 func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { 261 return 0, 0, ENOSYS 262 } 263 264 func Sysctl(key string) (string, error) { 265 if key == "kern.hostname" { 266 return "naclbox", nil 267 } 268 return "", ENOSYS 269 } 270 271 // Unimplemented Unix midden heap. 272 273 const ImplementsGetwd = false 274 275 func Getwd() (wd string, err error) { return "", ENOSYS } 276 func Getegid() int { return 1 } 277 func Geteuid() int { return 1 } 278 func Getgid() int { return 1 } 279 func Getgroups() ([]int, error) { return []int{1}, nil } 280 func Getppid() int { return 2 } 281 func Getpid() int { return 3 } 282 func Gettimeofday(tv *Timeval) error { return ENOSYS } 283 func Getuid() int { return 1 } 284 func Kill(pid int, signum Signal) error { return ENOSYS } 285 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { 286 return 0, ENOSYS 287 } 288 func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) { 289 return 0, 0, ENOSYS 290 } 291 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { 292 return 0, ENOSYS 293 } 294 func RouteRIB(facility, param int) ([]byte, error) { return nil, ENOSYS } 295 func ParseRoutingMessage(b []byte) ([]RoutingMessage, error) { return nil, ENOSYS } 296 func ParseRoutingSockaddr(msg RoutingMessage) ([]Sockaddr, error) { return nil, ENOSYS } 297 func SysctlUint32(name string) (value uint32, err error) { return 0, ENOSYS } 298 299 type Iovec struct{} // dummy