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 20type SockaddrDatalink struct { 21 Len uint8 22 Family uint8 23 Index uint16 24 Type uint8 25 Nlen uint8 26 Alen uint8 27 Slen uint8 28 Data [12]int8 29 raw RawSockaddrDatalink 30} 31 32func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) 33 34func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) { 35 var olen uintptr 36 37 // Get a list of all sysctl nodes below the given MIB by performing 38 // a sysctl for the given MIB with CTL_QUERY appended. 39 mib = append(mib, CTL_QUERY) 40 qnode := Sysctlnode{Flags: SYSCTL_VERS_1} 41 qp := (*byte)(unsafe.Pointer(&qnode)) 42 sz := unsafe.Sizeof(qnode) 43 if err = sysctl(mib, nil, &olen, qp, sz); err != nil { 44 return nil, err 45 } 46 47 // Now that we know the size, get the actual nodes. 48 nodes = make([]Sysctlnode, olen/sz) 49 np := (*byte)(unsafe.Pointer(&nodes[0])) 50 if err = sysctl(mib, np, &olen, qp, sz); err != nil { 51 return nil, err 52 } 53 54 return nodes, nil 55} 56 57func nametomib(name string) (mib []_C_int, err error) { 58 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 direntIno(buf []byte) (uint64, bool) { 97 return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) 98} 99 100func direntReclen(buf []byte) (uint64, bool) { 101 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) 102} 103 104func direntNamlen(buf []byte) (uint64, bool) { 105 return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) 106} 107 108//sysnb pipe() (fd1 int, fd2 int, err error) 109func Pipe(p []int) (err error) { 110 if len(p) != 2 { 111 return EINVAL 112 } 113 p[0], p[1], err = pipe() 114 return 115} 116 117//sys getdents(fd int, buf []byte) (n int, err error) 118func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { 119 return getdents(fd, buf) 120} 121 122// TODO 123func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { 124 return -1, ENOSYS 125} 126 127/* 128 * Exposed directly 129 */ 130//sys Access(path string, mode uint32) (err error) 131//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) 132//sys Chdir(path string) (err error) 133//sys Chflags(path string, flags int) (err error) 134//sys Chmod(path string, mode uint32) (err error) 135//sys Chown(path string, uid int, gid int) (err error) 136//sys Chroot(path string) (err error) 137//sys Close(fd int) (err error) 138//sys Dup(fd int) (nfd int, err error) 139//sys Dup2(from int, to int) (err error) 140//sys Exit(code int) 141//sys Fchdir(fd int) (err error) 142//sys Fchflags(fd int, flags int) (err error) 143//sys Fchmod(fd int, mode uint32) (err error) 144//sys Fchown(fd int, uid int, gid int) (err error) 145//sys Flock(fd int, how int) (err error) 146//sys Fpathconf(fd int, name int) (val int, err error) 147//sys Fstat(fd int, stat *Stat_t) (err error) 148//sys Fsync(fd int) (err error) 149//sys Ftruncate(fd int, length int64) (err error) 150//sysnb Getegid() (egid int) 151//sysnb Geteuid() (uid int) 152//sysnb Getgid() (gid int) 153//sysnb Getpgid(pid int) (pgid int, err error) 154//sysnb Getpgrp() (pgrp int) 155//sysnb Getpid() (pid int) 156//sysnb Getppid() (ppid int) 157//sys Getpriority(which int, who int) (prio int, err error) 158//sysnb Getrlimit(which int, lim *Rlimit) (err error) 159//sysnb Getrusage(who int, rusage *Rusage) (err error) 160//sysnb Getsid(pid int) (sid int, err error) 161//sysnb Gettimeofday(tv *Timeval) (err error) 162//sysnb Getuid() (uid int) 163//sys Issetugid() (tainted bool) 164//sys Kill(pid int, signum syscall.Signal) (err error) 165//sys Kqueue() (fd int, err error) 166//sys Lchown(path string, uid int, gid int) (err error) 167//sys Link(path string, link string) (err error) 168//sys Listen(s int, backlog int) (err error) 169//sys Lstat(path string, stat *Stat_t) (err error) 170//sys Mkdir(path string, mode uint32) (err error) 171//sys Mkfifo(path string, mode uint32) (err error) 172//sys Mknod(path string, mode uint32, dev int) (err error) 173//sys Mlock(b []byte) (err error) 174//sys Mlockall(flags int) (err error) 175//sys Mprotect(b []byte, prot int) (err error) 176//sys Munlock(b []byte) (err error) 177//sys Munlockall() (err error) 178//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) 179//sys Open(path string, mode int, perm uint32) (fd int, err error) 180//sys Pathconf(path string, name int) (val int, err error) 181//sys Pread(fd int, p []byte, offset int64) (n int, err error) 182//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) 183//sys read(fd int, p []byte) (n int, err error) 184//sys Readlink(path string, buf []byte) (n int, err error) 185//sys Rename(from string, to string) (err error) 186//sys Revoke(path string) (err error) 187//sys Rmdir(path string) (err error) 188//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK 189//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) 190//sysnb Setegid(egid int) (err error) 191//sysnb Seteuid(euid int) (err error) 192//sysnb Setgid(gid int) (err error) 193//sysnb Setpgid(pid int, pgid int) (err error) 194//sys Setpriority(which int, who int, prio int) (err error) 195//sysnb Setregid(rgid int, egid int) (err error) 196//sysnb Setreuid(ruid int, euid int) (err error) 197//sysnb Setrlimit(which int, lim *Rlimit) (err error) 198//sysnb Setsid() (pid int, err error) 199//sysnb Settimeofday(tp *Timeval) (err error) 200//sysnb Setuid(uid int) (err error) 201//sys Stat(path string, stat *Stat_t) (err error) 202//sys Symlink(path string, link string) (err error) 203//sys Sync() (err error) 204//sys Truncate(path string, length int64) (err error) 205//sys Umask(newmask int) (oldmask int) 206//sys Unlink(path string) (err error) 207//sys Unmount(path string, flags int) (err error) 208//sys write(fd int, p []byte) (n int, err error) 209//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) 210//sys munmap(addr uintptr, length uintptr) (err error) 211//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ 212//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE 213 214/* 215 * Unimplemented 216 */ 217// ____semctl13 218// __clone 219// __fhopen40 220// __fhstat40 221// __fhstatvfs140 222// __fstat30 223// __getcwd 224// __getfh30 225// __getlogin 226// __lstat30 227// __mount50 228// __msgctl13 229// __msync13 230// __ntp_gettime30 231// __posix_chown 232// __posix_fadvise50 233// __posix_fchown 234// __posix_lchown 235// __posix_rename 236// __setlogin 237// __shmctl13 238// __sigaction_sigtramp 239// __sigaltstack14 240// __sigpending14 241// __sigprocmask14 242// __sigsuspend14 243// __sigtimedwait 244// __stat30 245// __syscall 246// __vfork14 247// _ksem_close 248// _ksem_destroy 249// _ksem_getvalue 250// _ksem_init 251// _ksem_open 252// _ksem_post 253// _ksem_trywait 254// _ksem_unlink 255// _ksem_wait 256// _lwp_continue 257// _lwp_create 258// _lwp_ctl 259// _lwp_detach 260// _lwp_exit 261// _lwp_getname 262// _lwp_getprivate 263// _lwp_kill 264// _lwp_park 265// _lwp_self 266// _lwp_setname 267// _lwp_setprivate 268// _lwp_suspend 269// _lwp_unpark 270// _lwp_unpark_all 271// _lwp_wait 272// _lwp_wakeup 273// _pset_bind 274// _sched_getaffinity 275// _sched_getparam 276// _sched_setaffinity 277// _sched_setparam 278// acct 279// aio_cancel 280// aio_error 281// aio_fsync 282// aio_read 283// aio_return 284// aio_suspend 285// aio_write 286// break 287// clock_getres 288// clock_gettime 289// clock_settime 290// compat_09_ogetdomainname 291// compat_09_osetdomainname 292// compat_09_ouname 293// compat_10_omsgsys 294// compat_10_osemsys 295// compat_10_oshmsys 296// compat_12_fstat12 297// compat_12_getdirentries 298// compat_12_lstat12 299// compat_12_msync 300// compat_12_oreboot 301// compat_12_oswapon 302// compat_12_stat12 303// compat_13_sigaction13 304// compat_13_sigaltstack13 305// compat_13_sigpending13 306// compat_13_sigprocmask13 307// compat_13_sigreturn13 308// compat_13_sigsuspend13 309// compat_14___semctl 310// compat_14_msgctl 311// compat_14_shmctl 312// compat_16___sigaction14 313// compat_16___sigreturn14 314// compat_20_fhstatfs 315// compat_20_fstatfs 316// compat_20_getfsstat 317// compat_20_statfs 318// compat_30___fhstat30 319// compat_30___fstat13 320// compat_30___lstat13 321// compat_30___stat13 322// compat_30_fhopen 323// compat_30_fhstat 324// compat_30_fhstatvfs1 325// compat_30_getdents 326// compat_30_getfh 327// compat_30_ntp_gettime 328// compat_30_socket 329// compat_40_mount 330// compat_43_fstat43 331// compat_43_lstat43 332// compat_43_oaccept 333// compat_43_ocreat 334// compat_43_oftruncate 335// compat_43_ogetdirentries 336// compat_43_ogetdtablesize 337// compat_43_ogethostid 338// compat_43_ogethostname 339// compat_43_ogetkerninfo 340// compat_43_ogetpagesize 341// compat_43_ogetpeername 342// compat_43_ogetrlimit 343// compat_43_ogetsockname 344// compat_43_okillpg 345// compat_43_olseek 346// compat_43_ommap 347// compat_43_oquota 348// compat_43_orecv 349// compat_43_orecvfrom 350// compat_43_orecvmsg 351// compat_43_osend 352// compat_43_osendmsg 353// compat_43_osethostid 354// compat_43_osethostname 355// compat_43_osetrlimit 356// compat_43_osigblock 357// compat_43_osigsetmask 358// compat_43_osigstack 359// compat_43_osigvec 360// compat_43_otruncate 361// compat_43_owait 362// compat_43_stat43 363// execve 364// extattr_delete_fd 365// extattr_delete_file 366// extattr_delete_link 367// extattr_get_fd 368// extattr_get_file 369// extattr_get_link 370// extattr_list_fd 371// extattr_list_file 372// extattr_list_link 373// extattr_set_fd 374// extattr_set_file 375// extattr_set_link 376// extattrctl 377// fchroot 378// fdatasync 379// fgetxattr 380// fktrace 381// flistxattr 382// fork 383// fremovexattr 384// fsetxattr 385// fstatvfs1 386// fsync_range 387// getcontext 388// getitimer 389// getvfsstat 390// getxattr 391// ioctl 392// ktrace 393// lchflags 394// lchmod 395// lfs_bmapv 396// lfs_markv 397// lfs_segclean 398// lfs_segwait 399// lgetxattr 400// lio_listio 401// listxattr 402// llistxattr 403// lremovexattr 404// lseek 405// lsetxattr 406// lutimes 407// madvise 408// mincore 409// minherit 410// modctl 411// mq_close 412// mq_getattr 413// mq_notify 414// mq_open 415// mq_receive 416// mq_send 417// mq_setattr 418// mq_timedreceive 419// mq_timedsend 420// mq_unlink 421// mremap 422// msgget 423// msgrcv 424// msgsnd 425// nfssvc 426// ntp_adjtime 427// pmc_control 428// pmc_get_info 429// poll 430// pollts 431// preadv 432// profil 433// pselect 434// pset_assign 435// pset_create 436// pset_destroy 437// ptrace 438// pwritev 439// quotactl 440// rasctl 441// readv 442// reboot 443// removexattr 444// sa_enable 445// sa_preempt 446// sa_register 447// sa_setconcurrency 448// sa_stacks 449// sa_yield 450// sbrk 451// sched_yield 452// semconfig 453// semget 454// semop 455// setcontext 456// setitimer 457// setxattr 458// shmat 459// shmdt 460// shmget 461// sstk 462// statvfs1 463// swapctl 464// sysarch 465// syscall 466// timer_create 467// timer_delete 468// timer_getoverrun 469// timer_gettime 470// timer_settime 471// undelete 472// utrace 473// uuidgen 474// vadvise 475// vfork 476// writev 477