summaryrefslogtreecommitdiff
path: root/src/pkg/syscall/syscall_nacl.go
blob: 3efea2e961e85a726d8810e4fae1ce0c11deed9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
// 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 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;
)

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 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;
}