2016-03-01 15:57:46 -07:00
|
|
|
// Copyright 2013 The Go Authors. All rights reserved.
|
all: merge NaCl branch (part 1)
See golang.org/s/go13nacl for design overview.
This CL is the mostly mechanical changes from rsc's Go 1.2 based NaCl branch, specifically 39cb35750369 to 500771b477cf from https://code.google.com/r/rsc-go13nacl. This CL does not include working NaCl support, there are probably two or three more large merges to come.
CL 15750044 is not included as it involves more invasive changes to the linker which will need to be merged separately.
The exact change lists included are
15050047: syscall: support for Native Client
15360044: syscall: unzip implementation for Native Client
15370044: syscall: Native Client SRPC implementation
15400047: cmd/dist, cmd/go, go/build, test: support for Native Client
15410048: runtime: support for Native Client
15410049: syscall: file descriptor table for Native Client
15410050: syscall: in-memory file system for Native Client
15440048: all: update +build lines for Native Client port
15540045: cmd/6g, cmd/8g, cmd/gc: support for Native Client
15570045: os: support for Native Client
15680044: crypto/..., hash/crc32, reflect, sync/atomic: support for amd64p32
15690044: net: support for Native Client
15690048: runtime: support for fake time like on Go Playground
15690051: build: disable various tests on Native Client
LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/68150047
2014-02-25 07:47:42 -07:00
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package syscall
|
|
|
|
|
|
|
|
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
|
2014-12-18 01:26:08 -07:00
|
|
|
//sys naclGetRandomBytes(b []byte) (err error) = sys_get_random_bytes
|
all: merge NaCl branch (part 1)
See golang.org/s/go13nacl for design overview.
This CL is the mostly mechanical changes from rsc's Go 1.2 based NaCl branch, specifically 39cb35750369 to 500771b477cf from https://code.google.com/r/rsc-go13nacl. This CL does not include working NaCl support, there are probably two or three more large merges to come.
CL 15750044 is not included as it involves more invasive changes to the linker which will need to be merged separately.
The exact change lists included are
15050047: syscall: support for Native Client
15360044: syscall: unzip implementation for Native Client
15370044: syscall: Native Client SRPC implementation
15400047: cmd/dist, cmd/go, go/build, test: support for Native Client
15410048: runtime: support for Native Client
15410049: syscall: file descriptor table for Native Client
15410050: syscall: in-memory file system for Native Client
15440048: all: update +build lines for Native Client port
15540045: cmd/6g, cmd/8g, cmd/gc: support for Native Client
15570045: os: support for Native Client
15680044: crypto/..., hash/crc32, reflect, sync/atomic: support for amd64p32
15690044: net: support for Native Client
15690048: runtime: support for fake time like on Go Playground
15690051: build: disable various tests on Native Client
LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/68150047
2014-02-25 07:47:42 -07:00
|
|
|
|
|
|
|
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.
|
2016-03-01 16:21:55 -07:00
|
|
|
// It implements the error interface. The zero Errno is by convention
|
all: merge NaCl branch (part 1)
See golang.org/s/go13nacl for design overview.
This CL is the mostly mechanical changes from rsc's Go 1.2 based NaCl branch, specifically 39cb35750369 to 500771b477cf from https://code.google.com/r/rsc-go13nacl. This CL does not include working NaCl support, there are probably two or three more large merges to come.
CL 15750044 is not included as it involves more invasive changes to the linker which will need to be merged separately.
The exact change lists included are
15050047: syscall: support for Native Client
15360044: syscall: unzip implementation for Native Client
15370044: syscall: Native Client SRPC implementation
15400047: cmd/dist, cmd/go, go/build, test: support for Native Client
15410048: runtime: support for Native Client
15410049: syscall: file descriptor table for Native Client
15410050: syscall: in-memory file system for Native Client
15440048: all: update +build lines for Native Client port
15540045: cmd/6g, cmd/8g, cmd/gc: support for Native Client
15570045: os: support for Native Client
15680044: crypto/..., hash/crc32, reflect, sync/atomic: support for amd64p32
15690044: net: support for Native Client
15690048: runtime: support for fake time like on Go Playground
15690051: build: disable various tests on Native Client
LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/68150047
2014-02-25 07:47:42 -07:00
|
|
|
// 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 }
|