github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/syscall/syscall_js.go (about) 1 // Copyright 2018 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 //go:build js && wasm 6 // +build js,wasm 7 8 package syscall 9 10 import ( 11 "internal/itoa" 12 "internal/oserror" 13 "sync" 14 "unsafe" 15 ) 16 17 const direntSize = 8 + 8 + 2 + 256 18 19 type Dirent struct { 20 Reclen uint16 21 Name [256]byte 22 } 23 24 func direntIno(buf []byte) (uint64, bool) { 25 return 1, true 26 } 27 28 func direntReclen(buf []byte) (uint64, bool) { 29 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) 30 } 31 32 func direntNamlen(buf []byte) (uint64, bool) { 33 reclen, ok := direntReclen(buf) 34 if !ok { 35 return 0, false 36 } 37 return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true 38 } 39 40 const PathMax = 256 41 42 // An Errno is an unsigned number describing an error condition. 43 // It implements the error interface. The zero Errno is by convention 44 // a non-error, so code to convert from Errno to error should use: 45 // err = nil 46 // if errno != 0 { 47 // err = errno 48 // } 49 // 50 // Errno values can be tested against error values from the os package 51 // using errors.Is. For example: 52 // 53 // _, _, err := syscall.Syscall(...) 54 // if errors.Is(err, fs.ErrNotExist) ... 55 type Errno uintptr 56 57 func (e Errno) Error() string { 58 if 0 <= int(e) && int(e) < len(errorstr) { 59 s := errorstr[e] 60 if s != "" { 61 return s 62 } 63 } 64 return "errno " + itoa.Itoa(int(e)) 65 } 66 67 func (e Errno) Is(target error) bool { 68 switch target { 69 case oserror.ErrPermission: 70 return e == EACCES || e == EPERM 71 case oserror.ErrExist: 72 return e == EEXIST || e == ENOTEMPTY 73 case oserror.ErrNotExist: 74 return e == ENOENT 75 } 76 return false 77 } 78 79 func (e Errno) Temporary() bool { 80 return e == EINTR || e == EMFILE || e.Timeout() 81 } 82 83 func (e Errno) Timeout() bool { 84 return e == EAGAIN || e == EWOULDBLOCK || e == ETIMEDOUT 85 } 86 87 // A Signal is a number describing a process signal. 88 // It implements the os.Signal interface. 89 type Signal int 90 91 const ( 92 _ Signal = iota 93 SIGCHLD 94 SIGINT 95 SIGKILL 96 SIGTRAP 97 SIGQUIT 98 SIGTERM 99 ) 100 101 func (s Signal) Signal() {} 102 103 func (s Signal) String() string { 104 if 0 <= s && int(s) < len(signals) { 105 str := signals[s] 106 if str != "" { 107 return str 108 } 109 } 110 return "signal " + itoa.Itoa(int(s)) 111 } 112 113 var signals = [...]string{} 114 115 // File system 116 117 const ( 118 Stdin = 0 119 Stdout = 1 120 Stderr = 2 121 ) 122 123 const ( 124 O_RDONLY = 0 125 O_WRONLY = 1 126 O_RDWR = 2 127 128 O_CREAT = 0100 129 O_CREATE = O_CREAT 130 O_TRUNC = 01000 131 O_APPEND = 02000 132 O_EXCL = 0200 133 O_SYNC = 010000 134 135 O_CLOEXEC = 0 136 ) 137 138 const ( 139 F_DUPFD = 0 140 F_GETFD = 1 141 F_SETFD = 2 142 F_GETFL = 3 143 F_SETFL = 4 144 F_GETOWN = 5 145 F_SETOWN = 6 146 F_GETLK = 7 147 F_SETLK = 8 148 F_SETLKW = 9 149 F_RGETLK = 10 150 F_RSETLK = 11 151 F_CNVT = 12 152 F_RSETLKW = 13 153 154 F_RDLCK = 1 155 F_WRLCK = 2 156 F_UNLCK = 3 157 F_UNLKSYS = 4 158 ) 159 160 const ( 161 S_IFMT = 0000370000 162 S_IFSHM_SYSV = 0000300000 163 S_IFSEMA = 0000270000 164 S_IFCOND = 0000260000 165 S_IFMUTEX = 0000250000 166 S_IFSHM = 0000240000 167 S_IFBOUNDSOCK = 0000230000 168 S_IFSOCKADDR = 0000220000 169 S_IFDSOCK = 0000210000 170 171 S_IFSOCK = 0000140000 172 S_IFLNK = 0000120000 173 S_IFREG = 0000100000 174 S_IFBLK = 0000060000 175 S_IFDIR = 0000040000 176 S_IFCHR = 0000020000 177 S_IFIFO = 0000010000 178 179 S_UNSUP = 0000370000 180 181 S_ISUID = 0004000 182 S_ISGID = 0002000 183 S_ISVTX = 0001000 184 185 S_IREAD = 0400 186 S_IWRITE = 0200 187 S_IEXEC = 0100 188 189 S_IRWXU = 0700 190 S_IRUSR = 0400 191 S_IWUSR = 0200 192 S_IXUSR = 0100 193 194 S_IRWXG = 070 195 S_IRGRP = 040 196 S_IWGRP = 020 197 S_IXGRP = 010 198 199 S_IRWXO = 07 200 S_IROTH = 04 201 S_IWOTH = 02 202 S_IXOTH = 01 203 ) 204 205 type Stat_t struct { 206 Dev int64 207 Ino uint64 208 Mode uint32 209 Nlink uint32 210 Uid uint32 211 Gid uint32 212 Rdev int64 213 Size int64 214 Blksize int32 215 Blocks int32 216 Atime int64 217 AtimeNsec int64 218 Mtime int64 219 MtimeNsec int64 220 Ctime int64 221 CtimeNsec int64 222 } 223 224 // Processes 225 // Not supported - just enough for package os. 226 227 var ForkLock sync.RWMutex 228 229 type WaitStatus uint32 230 231 func (w WaitStatus) Exited() bool { return false } 232 func (w WaitStatus) ExitStatus() int { return 0 } 233 func (w WaitStatus) Signaled() bool { return false } 234 func (w WaitStatus) Signal() Signal { return 0 } 235 func (w WaitStatus) CoreDump() bool { return false } 236 func (w WaitStatus) Stopped() bool { return false } 237 func (w WaitStatus) Continued() bool { return false } 238 func (w WaitStatus) StopSignal() Signal { return 0 } 239 func (w WaitStatus) TrapCause() int { return 0 } 240 241 // XXX made up 242 type Rusage struct { 243 Utime Timeval 244 Stime Timeval 245 } 246 247 // XXX made up 248 type ProcAttr struct { 249 Dir string 250 Env []string 251 Files []uintptr 252 Sys *SysProcAttr 253 } 254 255 type SysProcAttr struct { 256 } 257 258 func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { 259 return 0, 0, ENOSYS 260 } 261 262 func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { 263 return 0, 0, ENOSYS 264 } 265 266 func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { 267 return 0, 0, ENOSYS 268 } 269 270 func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { 271 return 0, 0, ENOSYS 272 } 273 274 func Sysctl(key string) (string, error) { 275 if key == "kern.hostname" { 276 return "js", nil 277 } 278 return "", ENOSYS 279 } 280 281 const ImplementsGetwd = true 282 283 func Getwd() (wd string, err error) { 284 var buf [PathMax]byte 285 n, err := Getcwd(buf[0:]) 286 if err != nil { 287 return "", err 288 } 289 return string(buf[:n]), nil 290 } 291 292 func Getuid() int { 293 return jsProcess.Call("getuid").Int() 294 } 295 296 func Getgid() int { 297 return jsProcess.Call("getgid").Int() 298 } 299 300 func Geteuid() int { 301 return jsProcess.Call("geteuid").Int() 302 } 303 304 func Getegid() int { 305 return jsProcess.Call("getegid").Int() 306 } 307 308 func Getgroups() (groups []int, err error) { 309 defer recoverErr(&err) 310 array := jsProcess.Call("getgroups") 311 groups = make([]int, array.Length()) 312 for i := range groups { 313 groups[i] = array.Index(i).Int() 314 } 315 return groups, nil 316 } 317 318 func Getpid() int { 319 return jsProcess.Get("pid").Int() 320 } 321 322 func Getppid() int { 323 return jsProcess.Get("ppid").Int() 324 } 325 326 func Umask(mask int) (oldmask int) { 327 return jsProcess.Call("umask", mask).Int() 328 } 329 330 func Gettimeofday(tv *Timeval) error { return ENOSYS } 331 332 func Kill(pid int, signum Signal) error { return ENOSYS } 333 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { 334 return 0, ENOSYS 335 } 336 func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) { 337 return 0, 0, ENOSYS 338 } 339 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { 340 return 0, ENOSYS 341 } 342 343 type Iovec struct{} // dummy 344 345 type Timespec struct { 346 Sec int64 347 Nsec int64 348 } 349 350 type Timeval struct { 351 Sec int64 352 Usec int64 353 } 354 355 func setTimespec(sec, nsec int64) Timespec { 356 return Timespec{Sec: sec, Nsec: nsec} 357 } 358 359 func setTimeval(sec, usec int64) Timeval { 360 return Timeval{Sec: sec, Usec: usec} 361 }