text: // Copyright 2009,2010 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.
  
  // NetBSD system calls.
  // This file is compiled as ordinary Go code,
  // but it is also input to mksyscall,
  // which parses the //sys lines and generates system call stubs.
  // Note that sometimes we use a lowercase //sys name and wrap
  // it in our own nicer implementation, either here or in
  // syscall_bsd.go or syscall_unix.go.
  
  package unix
  
  import (
  	"syscall"
  	"unsafe"
  )
  
  type SockaddrDatalink struct {
  	Len    uint8
  	Family uint8
  	Index  uint16
  	Type   uint8
  	Nlen   uint8
  	Alen   uint8
  	Slen   uint8
  	Data   [12]int8
  	raw    RawSockaddrDatalink
  }
  
  func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
  
  func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {
  	var olen uintptr
  
  	// Get a list of all sysctl nodes below the given MIB by performing
  	// a sysctl for the given MIB with CTL_QUERY appended.
  	mib = append(mib, CTL_QUERY)
  	qnode := Sysctlnode{Flags: SYSCTL_VERS_1}
  	qp := (*byte)(unsafe.Pointer(&qnode))
  	sz := unsafe.Sizeof(qnode)
  	if err = sysctl(mib, nil, &olen, qp, sz); err != nil {
  		return nil, err
  	}
  
  	// Now that we know the size, get the actual nodes.
  	nodes = make([]Sysctlnode, olen/sz)
  	np := (*byte)(unsafe.Pointer(&nodes[0]))
  	if err = sysctl(mib, np, &olen, qp, sz); err != nil {
  		return nil, err
  	}
  
  	return nodes, nil
  }
  
  func nametomib(name string) (mib []_C_int, err error) {
  
  	// Split name into components.
  	var parts []string
  	last := 0
  	for i := 0; i < len(name); i++ {
  		if name[i] == '.' {
  			parts = append(parts, name[last:i])
  			last = i + 1
  		}
  	}
  	parts = append(parts, name[last:])
  
  	// Discover the nodes and construct the MIB OID.
  	for partno, part := range parts {
  		nodes, err := sysctlNodes(mib)
  		if err != nil {
  			return nil, err
  		}
  		for _, node := range nodes {
  			n := make([]byte, 0)
  			for i := range node.Name {
  				if node.Name[i] != 0 {
  					n = append(n, byte(node.Name[i]))
  				}
  			}
  			if string(n) == part {
  				mib = append(mib, _C_int(node.Num))
  				break
  			}
  		}
  		if len(mib) != partno+1 {
  			return nil, EINVAL
  		}
  	}
  
  	return mib, nil
  }
  
  // ParseDirent parses up to max directory entries in buf,
  // appending the names to names. It returns the number
  // bytes consumed from buf, the number of entries added
  // to names, and the new names slice.
  func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {
  	origlen := len(buf)
  	for max != 0 && len(buf) > 0 {
  		dirent := (*Dirent)(unsafe.Pointer(&buf[0]))
  		if dirent.Reclen == 0 {
  			buf = nil
  			break
  		}
  		buf = buf[dirent.Reclen:]
  		if dirent.Fileno == 0 { // File absent in directory.
  			continue
  		}
  		bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0]))
  		var name = string(bytes[0:dirent.Namlen])
  		if name == "." || name == ".." { // Useless names
  			continue
  		}
  		max--
  		count++
  		names = append(names, name)
  	}
  	return origlen - len(buf), count, names
  }
  
  //sysnb pipe() (fd1 int, fd2 int, err error)
  func Pipe(p []int) (err error) {
  	if len(p) != 2 {
  		return EINVAL
  	}
  	p[0], p[1], err = pipe()
  	return
  }
  
  //sys getdents(fd int, buf []byte) (n int, err error)
  func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
  	return getdents(fd, buf)
  }
  
  // TODO
  func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
  	return -1, ENOSYS
  }
  
  /*
   * Exposed directly
   */
  //sys	Access(path string, mode uint32) (err error)
  //sys	Adjtime(delta *Timeval, olddelta *Timeval) (err error)
  //sys	Chdir(path string) (err error)
  //sys	Chflags(path string, flags int) (err error)
  //sys	Chmod(path string, mode uint32) (err error)
  //sys	Chown(path string, uid int, gid int) (err error)
  //sys	Chroot(path string) (err error)
  //sys	Close(fd int) (err error)
  //sys	Dup(fd int) (nfd int, err error)
  //sys	Dup2(from int, to int) (err error)
  //sys	Exit(code int)
  //sys	Fchdir(fd int) (err error)
  //sys	Fchflags(fd int, flags int) (err error)
  //sys	Fchmod(fd int, mode uint32) (err error)
  //sys	Fchown(fd int, uid int, gid int) (err error)
  //sys	Flock(fd int, how int) (err error)
  //sys	Fpathconf(fd int, name int) (val int, err error)
  //sys	Fstat(fd int, stat *Stat_t) (err error)
  //sys	Fsync(fd int) (err error)
  //sys	Ftruncate(fd int, length int64) (err error)
  //sysnb	Getegid() (egid int)
  //sysnb	Geteuid() (uid int)
  //sysnb	Getgid() (gid int)
  //sysnb	Getpgid(pid int) (pgid int, err error)
  //sysnb	Getpgrp() (pgrp int)
  //sysnb	Getpid() (pid int)
  //sysnb	Getppid() (ppid int)
  //sys	Getpriority(which int, who int) (prio int, err error)
  //sysnb	Getrlimit(which int, lim *Rlimit) (err error)
  //sysnb	Getrusage(who int, rusage *Rusage) (err error)
  //sysnb	Getsid(pid int) (sid int, err error)
  //sysnb	Gettimeofday(tv *Timeval) (err error)
  //sysnb	Getuid() (uid int)
  //sys	Issetugid() (tainted bool)
  //sys	Kill(pid int, signum syscall.Signal) (err error)
  //sys	Kqueue() (fd int, err error)
  //sys	Lchown(path string, uid int, gid int) (err error)
  //sys	Link(path string, link string) (err error)
  //sys	Listen(s int, backlog int) (err error)
  //sys	Lstat(path string, stat *Stat_t) (err error)
  //sys	Mkdir(path string, mode uint32) (err error)
  //sys	Mkfifo(path string, mode uint32) (err error)
  //sys	Mknod(path string, mode uint32, dev int) (err error)
  //sys	Mlock(b []byte) (err error)
  //sys	Mlockall(flags int) (err error)
  //sys	Mprotect(b []byte, prot int) (err error)
  //sys	Munlock(b []byte) (err error)
  //sys	Munlockall() (err error)
  //sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
  //sys	Open(path string, mode int, perm uint32) (fd int, err error)
  //sys	Pathconf(path string, name int) (val int, err error)
  //sys	Pread(fd int, p []byte, offset int64) (n int, err error)
  //sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
  //sys	read(fd int, p []byte) (n int, err error)
  //sys	Readlink(path string, buf []byte) (n int, err error)
  //sys	Rename(from string, to string) (err error)
  //sys	Revoke(path string) (err error)
  //sys	Rmdir(path string) (err error)
  //sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
  //sys	Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
  //sysnb	Setegid(egid int) (err error)
  //sysnb	Seteuid(euid int) (err error)
  //sysnb	Setgid(gid int) (err error)
  //sysnb	Setpgid(pid int, pgid int) (err error)
  //sys	Setpriority(which int, who int, prio int) (err error)
  //sysnb	Setregid(rgid int, egid int) (err error)
  //sysnb	Setreuid(ruid int, euid int) (err error)
  //sysnb	Setrlimit(which int, lim *Rlimit) (err error)
  //sysnb	Setsid() (pid int, err error)
  //sysnb	Settimeofday(tp *Timeval) (err error)
  //sysnb	Setuid(uid int) (err error)
  //sys	Stat(path string, stat *Stat_t) (err error)
  //sys	Symlink(path string, link string) (err error)
  //sys	Sync() (err error)
  //sys	Truncate(path string, length int64) (err error)
  //sys	Umask(newmask int) (oldmask int)
  //sys	Unlink(path string) (err error)
  //sys	Unmount(path string, flags int) (err error)
  //sys	write(fd int, p []byte) (n int, err error)
  //sys	mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
  //sys	munmap(addr uintptr, length uintptr) (err error)
  //sys	readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
  //sys	writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
  
  /*
   * Unimplemented
   */
  // ____semctl13
  // __clone
  // __fhopen40
  // __fhstat40
  // __fhstatvfs140
  // __fstat30
  // __getcwd
  // __getfh30
  // __getlogin
  // __lstat30
  // __mount50
  // __msgctl13
  // __msync13
  // __ntp_gettime30
  // __posix_chown
  // __posix_fadvise50
  // __posix_fchown
  // __posix_lchown
  // __posix_rename
  // __setlogin
  // __shmctl13
  // __sigaction_sigtramp
  // __sigaltstack14
  // __sigpending14
  // __sigprocmask14
  // __sigsuspend14
  // __sigtimedwait
  // __stat30
  // __syscall
  // __vfork14
  // _ksem_close
  // _ksem_destroy
  // _ksem_getvalue
  // _ksem_init
  // _ksem_open
  // _ksem_post
  // _ksem_trywait
  // _ksem_unlink
  // _ksem_wait
  // _lwp_continue
  // _lwp_create
  // _lwp_ctl
  // _lwp_detach
  // _lwp_exit
  // _lwp_getname
  // _lwp_getprivate
  // _lwp_kill
  // _lwp_park
  // _lwp_self
  // _lwp_setname
  // _lwp_setprivate
  // _lwp_suspend
  // _lwp_unpark
  // _lwp_unpark_all
  // _lwp_wait
  // _lwp_wakeup
  // _pset_bind
  // _sched_getaffinity
  // _sched_getparam
  // _sched_setaffinity
  // _sched_setparam
  // acct
  // aio_cancel
  // aio_error
  // aio_fsync
  // aio_read
  // aio_return
  // aio_suspend
  // aio_write
  // break
  // clock_getres
  // clock_gettime
  // clock_settime
  // compat_09_ogetdomainname
  // compat_09_osetdomainname
  // compat_09_ouname
  // compat_10_omsgsys
  // compat_10_osemsys
  // compat_10_oshmsys
  // compat_12_fstat12
  // compat_12_getdirentries
  // compat_12_lstat12
  // compat_12_msync
  // compat_12_oreboot
  // compat_12_oswapon
  // compat_12_stat12
  // compat_13_sigaction13
  // compat_13_sigaltstack13
  // compat_13_sigpending13
  // compat_13_sigprocmask13
  // compat_13_sigreturn13
  // compat_13_sigsuspend13
  // compat_14___semctl
  // compat_14_msgctl
  // compat_14_shmctl
  // compat_16___sigaction14
  // compat_16___sigreturn14
  // compat_20_fhstatfs
  // compat_20_fstatfs
  // compat_20_getfsstat
  // compat_20_statfs
  // compat_30___fhstat30
  // compat_30___fstat13
  // compat_30___lstat13
  // compat_30___stat13
  // compat_30_fhopen
  // compat_30_fhstat
  // compat_30_fhstatvfs1
  // compat_30_getdents
  // compat_30_getfh
  // compat_30_ntp_gettime
  // compat_30_socket
  // compat_40_mount
  // compat_43_fstat43
  // compat_43_lstat43
  // compat_43_oaccept
  // compat_43_ocreat
  // compat_43_oftruncate
  // compat_43_ogetdirentries
  // compat_43_ogetdtablesize
  // compat_43_ogethostid
  // compat_43_ogethostname
  // compat_43_ogetkerninfo
  // compat_43_ogetpagesize
  // compat_43_ogetpeername
  // compat_43_ogetrlimit
  // compat_43_ogetsockname
  // compat_43_okillpg
  // compat_43_olseek
  // compat_43_ommap
  // compat_43_oquota
  // compat_43_orecv
  // compat_43_orecvfrom
  // compat_43_orecvmsg
  // compat_43_osend
  // compat_43_osendmsg
  // compat_43_osethostid
  // compat_43_osethostname
  // compat_43_osetrlimit
  // compat_43_osigblock
  // compat_43_osigsetmask
  // compat_43_osigstack
  // compat_43_osigvec
  // compat_43_otruncate
  // compat_43_owait
  // compat_43_stat43
  // execve
  // extattr_delete_fd
  // extattr_delete_file
  // extattr_delete_link
  // extattr_get_fd
  // extattr_get_file
  // extattr_get_link
  // extattr_list_fd
  // extattr_list_file
  // extattr_list_link
  // extattr_set_fd
  // extattr_set_file
  // extattr_set_link
  // extattrctl
  // fchroot
  // fdatasync
  // fgetxattr
  // fktrace
  // flistxattr
  // fork
  // fremovexattr
  // fsetxattr
  // fstatvfs1
  // fsync_range
  // getcontext
  // getitimer
  // getvfsstat
  // getxattr
  // ioctl
  // ktrace
  // lchflags
  // lchmod
  // lfs_bmapv
  // lfs_markv
  // lfs_segclean
  // lfs_segwait
  // lgetxattr
  // lio_listio
  // listxattr
  // llistxattr
  // lremovexattr
  // lseek
  // lsetxattr
  // lutimes
  // madvise
  // mincore
  // minherit
  // modctl
  // mq_close
  // mq_getattr
  // mq_notify
  // mq_open
  // mq_receive
  // mq_send
  // mq_setattr
  // mq_timedreceive
  // mq_timedsend
  // mq_unlink
  // mremap
  // msgget
  // msgrcv
  // msgsnd
  // nfssvc
  // ntp_adjtime
  // pmc_control
  // pmc_get_info
  // poll
  // pollts
  // preadv
  // profil
  // pselect
  // pset_assign
  // pset_create
  // pset_destroy
  // ptrace
  // pwritev
  // quotactl
  // rasctl
  // readv
  // reboot
  // removexattr
  // sa_enable
  // sa_preempt
  // sa_register
  // sa_setconcurrency
  // sa_stacks
  // sa_yield
  // sbrk
  // sched_yield
  // semconfig
  // semget
  // semop
  // setcontext
  // setitimer
  // setxattr
  // shmat
  // shmdt
  // shmget
  // sstk
  // statvfs1
  // swapctl
  // sysarch
  // syscall
  // timer_create
  // timer_delete
  // timer_getoverrun
  // timer_gettime
  // timer_settime
  // undelete
  // utrace
  // uuidgen
  // vadvise
  // vfork
  // writev
  