blob: e12966845914ee853707e19649b3a42beab98ec0 [file] [log] [blame]
David K. Bainbridge215e0242017-09-05 23:18:24 -07001// Copyright 2009,2010 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
5// NetBSD system calls.
6// This file is compiled as ordinary Go code,
7// but it is also input to mksyscall,
8// which parses the //sys lines and generates system call stubs.
9// Note that sometimes we use a lowercase //sys name and wrap
10// it in our own nicer implementation, either here or in
11// syscall_bsd.go or syscall_unix.go.
12
13package unix
14
15import (
16 "syscall"
17 "unsafe"
18)
19
20type SockaddrDatalink struct {
21 Len uint8
22 Family uint8
23 Index uint16
24 Type uint8
25 Nlen uint8
26 Alen uint8
27 Slen uint8
28 Data [12]int8
29 raw RawSockaddrDatalink
30}
31
32func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
33
34func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {
35 var olen uintptr
36
37 // Get a list of all sysctl nodes below the given MIB by performing
38 // a sysctl for the given MIB with CTL_QUERY appended.
39 mib = append(mib, CTL_QUERY)
40 qnode := Sysctlnode{Flags: SYSCTL_VERS_1}
41 qp := (*byte)(unsafe.Pointer(&qnode))
42 sz := unsafe.Sizeof(qnode)
43 if err = sysctl(mib, nil, &olen, qp, sz); err != nil {
44 return nil, err
45 }
46
47 // Now that we know the size, get the actual nodes.
48 nodes = make([]Sysctlnode, olen/sz)
49 np := (*byte)(unsafe.Pointer(&nodes[0]))
50 if err = sysctl(mib, np, &olen, qp, sz); err != nil {
51 return nil, err
52 }
53
54 return nodes, nil
55}
56
57func nametomib(name string) (mib []_C_int, err error) {
58
59 // Split name into components.
60 var parts []string
61 last := 0
62 for i := 0; i < len(name); i++ {
63 if name[i] == '.' {
64 parts = append(parts, name[last:i])
65 last = i + 1
66 }
67 }
68 parts = append(parts, name[last:])
69
70 // Discover the nodes and construct the MIB OID.
71 for partno, part := range parts {
72 nodes, err := sysctlNodes(mib)
73 if err != nil {
74 return nil, err
75 }
76 for _, node := range nodes {
77 n := make([]byte, 0)
78 for i := range node.Name {
79 if node.Name[i] != 0 {
80 n = append(n, byte(node.Name[i]))
81 }
82 }
83 if string(n) == part {
84 mib = append(mib, _C_int(node.Num))
85 break
86 }
87 }
88 if len(mib) != partno+1 {
89 return nil, EINVAL
90 }
91 }
92
93 return mib, nil
94}
95
96func direntIno(buf []byte) (uint64, bool) {
97 return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))
98}
99
100func direntReclen(buf []byte) (uint64, bool) {
101 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
102}
103
104func direntNamlen(buf []byte) (uint64, bool) {
105 return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
106}
107
108//sysnb pipe() (fd1 int, fd2 int, err error)
109func Pipe(p []int) (err error) {
110 if len(p) != 2 {
111 return EINVAL
112 }
113 p[0], p[1], err = pipe()
114 return
115}
116
117//sys getdents(fd int, buf []byte) (n int, err error)
118func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
119 return getdents(fd, buf)
120}
121
122// TODO
123func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
124 return -1, ENOSYS
125}
126
127/*
128 * Exposed directly
129 */
130//sys Access(path string, mode uint32) (err error)
131//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
132//sys Chdir(path string) (err error)
133//sys Chflags(path string, flags int) (err error)
134//sys Chmod(path string, mode uint32) (err error)
135//sys Chown(path string, uid int, gid int) (err error)
136//sys Chroot(path string) (err error)
137//sys Close(fd int) (err error)
138//sys Dup(fd int) (nfd int, err error)
139//sys Dup2(from int, to int) (err error)
140//sys Exit(code int)
141//sys Fchdir(fd int) (err error)
142//sys Fchflags(fd int, flags int) (err error)
143//sys Fchmod(fd int, mode uint32) (err error)
144//sys Fchown(fd int, uid int, gid int) (err error)
145//sys Flock(fd int, how int) (err error)
146//sys Fpathconf(fd int, name int) (val int, err error)
147//sys Fstat(fd int, stat *Stat_t) (err error)
148//sys Fsync(fd int) (err error)
149//sys Ftruncate(fd int, length int64) (err error)
150//sysnb Getegid() (egid int)
151//sysnb Geteuid() (uid int)
152//sysnb Getgid() (gid int)
153//sysnb Getpgid(pid int) (pgid int, err error)
154//sysnb Getpgrp() (pgrp int)
155//sysnb Getpid() (pid int)
156//sysnb Getppid() (ppid int)
157//sys Getpriority(which int, who int) (prio int, err error)
158//sysnb Getrlimit(which int, lim *Rlimit) (err error)
159//sysnb Getrusage(who int, rusage *Rusage) (err error)
160//sysnb Getsid(pid int) (sid int, err error)
161//sysnb Gettimeofday(tv *Timeval) (err error)
162//sysnb Getuid() (uid int)
163//sys Issetugid() (tainted bool)
164//sys Kill(pid int, signum syscall.Signal) (err error)
165//sys Kqueue() (fd int, err error)
166//sys Lchown(path string, uid int, gid int) (err error)
167//sys Link(path string, link string) (err error)
168//sys Listen(s int, backlog int) (err error)
169//sys Lstat(path string, stat *Stat_t) (err error)
170//sys Mkdir(path string, mode uint32) (err error)
171//sys Mkfifo(path string, mode uint32) (err error)
172//sys Mknod(path string, mode uint32, dev int) (err error)
173//sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
174//sys Open(path string, mode int, perm uint32) (fd int, err error)
175//sys Pathconf(path string, name int) (val int, err error)
176//sys Pread(fd int, p []byte, offset int64) (n int, err error)
177//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
178//sys read(fd int, p []byte) (n int, err error)
179//sys Readlink(path string, buf []byte) (n int, err error)
180//sys Rename(from string, to string) (err error)
181//sys Revoke(path string) (err error)
182//sys Rmdir(path string) (err error)
183//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
184//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
185//sysnb Setegid(egid int) (err error)
186//sysnb Seteuid(euid int) (err error)
187//sysnb Setgid(gid int) (err error)
188//sysnb Setpgid(pid int, pgid int) (err error)
189//sys Setpriority(which int, who int, prio int) (err error)
190//sysnb Setregid(rgid int, egid int) (err error)
191//sysnb Setreuid(ruid int, euid int) (err error)
192//sysnb Setrlimit(which int, lim *Rlimit) (err error)
193//sysnb Setsid() (pid int, err error)
194//sysnb Settimeofday(tp *Timeval) (err error)
195//sysnb Setuid(uid int) (err error)
196//sys Stat(path string, stat *Stat_t) (err error)
197//sys Symlink(path string, link string) (err error)
198//sys Sync() (err error)
199//sys Truncate(path string, length int64) (err error)
200//sys Umask(newmask int) (oldmask int)
201//sys Unlink(path string) (err error)
202//sys Unmount(path string, flags int) (err error)
203//sys write(fd int, p []byte) (n int, err error)
204//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
205//sys munmap(addr uintptr, length uintptr) (err error)
206//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
207//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
208//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
209
210/*
211 * Unimplemented
212 */
213// ____semctl13
214// __clone
215// __fhopen40
216// __fhstat40
217// __fhstatvfs140
218// __fstat30
219// __getcwd
220// __getfh30
221// __getlogin
222// __lstat30
223// __mount50
224// __msgctl13
225// __msync13
226// __ntp_gettime30
227// __posix_chown
228// __posix_fadvise50
229// __posix_fchown
230// __posix_lchown
231// __posix_rename
232// __setlogin
233// __shmctl13
234// __sigaction_sigtramp
235// __sigaltstack14
236// __sigpending14
237// __sigprocmask14
238// __sigsuspend14
239// __sigtimedwait
240// __stat30
241// __syscall
242// __vfork14
243// _ksem_close
244// _ksem_destroy
245// _ksem_getvalue
246// _ksem_init
247// _ksem_open
248// _ksem_post
249// _ksem_trywait
250// _ksem_unlink
251// _ksem_wait
252// _lwp_continue
253// _lwp_create
254// _lwp_ctl
255// _lwp_detach
256// _lwp_exit
257// _lwp_getname
258// _lwp_getprivate
259// _lwp_kill
260// _lwp_park
261// _lwp_self
262// _lwp_setname
263// _lwp_setprivate
264// _lwp_suspend
265// _lwp_unpark
266// _lwp_unpark_all
267// _lwp_wait
268// _lwp_wakeup
269// _pset_bind
270// _sched_getaffinity
271// _sched_getparam
272// _sched_setaffinity
273// _sched_setparam
274// acct
275// aio_cancel
276// aio_error
277// aio_fsync
278// aio_read
279// aio_return
280// aio_suspend
281// aio_write
282// break
283// clock_getres
284// clock_gettime
285// clock_settime
286// compat_09_ogetdomainname
287// compat_09_osetdomainname
288// compat_09_ouname
289// compat_10_omsgsys
290// compat_10_osemsys
291// compat_10_oshmsys
292// compat_12_fstat12
293// compat_12_getdirentries
294// compat_12_lstat12
295// compat_12_msync
296// compat_12_oreboot
297// compat_12_oswapon
298// compat_12_stat12
299// compat_13_sigaction13
300// compat_13_sigaltstack13
301// compat_13_sigpending13
302// compat_13_sigprocmask13
303// compat_13_sigreturn13
304// compat_13_sigsuspend13
305// compat_14___semctl
306// compat_14_msgctl
307// compat_14_shmctl
308// compat_16___sigaction14
309// compat_16___sigreturn14
310// compat_20_fhstatfs
311// compat_20_fstatfs
312// compat_20_getfsstat
313// compat_20_statfs
314// compat_30___fhstat30
315// compat_30___fstat13
316// compat_30___lstat13
317// compat_30___stat13
318// compat_30_fhopen
319// compat_30_fhstat
320// compat_30_fhstatvfs1
321// compat_30_getdents
322// compat_30_getfh
323// compat_30_ntp_gettime
324// compat_30_socket
325// compat_40_mount
326// compat_43_fstat43
327// compat_43_lstat43
328// compat_43_oaccept
329// compat_43_ocreat
330// compat_43_oftruncate
331// compat_43_ogetdirentries
332// compat_43_ogetdtablesize
333// compat_43_ogethostid
334// compat_43_ogethostname
335// compat_43_ogetkerninfo
336// compat_43_ogetpagesize
337// compat_43_ogetpeername
338// compat_43_ogetrlimit
339// compat_43_ogetsockname
340// compat_43_okillpg
341// compat_43_olseek
342// compat_43_ommap
343// compat_43_oquota
344// compat_43_orecv
345// compat_43_orecvfrom
346// compat_43_orecvmsg
347// compat_43_osend
348// compat_43_osendmsg
349// compat_43_osethostid
350// compat_43_osethostname
351// compat_43_osetrlimit
352// compat_43_osigblock
353// compat_43_osigsetmask
354// compat_43_osigstack
355// compat_43_osigvec
356// compat_43_otruncate
357// compat_43_owait
358// compat_43_stat43
359// execve
360// extattr_delete_fd
361// extattr_delete_file
362// extattr_delete_link
363// extattr_get_fd
364// extattr_get_file
365// extattr_get_link
366// extattr_list_fd
367// extattr_list_file
368// extattr_list_link
369// extattr_set_fd
370// extattr_set_file
371// extattr_set_link
372// extattrctl
373// fchroot
374// fdatasync
375// fgetxattr
376// fktrace
377// flistxattr
378// fork
379// fremovexattr
380// fsetxattr
381// fstatvfs1
382// fsync_range
383// getcontext
384// getitimer
385// getvfsstat
386// getxattr
387// ioctl
388// ktrace
389// lchflags
390// lchmod
391// lfs_bmapv
392// lfs_markv
393// lfs_segclean
394// lfs_segwait
395// lgetxattr
396// lio_listio
397// listxattr
398// llistxattr
399// lremovexattr
400// lseek
401// lsetxattr
402// lutimes
403// madvise
404// mincore
405// minherit
406// modctl
407// mq_close
408// mq_getattr
409// mq_notify
410// mq_open
411// mq_receive
412// mq_send
413// mq_setattr
414// mq_timedreceive
415// mq_timedsend
416// mq_unlink
417// mremap
418// msgget
419// msgrcv
420// msgsnd
421// nfssvc
422// ntp_adjtime
423// pmc_control
424// pmc_get_info
425// poll
426// pollts
427// preadv
428// profil
429// pselect
430// pset_assign
431// pset_create
432// pset_destroy
433// ptrace
434// pwritev
435// quotactl
436// rasctl
437// readv
438// reboot
439// removexattr
440// sa_enable
441// sa_preempt
442// sa_register
443// sa_setconcurrency
444// sa_stacks
445// sa_yield
446// sbrk
447// sched_yield
448// semconfig
449// semget
450// semop
451// setcontext
452// setitimer
453// setxattr
454// shmat
455// shmdt
456// shmget
457// sstk
458// statvfs1
459// swapctl
460// sysarch
461// syscall
462// timer_create
463// timer_delete
464// timer_getoverrun
465// timer_gettime
466// timer_settime
467// undelete
468// utrace
469// uuidgen
470// vadvise
471// vfork
472// writev