blob: 369a2be2dcbdeec89df14b85c8b3768ac889fb3e [file] [log] [blame]
Matthias Andreas Benkard832a54e2019-01-29 09:27:38 +01001// 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
20// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
21type SockaddrDatalink struct {
22 Len uint8
23 Family uint8
24 Index uint16
25 Type uint8
26 Nlen uint8
27 Alen uint8
28 Slen uint8
29 Data [12]int8
30 raw RawSockaddrDatalink
31}
32
33func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
34
35func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {
36 var olen uintptr
37
38 // Get a list of all sysctl nodes below the given MIB by performing
39 // a sysctl for the given MIB with CTL_QUERY appended.
40 mib = append(mib, CTL_QUERY)
41 qnode := Sysctlnode{Flags: SYSCTL_VERS_1}
42 qp := (*byte)(unsafe.Pointer(&qnode))
43 sz := unsafe.Sizeof(qnode)
44 if err = sysctl(mib, nil, &olen, qp, sz); err != nil {
45 return nil, err
46 }
47
48 // Now that we know the size, get the actual nodes.
49 nodes = make([]Sysctlnode, olen/sz)
50 np := (*byte)(unsafe.Pointer(&nodes[0]))
51 if err = sysctl(mib, np, &olen, qp, sz); err != nil {
52 return nil, err
53 }
54
55 return nodes, nil
56}
57
58func nametomib(name string) (mib []_C_int, err error) {
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
96//sysnb pipe() (fd1 int, fd2 int, err error)
97func Pipe(p []int) (err error) {
98 if len(p) != 2 {
99 return EINVAL
100 }
101 p[0], p[1], err = pipe()
102 return
103}
104
105//sys getdents(fd int, buf []byte) (n int, err error)
106func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
107 return getdents(fd, buf)
108}
109
110const ImplementsGetwd = true
111
112//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
113
114func Getwd() (string, error) {
115 var buf [PathMax]byte
116 _, err := Getcwd(buf[0:])
117 if err != nil {
118 return "", err
119 }
120 n := clen(buf[:])
121 if n < 1 {
122 return "", EINVAL
123 }
124 return string(buf[:n]), nil
125}
126
127// TODO
128func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
129 return -1, ENOSYS
130}
131
132func setattrlistTimes(path string, times []Timespec, flags int) error {
133 // used on Darwin for UtimesNano
134 return ENOSYS
135}
136
137//sys ioctl(fd int, req uint, arg uintptr) (err error)
138
139// ioctl itself should not be exposed directly, but additional get/set
140// functions for specific types are permissible.
141
142// IoctlSetInt performs an ioctl operation which sets an integer value
143// on fd, using the specified request number.
144func IoctlSetInt(fd int, req uint, value int) error {
145 return ioctl(fd, req, uintptr(value))
146}
147
148func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
149 return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
150}
151
152func IoctlSetTermios(fd int, req uint, value *Termios) error {
153 return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
154}
155
156// IoctlGetInt performs an ioctl operation which gets an integer value
157// from fd, using the specified request number.
158func IoctlGetInt(fd int, req uint) (int, error) {
159 var value int
160 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
161 return value, err
162}
163
164func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
165 var value Winsize
166 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
167 return &value, err
168}
169
170func IoctlGetTermios(fd int, req uint) (*Termios, error) {
171 var value Termios
172 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
173 return &value, err
174}
175
176func Uname(uname *Utsname) error {
177 mib := []_C_int{CTL_KERN, KERN_OSTYPE}
178 n := unsafe.Sizeof(uname.Sysname)
179 if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
180 return err
181 }
182
183 mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
184 n = unsafe.Sizeof(uname.Nodename)
185 if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
186 return err
187 }
188
189 mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
190 n = unsafe.Sizeof(uname.Release)
191 if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
192 return err
193 }
194
195 mib = []_C_int{CTL_KERN, KERN_VERSION}
196 n = unsafe.Sizeof(uname.Version)
197 if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
198 return err
199 }
200
201 // The version might have newlines or tabs in it, convert them to
202 // spaces.
203 for i, b := range uname.Version {
204 if b == '\n' || b == '\t' {
205 if i == len(uname.Version)-1 {
206 uname.Version[i] = 0
207 } else {
208 uname.Version[i] = ' '
209 }
210 }
211 }
212
213 mib = []_C_int{CTL_HW, HW_MACHINE}
214 n = unsafe.Sizeof(uname.Machine)
215 if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
216 return err
217 }
218
219 return nil
220}
221
222/*
223 * Exposed directly
224 */
225//sys Access(path string, mode uint32) (err error)
226//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
227//sys Chdir(path string) (err error)
228//sys Chflags(path string, flags int) (err error)
229//sys Chmod(path string, mode uint32) (err error)
230//sys Chown(path string, uid int, gid int) (err error)
231//sys Chroot(path string) (err error)
232//sys Close(fd int) (err error)
233//sys Dup(fd int) (nfd int, err error)
234//sys Dup2(from int, to int) (err error)
235//sys Exit(code int)
236//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
237//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE
238//sys Fchdir(fd int) (err error)
239//sys Fchflags(fd int, flags int) (err error)
240//sys Fchmod(fd int, mode uint32) (err error)
241//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
242//sys Fchown(fd int, uid int, gid int) (err error)
243//sys Flock(fd int, how int) (err error)
244//sys Fpathconf(fd int, name int) (val int, err error)
245//sys Fstat(fd int, stat *Stat_t) (err error)
246//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
247//sys Fsync(fd int) (err error)
248//sys Ftruncate(fd int, length int64) (err error)
249//sysnb Getegid() (egid int)
250//sysnb Geteuid() (uid int)
251//sysnb Getgid() (gid int)
252//sysnb Getpgid(pid int) (pgid int, err error)
253//sysnb Getpgrp() (pgrp int)
254//sysnb Getpid() (pid int)
255//sysnb Getppid() (ppid int)
256//sys Getpriority(which int, who int) (prio int, err error)
257//sysnb Getrlimit(which int, lim *Rlimit) (err error)
258//sysnb Getrusage(who int, rusage *Rusage) (err error)
259//sysnb Getsid(pid int) (sid int, err error)
260//sysnb Gettimeofday(tv *Timeval) (err error)
261//sysnb Getuid() (uid int)
262//sys Issetugid() (tainted bool)
263//sys Kill(pid int, signum syscall.Signal) (err error)
264//sys Kqueue() (fd int, err error)
265//sys Lchown(path string, uid int, gid int) (err error)
266//sys Link(path string, link string) (err error)
267//sys Listen(s int, backlog int) (err error)
268//sys Lstat(path string, stat *Stat_t) (err error)
269//sys Mkdir(path string, mode uint32) (err error)
270//sys Mkfifo(path string, mode uint32) (err error)
271//sys Mknod(path string, mode uint32, dev int) (err error)
272//sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
273//sys Open(path string, mode int, perm uint32) (fd int, err error)
274//sys Pathconf(path string, name int) (val int, err error)
275//sys Pread(fd int, p []byte, offset int64) (n int, err error)
276//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
277//sys read(fd int, p []byte) (n int, err error)
278//sys Readlink(path string, buf []byte) (n int, err error)
279//sys Rename(from string, to string) (err error)
280//sys Revoke(path string) (err error)
281//sys Rmdir(path string) (err error)
282//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
283//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
284//sysnb Setegid(egid int) (err error)
285//sysnb Seteuid(euid int) (err error)
286//sysnb Setgid(gid int) (err error)
287//sysnb Setpgid(pid int, pgid int) (err error)
288//sys Setpriority(which int, who int, prio int) (err error)
289//sysnb Setregid(rgid int, egid int) (err error)
290//sysnb Setreuid(ruid int, euid int) (err error)
291//sysnb Setrlimit(which int, lim *Rlimit) (err error)
292//sysnb Setsid() (pid int, err error)
293//sysnb Settimeofday(tp *Timeval) (err error)
294//sysnb Setuid(uid int) (err error)
295//sys Stat(path string, stat *Stat_t) (err error)
296//sys Symlink(path string, link string) (err error)
297//sys Sync() (err error)
298//sys Truncate(path string, length int64) (err error)
299//sys Umask(newmask int) (oldmask int)
300//sys Unlink(path string) (err error)
301//sys Unmount(path string, flags int) (err error)
302//sys write(fd int, p []byte) (n int, err error)
303//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
304//sys munmap(addr uintptr, length uintptr) (err error)
305//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
306//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
307//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
308
309/*
310 * Unimplemented
311 */
312// ____semctl13
313// __clone
314// __fhopen40
315// __fhstat40
316// __fhstatvfs140
317// __fstat30
318// __getcwd
319// __getfh30
320// __getlogin
321// __lstat30
322// __mount50
323// __msgctl13
324// __msync13
325// __ntp_gettime30
326// __posix_chown
327// __posix_fchown
328// __posix_lchown
329// __posix_rename
330// __setlogin
331// __shmctl13
332// __sigaction_sigtramp
333// __sigaltstack14
334// __sigpending14
335// __sigprocmask14
336// __sigsuspend14
337// __sigtimedwait
338// __stat30
339// __syscall
340// __vfork14
341// _ksem_close
342// _ksem_destroy
343// _ksem_getvalue
344// _ksem_init
345// _ksem_open
346// _ksem_post
347// _ksem_trywait
348// _ksem_unlink
349// _ksem_wait
350// _lwp_continue
351// _lwp_create
352// _lwp_ctl
353// _lwp_detach
354// _lwp_exit
355// _lwp_getname
356// _lwp_getprivate
357// _lwp_kill
358// _lwp_park
359// _lwp_self
360// _lwp_setname
361// _lwp_setprivate
362// _lwp_suspend
363// _lwp_unpark
364// _lwp_unpark_all
365// _lwp_wait
366// _lwp_wakeup
367// _pset_bind
368// _sched_getaffinity
369// _sched_getparam
370// _sched_setaffinity
371// _sched_setparam
372// acct
373// aio_cancel
374// aio_error
375// aio_fsync
376// aio_read
377// aio_return
378// aio_suspend
379// aio_write
380// break
381// clock_getres
382// clock_gettime
383// clock_settime
384// compat_09_ogetdomainname
385// compat_09_osetdomainname
386// compat_09_ouname
387// compat_10_omsgsys
388// compat_10_osemsys
389// compat_10_oshmsys
390// compat_12_fstat12
391// compat_12_getdirentries
392// compat_12_lstat12
393// compat_12_msync
394// compat_12_oreboot
395// compat_12_oswapon
396// compat_12_stat12
397// compat_13_sigaction13
398// compat_13_sigaltstack13
399// compat_13_sigpending13
400// compat_13_sigprocmask13
401// compat_13_sigreturn13
402// compat_13_sigsuspend13
403// compat_14___semctl
404// compat_14_msgctl
405// compat_14_shmctl
406// compat_16___sigaction14
407// compat_16___sigreturn14
408// compat_20_fhstatfs
409// compat_20_fstatfs
410// compat_20_getfsstat
411// compat_20_statfs
412// compat_30___fhstat30
413// compat_30___fstat13
414// compat_30___lstat13
415// compat_30___stat13
416// compat_30_fhopen
417// compat_30_fhstat
418// compat_30_fhstatvfs1
419// compat_30_getdents
420// compat_30_getfh
421// compat_30_ntp_gettime
422// compat_30_socket
423// compat_40_mount
424// compat_43_fstat43
425// compat_43_lstat43
426// compat_43_oaccept
427// compat_43_ocreat
428// compat_43_oftruncate
429// compat_43_ogetdirentries
430// compat_43_ogetdtablesize
431// compat_43_ogethostid
432// compat_43_ogethostname
433// compat_43_ogetkerninfo
434// compat_43_ogetpagesize
435// compat_43_ogetpeername
436// compat_43_ogetrlimit
437// compat_43_ogetsockname
438// compat_43_okillpg
439// compat_43_olseek
440// compat_43_ommap
441// compat_43_oquota
442// compat_43_orecv
443// compat_43_orecvfrom
444// compat_43_orecvmsg
445// compat_43_osend
446// compat_43_osendmsg
447// compat_43_osethostid
448// compat_43_osethostname
449// compat_43_osetrlimit
450// compat_43_osigblock
451// compat_43_osigsetmask
452// compat_43_osigstack
453// compat_43_osigvec
454// compat_43_otruncate
455// compat_43_owait
456// compat_43_stat43
457// execve
458// extattr_delete_fd
459// extattr_delete_file
460// extattr_delete_link
461// extattr_get_fd
462// extattr_get_file
463// extattr_get_link
464// extattr_list_fd
465// extattr_list_file
466// extattr_list_link
467// extattr_set_fd
468// extattr_set_file
469// extattr_set_link
470// extattrctl
471// fchroot
472// fdatasync
473// fgetxattr
474// fktrace
475// flistxattr
476// fork
477// fremovexattr
478// fsetxattr
479// fstatvfs1
480// fsync_range
481// getcontext
482// getitimer
483// getvfsstat
484// getxattr
485// ktrace
486// lchflags
487// lchmod
488// lfs_bmapv
489// lfs_markv
490// lfs_segclean
491// lfs_segwait
492// lgetxattr
493// lio_listio
494// listxattr
495// llistxattr
496// lremovexattr
497// lseek
498// lsetxattr
499// lutimes
500// madvise
501// mincore
502// minherit
503// modctl
504// mq_close
505// mq_getattr
506// mq_notify
507// mq_open
508// mq_receive
509// mq_send
510// mq_setattr
511// mq_timedreceive
512// mq_timedsend
513// mq_unlink
514// mremap
515// msgget
516// msgrcv
517// msgsnd
518// nfssvc
519// ntp_adjtime
520// pmc_control
521// pmc_get_info
522// pollts
523// preadv
524// profil
525// pselect
526// pset_assign
527// pset_create
528// pset_destroy
529// ptrace
530// pwritev
531// quotactl
532// rasctl
533// readv
534// reboot
535// removexattr
536// sa_enable
537// sa_preempt
538// sa_register
539// sa_setconcurrency
540// sa_stacks
541// sa_yield
542// sbrk
543// sched_yield
544// semconfig
545// semget
546// semop
547// setcontext
548// setitimer
549// setxattr
550// shmat
551// shmdt
552// shmget
553// sstk
554// statvfs1
555// swapctl
556// sysarch
557// syscall
558// timer_create
559// timer_delete
560// timer_getoverrun
561// timer_gettime
562// timer_settime
563// undelete
564// utrace
565// uuidgen
566// vadvise
567// vfork
568// writev