| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- // Copyright 2013 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package unix
- import (
- "sync"
- "unsafe"
- )
- //sys naclClose(fd int) (err error) = sys_close
- //sys Exit(code int) (err error)
- //sys naclFstat(fd int, stat *Stat_t) (err error) = sys_fstat
- //sys naclRead(fd int, b []byte) (n int, err error) = sys_read
- //sys naclSeek(fd int, off *int64, whence int) (err error) = sys_lseek
- const direntSize = 8 + 8 + 2 + 256
- // native_client/src/trusted/service_runtime/include/sys/dirent.h
- type Dirent struct {
- Ino int64
- Off int64
- Reclen uint16
- Name [256]byte
- }
- func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {
- origlen := len(buf)
- count = 0
- for max != 0 && len(buf) > 0 {
- dirent := (*Dirent)(unsafe.Pointer(&buf[0]))
- buf = buf[dirent.Reclen:]
- if dirent.Ino == 0 { // File absent in directory.
- continue
- }
- bytes := (*[512 + PathMax]byte)(unsafe.Pointer(&dirent.Name[0]))
- var name = string(bytes[0:clen(bytes[:])])
- if name == "." || name == ".." { // Useless names
- continue
- }
- max--
- count++
- names = append(names, name)
- }
- return origlen - len(buf), count, names
- }
- func clen(n []byte) int {
- for i := 0; i < len(n); i++ {
- if n[i] == 0 {
- return i
- }
- }
- return len(n)
- }
- const PathMax = 256
- // An Errno is an unsigned number describing an error condition.
- // It implements the error interface. The zero Errno is by convention
- // a non-error, so code to convert from Errno to error should use:
- // err = nil
- // if errno != 0 {
- // err = errno
- // }
- type Errno uintptr
- func (e Errno) Error() string {
- if 0 <= int(e) && int(e) < len(errorstr) {
- s := errorstr[e]
- if s != "" {
- return s
- }
- }
- return "errno " + itoa(int(e))
- }
- func (e Errno) Temporary() bool {
- return e == EINTR || e == EMFILE || e.Timeout()
- }
- func (e Errno) Timeout() bool {
- return e == EAGAIN || e == EWOULDBLOCK || e == ETIMEDOUT
- }
- // A Signal is a number describing a process signal.
- // It implements the os.Signal interface.
- type Signal int
- const (
- _ Signal = iota
- SIGCHLD
- SIGINT
- SIGKILL
- SIGTRAP
- SIGQUIT
- )
- func (s Signal) Signal() {}
- func (s Signal) String() string {
- if 0 <= s && int(s) < len(signals) {
- str := signals[s]
- if str != "" {
- return str
- }
- }
- return "signal " + itoa(int(s))
- }
- var signals = [...]string{}
- // File system
- const (
- Stdin = 0
- Stdout = 1
- Stderr = 2
- )
- // native_client/src/trusted/service_runtime/include/sys/fcntl.h
- const (
- O_RDONLY = 0
- O_WRONLY = 1
- O_RDWR = 2
- O_ACCMODE = 3
- O_CREAT = 0100
- O_CREATE = O_CREAT // for ken
- O_TRUNC = 01000
- O_APPEND = 02000
- O_EXCL = 0200
- O_NONBLOCK = 04000
- O_NDELAY = O_NONBLOCK
- O_SYNC = 010000
- O_FSYNC = O_SYNC
- O_ASYNC = 020000
- O_CLOEXEC = 0
- FD_CLOEXEC = 1
- )
- // native_client/src/trusted/service_runtime/include/sys/fcntl.h
- const (
- F_DUPFD = 0
- F_GETFD = 1
- F_SETFD = 2
- F_GETFL = 3
- F_SETFL = 4
- F_GETOWN = 5
- F_SETOWN = 6
- F_GETLK = 7
- F_SETLK = 8
- F_SETLKW = 9
- F_RGETLK = 10
- F_RSETLK = 11
- F_CNVT = 12
- F_RSETLKW = 13
- F_RDLCK = 1
- F_WRLCK = 2
- F_UNLCK = 3
- F_UNLKSYS = 4
- )
- // native_client/src/trusted/service_runtime/include/bits/stat.h
- const (
- S_IFMT = 0000370000
- S_IFSHM_SYSV = 0000300000
- S_IFSEMA = 0000270000
- S_IFCOND = 0000260000
- S_IFMUTEX = 0000250000
- S_IFSHM = 0000240000
- S_IFBOUNDSOCK = 0000230000
- S_IFSOCKADDR = 0000220000
- S_IFDSOCK = 0000210000
- S_IFSOCK = 0000140000
- S_IFLNK = 0000120000
- S_IFREG = 0000100000
- S_IFBLK = 0000060000
- S_IFDIR = 0000040000
- S_IFCHR = 0000020000
- S_IFIFO = 0000010000
- S_UNSUP = 0000370000
- S_ISUID = 0004000
- S_ISGID = 0002000
- S_ISVTX = 0001000
- S_IREAD = 0400
- S_IWRITE = 0200
- S_IEXEC = 0100
- S_IRWXU = 0700
- S_IRUSR = 0400
- S_IWUSR = 0200
- S_IXUSR = 0100
- S_IRWXG = 070
- S_IRGRP = 040
- S_IWGRP = 020
- S_IXGRP = 010
- S_IRWXO = 07
- S_IROTH = 04
- S_IWOTH = 02
- S_IXOTH = 01
- )
- // native_client/src/trusted/service_runtime/include/sys/stat.h
- // native_client/src/trusted/service_runtime/include/machine/_types.h
- type Stat_t struct {
- Dev int64
- Ino uint64
- Mode uint32
- Nlink uint32
- Uid uint32
- Gid uint32
- Rdev int64
- Size int64
- Blksize int32
- Blocks int32
- Atime int64
- AtimeNsec int64
- Mtime int64
- MtimeNsec int64
- Ctime int64
- CtimeNsec int64
- }
- // Processes
- // Not supported on NaCl - just enough for package os.
- var ForkLock sync.RWMutex
- type WaitStatus uint32
- func (w WaitStatus) Exited() bool { return false }
- func (w WaitStatus) ExitStatus() int { return 0 }
- func (w WaitStatus) Signaled() bool { return false }
- func (w WaitStatus) Signal() Signal { return 0 }
- func (w WaitStatus) CoreDump() bool { return false }
- func (w WaitStatus) Stopped() bool { return false }
- func (w WaitStatus) Continued() bool { return false }
- func (w WaitStatus) StopSignal() Signal { return 0 }
- func (w WaitStatus) TrapCause() int { return 0 }
- // XXX made up
- type Rusage struct {
- Utime Timeval
- Stime Timeval
- }
- // XXX made up
- type ProcAttr struct {
- Dir string
- Env []string
- Files []uintptr
- Sys *SysProcAttr
- }
- type SysProcAttr struct {
- }
- // System
- func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
- func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { return 0, 0, ENOSYS }
- func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { return 0, 0, ENOSYS }
- func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
- return 0, 0, ENOSYS
- }
- func Sysctl(key string) (string, error) {
- if key == "kern.hostname" {
- return "naclbox", nil
- }
- return "", ENOSYS
- }
- // Unimplemented Unix midden heap.
- const ImplementsGetwd = false
- func Getwd() (wd string, err error) { return "", ENOSYS }
- func Getegid() int { return 1 }
- func Geteuid() int { return 1 }
- func Getgid() int { return 1 }
- func Getgroups() ([]int, error) { return []int{1}, nil }
- func Getpagesize() int { return 65536 }
- func Getppid() int { return 2 }
- func Getpid() int { return 3 }
- func Getuid() int { return 1 }
- func Kill(pid int, signum Signal) error { return ENOSYS }
- func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
- return 0, ENOSYS
- }
- func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) {
- return 0, 0, ENOSYS
- }
- func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
- return 0, ENOSYS
- }
- func RouteRIB(facility, param int) ([]byte, error) { return nil, ENOSYS }
- func ParseRoutingMessage(b []byte) ([]RoutingMessage, error) { return nil, ENOSYS }
- func ParseRoutingSockaddr(msg RoutingMessage) ([]Sockaddr, error) { return nil, ENOSYS }
- func SysctlUint32(name string) (value uint32, err error) { return 0, ENOSYS }
|