syscall_netbsd.go

  1// 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