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