// Copyright 2009 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.
// Native Client system calls.
package syscall
const OS = "nacl"
// Auto-generated
//sys Chmod(path string, mode int) (errno int)
//sys Clock() (clock int)
//sys Close(fd int) (errno int)
//sys Exit(code int)
//sys Fstat(fd int, stat *Stat_t) (errno int)
//sys Getdents(fd int, buf []byte) (n int, errno int)
//sys Getpid() (pid int)
//sys Gettimeofday(tv *Timeval) (errno int)
//sys Open(path string, mode int, perm int) (fd int, errno int)
//sys Read(fd int, p []byte) (n int, errno int)
//sys read(fd int, buf *byte, nbuf int) (n int, errno int)
//sys Stat(path string, stat *Stat_t) (errno int)
//sys Write(fd int, p []byte) (n int, errno int)
//sys MultimediaInit(subsys int) (errno int)
//sys MultimediaShutdown() (errno int)
//sys CondCreate() (cv int, errno int)
//sys CondWait(cv int, mutex int) (errno int)
//sys CondSignal(cv int) (errno int)
//sys CondBroadcast(cv int) (errno int)
//sys CondTimedWaitAbs(cv int, mutex int, abstime *Timespec) (errno int)
//sys MutexCreate() (mutex int, errno int)
//sys MutexLock(mutex int) (errno int)
//sys MutexUnlock(mutex int) (errno int)
//sys MutexTryLock(mutex int) (errno int) = SYS_MUTEX_TRYLOCK
//sys SemCreate() (sema int, errno int)
//sys SemWait(sema int) (errno int)
//sys SemPost(sema int) (errno int)
//sys VideoInit(dx int, dy int) (errno int)
//sys VideoUpdate(data *uint32) (errno int)
//sys VideoPollEvent(ev *byte) (errno int)
//sys VideoShutdown() (errno int)
//sys AudioInit(fmt int, nreq int, data *int) (errno int)
//sys AudioShutdown() (errno int)
//sys AudioStream(data *uint16, size *uintptr) (errno int)
// Hand-written
func Seek(fd int, offset int64, whence int) (newoffset int64, errno int) {
// Offset passed to system call is 32 bits. Failure of vision by NaCl.
if int64(int32(offset)) != offset {
return 0, ERANGE
}
o, _, e := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence));
return int64(o), int(e);
}
// Sleep by waiting on a condition variable that will never be signaled.
// TODO(rsc): Replace when NaCl adds a proper sleep system call.
var tcv, tmu int
func init() {
tmu, _ = MutexCreate();
tcv, _ = CondCreate();
}
func Sleep(ns int64) (errno int) {
ts := NsecToTimespec(ns);
var tv Timeval;
if errno = Gettimeofday(&tv); errno != 0 {
return
}
ts.Sec += tv.Sec;
ts.Nsec += tv.Usec * 1000;
switch {
case ts.Nsec >= 1e9:
ts.Nsec -= 1e9;
ts.Sec++;
case ts.Nsec <= -1e9:
ts.Nsec += 1e9;
ts.Sec--;
}
if errno = MutexLock(tmu); errno != 0 {
return
}
errno = CondTimedWaitAbs(tcv, tmu, &ts);
if e := MutexUnlock(tmu); e != 0 && errno == 0 {
errno = e
}
return;
}
// Implemented in NaCl but not here; maybe later:
// SYS_IOCTL
// SYS_IMC_*
// SYS_MMAP ???
// SYS_SRPC_*
// SYS_SYSCONF
// Implemented in NaCl but not here; used by runtime instead:
// SYS_SYSBRK
// SYS_MMAP
// SYS_MUNMAP
// SYS_THREAD_*
// SYS_TLS_*
// SYS_SCHED_YIELD
// Not implemented in NaCl but needed to compile other packages.
const (
SIGTRAP = 5;
)
func Pipe(p []int) (errno int) { return ENACL }
func fcntl(fd, cmd, arg int) (val int, errno int) {
return 0, ENACL
}
func Pread(fd int, p []byte, offset int64) (n int, errno int) {
return 0, ENACL
}
func Pwrite(fd int, p []byte, offset int64) (n int, errno int) {
return 0, ENACL
}
func Mkdir(path string, mode int) (errno int) { return ENACL }
func Lstat(path string, stat *Stat_t) (errno int) {
return ENACL
}
func Chdir(path string) (errno int) { return ENACL }
func Fchdir(fd int) (errno int) { return ENACL }
func Unlink(path string) (errno int) { return ENACL }
func Rmdir(path string) (errno int) { return ENACL }
func Link(oldpath, newpath string) (errno int) {
return ENACL
}
func Symlink(path, link string) (errno int) { return ENACL }
func Readlink(path string, buf []byte) (n int, errno int) {
return 0, ENACL
}
func Rename(oldpath, newpath string) (errno int) {
return ENACL
}
func Fchmod(fd int, mode int) (errno int) { return ENACL }
func Chown(path string, uid int, gid int) (errno int) {
return ENACL
}
func Lchown(path string, uid int, gid int) (errno int) {
return ENACL
}
func Fchown(fd int, uid int, gid int) (errno int) {
return ENACL
}
func Truncate(name string, size int64) (errno int) {
return ENACL
}
func Ftruncate(fd int, length int64) (errno int) {
return ENACL
}
// NaCL doesn't actually implement Getwd, but it also
// don't implement Chdir, so the fallback algorithm
// fails worse than calling Getwd does.
const ImplementsGetwd = true
func Getwd() (wd string, errno int) { return "", ENACL }
func Getuid() (uid int) { return -1 }
func Geteuid() (euid int) { return -1 }
func Getgid() (gid int) { return -1 }
func Getegid() (egid int) { return -1 }
func Getppid() (ppid int) { return -1 }
func Getgroups() (gids []int, errno int) { return nil, ENACL }
type Sockaddr interface {
sockaddr();
}
type SockaddrInet4 struct {
Port int;
Addr [4]byte;
}
func (*SockaddrInet4) sockaddr() {}
type SockaddrInet6 struct {
Port int;
Addr [16]byte;
}
func (*SockaddrInet6) sockaddr() {}
type SockaddrUnix struct {
Name string;
}
func (*SockaddrUnix) sockaddr() {}
const (
AF_INET = 1 + iota;
AF_INET6;
AF_UNIX;
IPPROTO_TCP;
SOCK_DGRAM;
SOCK_STREAM;
SOL_SOCKET;
SOMAXCONN;
SO_DONTROUTE;
SO_KEEPALIVE;
SO_LINGER;
SO_RCVBUF;
SO_REUSEADDR;
SO_SNDBUF;
TCP_NODELAY;
WNOHANG;
WSTOPPED;
PTRACE_TRACEME;
SO_BROADCAST = 0;
SHUT_RDWR = 0;
)
func Accept(fd int) (nfd int, sa Sockaddr, errno int) {
return 0, nil, ENACL
}
func Getsockname(fd int) (sa Sockaddr, errno int) {
return nil, ENACL
}
func Getpeername(fd int) (sa Sockaddr, errno int) {
return nil, ENACL
}
func Bind(fd int, sa Sockaddr) (errno int) { return ENACL }
func Connect(fd int, sa Sockaddr) (errno int) { return ENACL }
func Socket(domain, typ, proto int) (fd, errno int) {
return 0, ENACL
}
func SetsockoptInt(fd, level, opt int, value int) (errno int) {
return ENACL
}
func Shutdown(fd, how int) (errno int) { return ENACL }
func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, errno int) {
return 0, nil, ENACL
}
func Sendto(fd int, p []byte, flags int, to Sockaddr) (errno int) {
return ENACL
}
func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (errno int) {
return ENACL
}
type Linger struct {
Onoff int32;
Linger int32;
}
func SetsockoptLinger(fd, level, opt int, l *Linger) (errno int) {
return ENACL
}
func Listen(s int, n int) (errno int) { return ENACL }
type Rusage struct {
Utime Timeval;
Stime Timeval;
Maxrss int32;
Ixrss int32;
Idrss int32;
Isrss int32;
Minflt int32;
Majflt int32;
Nswap int32;
Inblock int32;
Oublock int32;
Msgsnd int32;
Msgrcv int32;
Nsignals int32;
Nvcsw int32;
Nivcsw int32;
}
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
return 0, ENACL
}
type WaitStatus uint32
func (WaitStatus) Exited() bool { return false }
func (WaitStatus) ExitStatus() int { return -1 }
func (WaitStatus) Signal() int { return -1 }
func (WaitStatus) CoreDump() bool { return false }
func (WaitStatus) Stopped() bool { return false }
func (WaitStatus) Continued() bool { return false }
func (WaitStatus) StopSignal() int { return -1 }
func (WaitStatus) Signaled() bool { return false }
func (WaitStatus) TrapCause() int { return -1 }
|