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