2018-09-30 18:02:42 -07:00
// 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.
// OpenBSD 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 (
"sort"
"syscall"
"unsafe"
)
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
type SockaddrDatalink struct {
Len uint8
Family uint8
Index uint16
Type uint8
Nlen uint8
Alen uint8
Slen uint8
Data [ 24 ] int8
raw RawSockaddrDatalink
}
func Syscall9 ( trap , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9 uintptr ) ( r1 , r2 uintptr , err syscall . Errno )
func nametomib ( name string ) ( mib [ ] _C_int , err error ) {
i := sort . Search ( len ( sysctlMib ) , func ( i int ) bool {
return sysctlMib [ i ] . ctlname >= name
} )
if i < len ( sysctlMib ) && sysctlMib [ i ] . ctlname == name {
return sysctlMib [ i ] . ctloid , nil
}
return nil , EINVAL
}
2019-10-12 06:48:45 +00:00
func direntIno ( buf [ ] byte ) ( uint64 , bool ) {
return readInt ( buf , unsafe . Offsetof ( Dirent { } . Fileno ) , unsafe . Sizeof ( Dirent { } . Fileno ) )
}
func direntReclen ( buf [ ] byte ) ( uint64 , bool ) {
return readInt ( buf , unsafe . Offsetof ( Dirent { } . Reclen ) , unsafe . Sizeof ( Dirent { } . Reclen ) )
}
func direntNamlen ( buf [ ] byte ) ( uint64 , bool ) {
return readInt ( buf , unsafe . Offsetof ( Dirent { } . Namlen ) , unsafe . Sizeof ( Dirent { } . Namlen ) )
}
func SysctlClockinfo ( name string ) ( * Clockinfo , error ) {
mib , err := sysctlmib ( name )
if err != nil {
return nil , err
}
n := uintptr ( SizeofClockinfo )
var ci Clockinfo
if err := sysctl ( mib , ( * byte ) ( unsafe . Pointer ( & ci ) ) , & n , nil , 0 ) ; err != nil {
return nil , err
}
if n != SizeofClockinfo {
return nil , EIO
}
return & ci , nil
}
func SysctlUvmexp ( name string ) ( * Uvmexp , error ) {
mib , err := sysctlmib ( name )
if err != nil {
return nil , err
}
n := uintptr ( SizeofUvmexp )
var u Uvmexp
if err := sysctl ( mib , ( * byte ) ( unsafe . Pointer ( & u ) ) , & n , nil , 0 ) ; err != nil {
return nil , err
}
if n != SizeofUvmexp {
return nil , EIO
}
return & u , nil
}
2018-09-30 18:02:42 -07:00
//sysnb pipe(p *[2]_C_int) (err error)
func Pipe ( p [ ] int ) ( err error ) {
if len ( p ) != 2 {
return EINVAL
}
var pp [ 2 ] _C_int
err = pipe ( & pp )
p [ 0 ] = int ( pp [ 0 ] )
p [ 1 ] = int ( pp [ 1 ] )
return
}
2019-10-12 06:48:45 +00:00
//sys Getdents(fd int, buf []byte) (n int, err error)
2018-09-30 18:02:42 -07:00
func Getdirentries ( fd int , buf [ ] byte , basep * uintptr ) ( n int , err error ) {
2019-10-12 06:48:45 +00:00
n , err = Getdents ( fd , buf )
if err != nil || basep == nil {
return
}
var off int64
off , err = Seek ( fd , 0 , 1 /* SEEK_CUR */ )
if err != nil {
* basep = ^ uintptr ( 0 )
return
}
* basep = uintptr ( off )
if unsafe . Sizeof ( * basep ) == 8 {
return
}
if off >> 32 != 0 {
// We can't stuff the offset back into a uintptr, so any
// future calls would be suspect. Generate an error.
// EIO was allowed by getdirentries.
err = EIO
}
return
2018-09-30 18:02:42 -07:00
}
const ImplementsGetwd = true
//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
func Getwd ( ) ( string , error ) {
var buf [ PathMax ] byte
_ , err := Getcwd ( buf [ 0 : ] )
if err != nil {
return "" , err
}
n := clen ( buf [ : ] )
if n < 1 {
return "" , EINVAL
}
return string ( buf [ : n ] ) , nil
}
2019-10-12 06:48:45 +00:00
func Sendfile ( outfd int , infd int , offset * int64 , count int ) ( written int , err error ) {
if raceenabled {
raceReleaseMerge ( unsafe . Pointer ( & ioSync ) )
}
return sendfile ( outfd , infd , offset , count )
}
2018-09-30 18:02:42 -07:00
// TODO
func sendfile ( outfd int , infd int , offset * int64 , count int ) ( written int , err error ) {
return - 1 , ENOSYS
}
func Getfsstat ( buf [ ] Statfs_t , flags int ) ( n int , err error ) {
var _p0 unsafe . Pointer
var bufsize uintptr
if len ( buf ) > 0 {
_p0 = unsafe . Pointer ( & buf [ 0 ] )
bufsize = unsafe . Sizeof ( Statfs_t { } ) * uintptr ( len ( buf ) )
}
r0 , _ , e1 := Syscall ( SYS_GETFSSTAT , uintptr ( _p0 ) , bufsize , uintptr ( flags ) )
n = int ( r0 )
if e1 != 0 {
err = e1
}
return
}
func setattrlistTimes ( path string , times [ ] Timespec , flags int ) error {
// used on Darwin for UtimesNano
return ENOSYS
}
//sys ioctl(fd int, req uint, arg uintptr) (err error)
// ioctl itself should not be exposed directly, but additional get/set
// functions for specific types are permissible.
// IoctlSetInt performs an ioctl operation which sets an integer value
// on fd, using the specified request number.
func IoctlSetInt ( fd int , req uint , value int ) error {
return ioctl ( fd , req , uintptr ( value ) )
}
func ioctlSetWinsize ( fd int , req uint , value * Winsize ) error {
return ioctl ( fd , req , uintptr ( unsafe . Pointer ( value ) ) )
}
func ioctlSetTermios ( fd int , req uint , value * Termios ) error {
return ioctl ( fd , req , uintptr ( unsafe . Pointer ( value ) ) )
}
// IoctlGetInt performs an ioctl operation which gets an integer value
// from fd, using the specified request number.
func IoctlGetInt ( fd int , req uint ) ( int , error ) {
var value int
err := ioctl ( fd , req , uintptr ( unsafe . Pointer ( & value ) ) )
return value , err
}
func IoctlGetWinsize ( fd int , req uint ) ( * Winsize , error ) {
var value Winsize
err := ioctl ( fd , req , uintptr ( unsafe . Pointer ( & value ) ) )
return & value , err
}
func IoctlGetTermios ( fd int , req uint ) ( * Termios , error ) {
var value Termios
err := ioctl ( fd , req , uintptr ( unsafe . Pointer ( & value ) ) )
return & value , err
}
2019-10-12 06:48:45 +00:00
//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error)
func Ppoll ( fds [ ] PollFd , timeout * Timespec , sigmask * Sigset_t ) ( n int , err error ) {
if len ( fds ) == 0 {
return ppoll ( nil , 0 , timeout , sigmask )
}
return ppoll ( & fds [ 0 ] , len ( fds ) , timeout , sigmask )
}
2018-09-30 18:02:42 -07:00
func Uname ( uname * Utsname ) error {
mib := [ ] _C_int { CTL_KERN , KERN_OSTYPE }
n := unsafe . Sizeof ( uname . Sysname )
if err := sysctl ( mib , & uname . Sysname [ 0 ] , & n , nil , 0 ) ; err != nil {
return err
}
mib = [ ] _C_int { CTL_KERN , KERN_HOSTNAME }
n = unsafe . Sizeof ( uname . Nodename )
if err := sysctl ( mib , & uname . Nodename [ 0 ] , & n , nil , 0 ) ; err != nil {
return err
}
mib = [ ] _C_int { CTL_KERN , KERN_OSRELEASE }
n = unsafe . Sizeof ( uname . Release )
if err := sysctl ( mib , & uname . Release [ 0 ] , & n , nil , 0 ) ; err != nil {
return err
}
mib = [ ] _C_int { CTL_KERN , KERN_VERSION }
n = unsafe . Sizeof ( uname . Version )
if err := sysctl ( mib , & uname . Version [ 0 ] , & n , nil , 0 ) ; err != nil {
return err
}
// The version might have newlines or tabs in it, convert them to
// spaces.
for i , b := range uname . Version {
if b == '\n' || b == '\t' {
if i == len ( uname . Version ) - 1 {
uname . Version [ i ] = 0
} else {
uname . Version [ i ] = ' '
}
}
}
mib = [ ] _C_int { CTL_HW , HW_MACHINE }
n = unsafe . Sizeof ( uname . Machine )
if err := sysctl ( mib , & uname . Machine [ 0 ] , & n , nil , 0 ) ; err != nil {
return err
}
return nil
}
/ *
* 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 Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
//sys Fchdir(fd int) (err error)
//sys Fchflags(fd int, flags int) (err error)
//sys Fchmod(fd int, mode uint32) (err error)
//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
//sys Fchown(fd int, uid int, gid int) (err error)
2019-10-12 06:48:45 +00:00
//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
2018-09-30 18:02:42 -07:00
//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 Fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
//sys Fstatfs(fd int, stat *Statfs_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 Getrtable() (rtable int, 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)
2019-10-12 06:48:45 +00:00
//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error)
2018-09-30 18:02:42 -07:00
//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)
2019-10-12 06:48:45 +00:00
//sys Mkdirat(dirfd int, path string, mode uint32) (err error)
2018-09-30 18:02:42 -07:00
//sys Mkfifo(path string, mode uint32) (err error)
2019-10-12 06:48:45 +00:00
//sys Mkfifoat(dirfd int, path string, mode uint32) (err error)
2018-09-30 18:02:42 -07:00
//sys Mknod(path string, mode uint32, dev int) (err error)
2019-10-12 06:48:45 +00:00
//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
2018-09-30 18:02:42 -07:00
//sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
//sys Open(path string, mode int, perm uint32) (fd int, err error)
2019-10-12 06:48:45 +00:00
//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
2018-09-30 18:02:42 -07:00
//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)
2019-10-12 06:48:45 +00:00
//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
2018-09-30 18:02:42 -07:00
//sys Rename(from string, to string) (err error)
2019-10-12 06:48:45 +00:00
//sys Renameat(fromfd int, from string, tofd int, to string) (err error)
2018-09-30 18:02:42 -07:00
//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)
//sys Setlogin(name string) (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 Setresgid(rgid int, egid int, sgid int) (err error)
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
//sysnb Setrtable(rtable int) (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 Statfs(path string, stat *Statfs_t) (err error)
//sys Symlink(path string, link string) (err error)
2019-10-12 06:48:45 +00:00
//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
2018-09-30 18:02:42 -07:00
//sys Sync() (err error)
//sys Truncate(path string, length int64) (err error)
//sys Umask(newmask int) (oldmask int)
//sys Unlink(path string) (err error)
2019-10-12 06:48:45 +00:00
//sys Unlinkat(dirfd int, path string, flags int) (err error)
2018-09-30 18:02:42 -07:00
//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
//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
/ *
* Unimplemented
* /
// __getcwd
// __semctl
// __syscall
// __sysctl
// adjfreq
// break
// clock_getres
// clock_gettime
// clock_settime
// closefrom
// execve
// fcntl
// fhopen
// fhstat
// fhstatfs
// fork
// futimens
// getfh
// getgid
// getitimer
// getlogin
// getresgid
// getresuid
// getthrid
// ktrace
// lfs_bmapv
// lfs_markv
// lfs_segclean
// lfs_segwait
// mincore
// minherit
// mount
// mquery
// msgctl
// msgget
// msgrcv
// msgsnd
// nfssvc
// nnpfspioctl
// preadv
// profil
// pwritev
// quotactl
// readv
// reboot
// renameat
// rfork
// sched_yield
// semget
// semop
// setgroups
// setitimer
// setsockopt
// shmat
// shmctl
// shmdt
// shmget
// sigaction
// sigaltstack
// sigpending
// sigprocmask
// sigreturn
// sigsuspend
// sysarch
// syscall
// threxit
// thrsigdivert
// thrsleep
// thrwakeup
// vfork
// writev