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 syscall 14 15import "unsafe" 16 17type SockaddrDatalink struct { 18 Len uint8 19 Family uint8 20 Index uint16 21 Type uint8 22 Nlen uint8 23 Alen uint8 24 Slen uint8 25 Data [12]int8 26 raw RawSockaddrDatalink 27} 28 29func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) 30 31func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) { 32 var olen uintptr 33 34 // Get a list of all sysctl nodes below the given MIB by performing 35 // a sysctl for the given MIB with CTL_QUERY appended. 36 mib = append(mib, CTL_QUERY) 37 qnode := Sysctlnode{Flags: SYSCTL_VERS_1} 38 qp := (*byte)(unsafe.Pointer(&qnode)) 39 sz := unsafe.Sizeof(qnode) 40 if err = sysctl(mib, nil, &olen, qp, sz); err != nil { 41 return nil, err 42 } 43 44 // Now that we know the size, get the actual nodes. 45 nodes = make([]Sysctlnode, olen/sz) 46 np := (*byte)(unsafe.Pointer(&nodes[0])) 47 if err = sysctl(mib, np, &olen, qp, sz); err != nil { 48 return nil, err 49 } 50 51 return nodes, nil 52} 53 54func nametomib(name string) (mib []_C_int, err error) { 55 // Split name into components. 56 var parts []string 57 last := 0 58 for i := 0; i < len(name); i++ { 59 if name[i] == '.' { 60 parts = append(parts, name[last:i]) 61 last = i + 1 62 } 63 } 64 parts = append(parts, name[last:]) 65 66 // Discover the nodes and construct the MIB OID. 67 for partno, part := range parts { 68 nodes, err := sysctlNodes(mib) 69 if err != nil { 70 return nil, err 71 } 72 for _, node := range nodes { 73 n := make([]byte, 0) 74 for i := range node.Name { 75 if node.Name[i] != 0 { 76 n = append(n, byte(node.Name[i])) 77 } 78 } 79 if string(n) == part { 80 mib = append(mib, _C_int(node.Num)) 81 break 82 } 83 } 84 if len(mib) != partno+1 { 85 return nil, EINVAL 86 } 87 } 88 89 return mib, nil 90} 91 92func direntIno(buf []byte) (uint64, bool) { 93 return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) 94} 95 96func direntReclen(buf []byte) (uint64, bool) { 97 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) 98} 99 100func direntNamlen(buf []byte) (uint64, bool) { 101 return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) 102} 103 104func Pipe(p []int) (err error) { 105 return Pipe2(p, 0) 106} 107 108//sysnb pipe2(p *[2]_C_int, flags int) (err error) 109func Pipe2(p []int, flags int) error { 110 if len(p) != 2 { 111 return EINVAL 112 } 113 var pp [2]_C_int 114 err := pipe2(&pp, flags) 115 p[0] = int(pp[0]) 116 p[1] = int(pp[1]) 117 return err 118} 119 120//sys paccept(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, sigmask *sigset, flags int) (nfd int, err error) 121func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { 122 var rsa RawSockaddrAny 123 var len _Socklen = SizeofSockaddrAny 124 nfd, err = paccept(fd, &rsa, &len, nil, flags) 125 if err != nil { 126 return 127 } 128 if len > SizeofSockaddrAny { 129 panic("RawSockaddrAny too small") 130 } 131 sa, err = anyToSockaddr(&rsa) 132 if err != nil { 133 Close(nfd) 134 nfd = 0 135 } 136 return 137} 138 139//sys getdents(fd int, buf []byte) (n int, err error) 140func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { 141 return getdents(fd, buf) 142} 143 144// TODO, see golang.org/issue/5847 145func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { 146 return -1, ENOSYS 147} 148 149func setattrlistTimes(path string, times []Timespec) error { 150 // used on Darwin for UtimesNano 151 return ENOSYS 152} 153 154/* 155 * Exposed directly 156 */ 157//sys Access(path string, mode uint32) (err error) 158//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) 159//sys Chdir(path string) (err error) 160//sys Chflags(path string, flags int) (err error) 161//sys Chmod(path string, mode uint32) (err error) 162//sys Chown(path string, uid int, gid int) (err error) 163//sys Chroot(path string) (err error) 164//sys Close(fd int) (err error) 165//sys Dup(fd int) (nfd int, err error) 166//sys Dup2(from int, to int) (err error) 167//sys Fchdir(fd int) (err error) 168//sys Fchflags(fd int, flags int) (err error) 169//sys Fchmod(fd int, mode uint32) (err error) 170//sys Fchown(fd int, uid int, gid int) (err error) 171//sys Flock(fd int, how int) (err error) 172//sys Fpathconf(fd int, name int) (val int, err error) 173//sys Fstat(fd int, stat *Stat_t) (err error) 174//sys Fsync(fd int) (err error) 175//sys Ftruncate(fd int, length int64) (err error) 176//sysnb Getegid() (egid int) 177//sysnb Geteuid() (uid int) 178//sysnb Getgid() (gid int) 179//sysnb Getpgid(pid int) (pgid int, err error) 180//sysnb Getpgrp() (pgrp int) 181//sysnb Getpid() (pid int) 182//sysnb Getppid() (ppid int) 183//sys Getpriority(which int, who int) (prio int, err error) 184//sysnb Getrlimit(which int, lim *Rlimit) (err error) 185//sysnb Getrusage(who int, rusage *Rusage) (err error) 186//sysnb Getsid(pid int) (sid int, err error) 187//sysnb Gettimeofday(tv *Timeval) (err error) 188//sysnb Getuid() (uid int) 189//sys Issetugid() (tainted bool) 190//sys Kill(pid int, signum Signal) (err error) 191//sys Kqueue() (fd int, err error) 192//sys Lchown(path string, uid int, gid int) (err error) 193//sys Link(path string, link string) (err error) 194//sys Listen(s int, backlog int) (err error) 195//sys Lstat(path string, stat *Stat_t) (err error) 196//sys Mkdir(path string, mode uint32) (err error) 197//sys Mkfifo(path string, mode uint32) (err error) 198//sys Mknod(path string, mode uint32, dev int) (err error) 199//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) 200//sys Open(path string, mode int, perm uint32) (fd int, err error) 201//sys Pathconf(path string, name int) (val int, err error) 202//sys Pread(fd int, p []byte, offset int64) (n int, err error) 203//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) 204//sys read(fd int, p []byte) (n int, err error) 205//sys Readlink(path string, buf []byte) (n int, err error) 206//sys Rename(from string, to string) (err error) 207//sys Revoke(path string) (err error) 208//sys Rmdir(path string) (err error) 209//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK 210//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) 211//sysnb Setegid(egid int) (err error) 212//sysnb Seteuid(euid int) (err error) 213//sysnb Setgid(gid int) (err error) 214//sysnb Setpgid(pid int, pgid int) (err error) 215//sys Setpriority(which int, who int, prio int) (err error) 216//sysnb Setregid(rgid int, egid int) (err error) 217//sysnb Setreuid(ruid int, euid int) (err error) 218//sysnb Setrlimit(which int, lim *Rlimit) (err error) 219//sysnb Setsid() (pid int, err error) 220//sysnb Settimeofday(tp *Timeval) (err error) 221//sysnb Setuid(uid int) (err error) 222//sys Stat(path string, stat *Stat_t) (err error) 223//sys Symlink(path string, link string) (err error) 224//sys Sync() (err error) 225//sys Truncate(path string, length int64) (err error) 226//sys Umask(newmask int) (oldmask int) 227//sys Unlink(path string) (err error) 228//sys Unmount(path string, flags int) (err error) 229//sys write(fd int, p []byte) (n int, err error) 230//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) 231//sys munmap(addr uintptr, length uintptr) (err error) 232//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ 233//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE 234//sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) 235//sys getcwd(buf []byte) (n int, err error) = SYS___GETCWD 236//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL 237