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 96func SysctlClockinfo(name string) (*Clockinfo, error) { 97 mib, err := sysctlmib(name) 98 if err != nil { 99 return nil, err 100 } 101 102 n := uintptr(SizeofClockinfo) 103 var ci Clockinfo 104 if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { 105 return nil, err 106 } 107 if n != SizeofClockinfo { 108 return nil, EIO 109 } 110 return &ci, nil 111} 112 113//sysnb pipe() (fd1 int, fd2 int, err error) 114func Pipe(p []int) (err error) { 115 if len(p) != 2 { 116 return EINVAL 117 } 118 p[0], p[1], err = pipe() 119 return 120} 121 122//sys getdents(fd int, buf []byte) (n int, err error) 123func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { 124 return getdents(fd, buf) 125} 126 127const ImplementsGetwd = true 128 129//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD 130 131func Getwd() (string, error) { 132 var buf [PathMax]byte 133 _, err := Getcwd(buf[0:]) 134 if err != nil { 135 return "", err 136 } 137 n := clen(buf[:]) 138 if n < 1 { 139 return "", EINVAL 140 } 141 return string(buf[:n]), nil 142} 143 144// TODO 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, flags int) error { 150 // used on Darwin for UtimesNano 151 return ENOSYS 152} 153 154//sys ioctl(fd int, req uint, arg uintptr) (err error) 155 156// ioctl itself should not be exposed directly, but additional get/set 157// functions for specific types are permissible. 158 159// IoctlSetInt performs an ioctl operation which sets an integer value 160// on fd, using the specified request number. 161func IoctlSetInt(fd int, req uint, value int) error { 162 return ioctl(fd, req, uintptr(value)) 163} 164 165func ioctlSetWinsize(fd int, req uint, value *Winsize) error { 166 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) 167} 168 169func ioctlSetTermios(fd int, req uint, value *Termios) error { 170 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) 171} 172 173// IoctlGetInt performs an ioctl operation which gets an integer value 174// from fd, using the specified request number. 175func IoctlGetInt(fd int, req uint) (int, error) { 176 var value int 177 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) 178 return value, err 179} 180 181func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { 182 var value Winsize 183 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) 184 return &value, err 185} 186 187func IoctlGetTermios(fd int, req uint) (*Termios, error) { 188 var value Termios 189 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) 190 return &value, err 191} 192 193func Uname(uname *Utsname) error { 194 mib := []_C_int{CTL_KERN, KERN_OSTYPE} 195 n := unsafe.Sizeof(uname.Sysname) 196 if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { 197 return err 198 } 199 200 mib = []_C_int{CTL_KERN, KERN_HOSTNAME} 201 n = unsafe.Sizeof(uname.Nodename) 202 if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { 203 return err 204 } 205 206 mib = []_C_int{CTL_KERN, KERN_OSRELEASE} 207 n = unsafe.Sizeof(uname.Release) 208 if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { 209 return err 210 } 211 212 mib = []_C_int{CTL_KERN, KERN_VERSION} 213 n = unsafe.Sizeof(uname.Version) 214 if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { 215 return err 216 } 217 218 // The version might have newlines or tabs in it, convert them to 219 // spaces. 220 for i, b := range uname.Version { 221 if b == '\n' || b == '\t' { 222 if i == len(uname.Version)-1 { 223 uname.Version[i] = 0 224 } else { 225 uname.Version[i] = ' ' 226 } 227 } 228 } 229 230 mib = []_C_int{CTL_HW, HW_MACHINE} 231 n = unsafe.Sizeof(uname.Machine) 232 if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { 233 return err 234 } 235 236 return nil 237} 238 239/* 240 * Exposed directly 241 */ 242//sys Access(path string, mode uint32) (err error) 243//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) 244//sys Chdir(path string) (err error) 245//sys Chflags(path string, flags int) (err error) 246//sys Chmod(path string, mode uint32) (err error) 247//sys Chown(path string, uid int, gid int) (err error) 248//sys Chroot(path string) (err error) 249//sys Close(fd int) (err error) 250//sys Dup(fd int) (nfd int, err error) 251//sys Dup2(from int, to int) (err error) 252//sys Exit(code int) 253//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) 254//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) 255//sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) 256//sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) 257//sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) 258//sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) 259//sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) 260//sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) 261//sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) 262//sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) 263//sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) 264//sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) 265//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) 266//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE 267//sys Fchdir(fd int) (err error) 268//sys Fchflags(fd int, flags int) (err error) 269//sys Fchmod(fd int, mode uint32) (err error) 270//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) 271//sys Fchown(fd int, uid int, gid int) (err error) 272//sys Flock(fd int, how int) (err error) 273//sys Fpathconf(fd int, name int) (val int, err error) 274//sys Fstat(fd int, stat *Stat_t) (err error) 275//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) 276//sys Fsync(fd int) (err error) 277//sys Ftruncate(fd int, length int64) (err error) 278//sysnb Getegid() (egid int) 279//sysnb Geteuid() (uid int) 280//sysnb Getgid() (gid int) 281//sysnb Getpgid(pid int) (pgid int, err error) 282//sysnb Getpgrp() (pgrp int) 283//sysnb Getpid() (pid int) 284//sysnb Getppid() (ppid int) 285//sys Getpriority(which int, who int) (prio int, err error) 286//sysnb Getrlimit(which int, lim *Rlimit) (err error) 287//sysnb Getrusage(who int, rusage *Rusage) (err error) 288//sysnb Getsid(pid int) (sid int, err error) 289//sysnb Gettimeofday(tv *Timeval) (err error) 290//sysnb Getuid() (uid int) 291//sys Issetugid() (tainted bool) 292//sys Kill(pid int, signum syscall.Signal) (err error) 293//sys Kqueue() (fd int, err error) 294//sys Lchown(path string, uid int, gid int) (err error) 295//sys Link(path string, link string) (err error) 296//sys Listen(s int, backlog int) (err error) 297//sys Lstat(path string, stat *Stat_t) (err error) 298//sys Mkdir(path string, mode uint32) (err error) 299//sys Mkfifo(path string, mode uint32) (err error) 300//sys Mknod(path string, mode uint32, dev int) (err error) 301//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) 302//sys Open(path string, mode int, perm uint32) (fd int, err error) 303//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) 304//sys Pathconf(path string, name int) (val int, err error) 305//sys Pread(fd int, p []byte, offset int64) (n int, err error) 306//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) 307//sys read(fd int, p []byte) (n int, err error) 308//sys Readlink(path string, buf []byte) (n int, err error) 309//sys Rename(from string, to string) (err error) 310//sys Revoke(path string) (err error) 311//sys Rmdir(path string) (err error) 312//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK 313//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) 314//sysnb Setegid(egid int) (err error) 315//sysnb Seteuid(euid int) (err error) 316//sysnb Setgid(gid int) (err error) 317//sysnb Setpgid(pid int, pgid int) (err error) 318//sys Setpriority(which int, who int, prio int) (err error) 319//sysnb Setregid(rgid int, egid int) (err error) 320//sysnb Setreuid(ruid int, euid int) (err error) 321//sysnb Setrlimit(which int, lim *Rlimit) (err error) 322//sysnb Setsid() (pid int, err error) 323//sysnb Settimeofday(tp *Timeval) (err error) 324//sysnb Setuid(uid int) (err error) 325//sys Stat(path string, stat *Stat_t) (err error) 326//sys Symlink(path string, link string) (err error) 327//sys Sync() (err error) 328//sys Truncate(path string, length int64) (err error) 329//sys Umask(newmask int) (oldmask int) 330//sys Unlink(path string) (err error) 331//sys Unmount(path string, flags int) (err error) 332//sys write(fd int, p []byte) (n int, err error) 333//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) 334//sys munmap(addr uintptr, length uintptr) (err error) 335//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ 336//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE 337//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) 338 339/* 340 * Unimplemented 341 */ 342// ____semctl13 343// __clone 344// __fhopen40 345// __fhstat40 346// __fhstatvfs140 347// __fstat30 348// __getcwd 349// __getfh30 350// __getlogin 351// __lstat30 352// __mount50 353// __msgctl13 354// __msync13 355// __ntp_gettime30 356// __posix_chown 357// __posix_fchown 358// __posix_lchown 359// __posix_rename 360// __setlogin 361// __shmctl13 362// __sigaction_sigtramp 363// __sigaltstack14 364// __sigpending14 365// __sigprocmask14 366// __sigsuspend14 367// __sigtimedwait 368// __stat30 369// __syscall 370// __vfork14 371// _ksem_close 372// _ksem_destroy 373// _ksem_getvalue 374// _ksem_init 375// _ksem_open 376// _ksem_post 377// _ksem_trywait 378// _ksem_unlink 379// _ksem_wait 380// _lwp_continue 381// _lwp_create 382// _lwp_ctl 383// _lwp_detach 384// _lwp_exit 385// _lwp_getname 386// _lwp_getprivate 387// _lwp_kill 388// _lwp_park 389// _lwp_self 390// _lwp_setname 391// _lwp_setprivate 392// _lwp_suspend 393// _lwp_unpark 394// _lwp_unpark_all 395// _lwp_wait 396// _lwp_wakeup 397// _pset_bind 398// _sched_getaffinity 399// _sched_getparam 400// _sched_setaffinity 401// _sched_setparam 402// acct 403// aio_cancel 404// aio_error 405// aio_fsync 406// aio_read 407// aio_return 408// aio_suspend 409// aio_write 410// break 411// clock_getres 412// clock_gettime 413// clock_settime 414// compat_09_ogetdomainname 415// compat_09_osetdomainname 416// compat_09_ouname 417// compat_10_omsgsys 418// compat_10_osemsys 419// compat_10_oshmsys 420// compat_12_fstat12 421// compat_12_getdirentries 422// compat_12_lstat12 423// compat_12_msync 424// compat_12_oreboot 425// compat_12_oswapon 426// compat_12_stat12 427// compat_13_sigaction13 428// compat_13_sigaltstack13 429// compat_13_sigpending13 430// compat_13_sigprocmask13 431// compat_13_sigreturn13 432// compat_13_sigsuspend13 433// compat_14___semctl 434// compat_14_msgctl 435// compat_14_shmctl 436// compat_16___sigaction14 437// compat_16___sigreturn14 438// compat_20_fhstatfs 439// compat_20_fstatfs 440// compat_20_getfsstat 441// compat_20_statfs 442// compat_30___fhstat30 443// compat_30___fstat13 444// compat_30___lstat13 445// compat_30___stat13 446// compat_30_fhopen 447// compat_30_fhstat 448// compat_30_fhstatvfs1 449// compat_30_getdents 450// compat_30_getfh 451// compat_30_ntp_gettime 452// compat_30_socket 453// compat_40_mount 454// compat_43_fstat43 455// compat_43_lstat43 456// compat_43_oaccept 457// compat_43_ocreat 458// compat_43_oftruncate 459// compat_43_ogetdirentries 460// compat_43_ogetdtablesize 461// compat_43_ogethostid 462// compat_43_ogethostname 463// compat_43_ogetkerninfo 464// compat_43_ogetpagesize 465// compat_43_ogetpeername 466// compat_43_ogetrlimit 467// compat_43_ogetsockname 468// compat_43_okillpg 469// compat_43_olseek 470// compat_43_ommap 471// compat_43_oquota 472// compat_43_orecv 473// compat_43_orecvfrom 474// compat_43_orecvmsg 475// compat_43_osend 476// compat_43_osendmsg 477// compat_43_osethostid 478// compat_43_osethostname 479// compat_43_osetrlimit 480// compat_43_osigblock 481// compat_43_osigsetmask 482// compat_43_osigstack 483// compat_43_osigvec 484// compat_43_otruncate 485// compat_43_owait 486// compat_43_stat43 487// execve 488// extattr_delete_fd 489// extattr_delete_file 490// extattr_delete_link 491// extattr_get_fd 492// extattr_get_file 493// extattr_get_link 494// extattr_list_fd 495// extattr_list_file 496// extattr_list_link 497// extattr_set_fd 498// extattr_set_file 499// extattr_set_link 500// extattrctl 501// fchroot 502// fdatasync 503// fgetxattr 504// fktrace 505// flistxattr 506// fork 507// fremovexattr 508// fsetxattr 509// fstatvfs1 510// fsync_range 511// getcontext 512// getitimer 513// getvfsstat 514// getxattr 515// ktrace 516// lchflags 517// lchmod 518// lfs_bmapv 519// lfs_markv 520// lfs_segclean 521// lfs_segwait 522// lgetxattr 523// lio_listio 524// listxattr 525// llistxattr 526// lremovexattr 527// lseek 528// lsetxattr 529// lutimes 530// madvise 531// mincore 532// minherit 533// modctl 534// mq_close 535// mq_getattr 536// mq_notify 537// mq_open 538// mq_receive 539// mq_send 540// mq_setattr 541// mq_timedreceive 542// mq_timedsend 543// mq_unlink 544// mremap 545// msgget 546// msgrcv 547// msgsnd 548// nfssvc 549// ntp_adjtime 550// pmc_control 551// pmc_get_info 552// pollts 553// preadv 554// profil 555// pselect 556// pset_assign 557// pset_create 558// pset_destroy 559// ptrace 560// pwritev 561// quotactl 562// rasctl 563// readv 564// reboot 565// removexattr 566// sa_enable 567// sa_preempt 568// sa_register 569// sa_setconcurrency 570// sa_stacks 571// sa_yield 572// sbrk 573// sched_yield 574// semconfig 575// semget 576// semop 577// setcontext 578// setitimer 579// setxattr 580// shmat 581// shmdt 582// shmget 583// sstk 584// statvfs1 585// swapctl 586// sysarch 587// syscall 588// timer_create 589// timer_delete 590// timer_getoverrun 591// timer_gettime 592// timer_settime 593// undelete 594// utrace 595// uuidgen 596// vadvise 597// vfork 598// writev 599