Source file src/syscall/syscall_js.go

Documentation: syscall

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

View as plain text