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