| // 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 syscall | |
| import "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 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 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 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 | |
| // mlock | |
| // mlockall | |
| // modctl | |
| // mprotect | |
| // mq_close | |
| // mq_getattr | |
| // mq_notify | |
| // mq_open | |
| // mq_receive | |
| // mq_send | |
| // mq_setattr | |
| // mq_timedreceive | |
| // mq_timedsend | |
| // mq_unlink | |
| // mremap | |
| // msgget | |
| // msgrcv | |
| // msgsnd | |
| // munlock | |
| // munlockall | |
| // 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 |