1// Copyright 2009 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// DragonFly BSD 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 "sync" 17 "unsafe" 18) 19 20// See version list in https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/sys/param.h 21var ( 22 osreldateOnce sync.Once 23 osreldate uint32 24) 25 26// First __DragonFly_version after September 2019 ABI changes 27// http://lists.dragonflybsd.org/pipermail/users/2019-September/358280.html 28const _dragonflyABIChangeVersion = 500705 29 30func supportsABI(ver uint32) bool { 31 osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") }) 32 return osreldate >= ver 33} 34 35// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. 36type SockaddrDatalink struct { 37 Len uint8 38 Family uint8 39 Index uint16 40 Type uint8 41 Nlen uint8 42 Alen uint8 43 Slen uint8 44 Data [12]int8 45 Rcf uint16 46 Route [16]uint16 47 raw RawSockaddrDatalink 48} 49 50func anyToSockaddrGOOS(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { 51 return nil, EAFNOSUPPORT 52} 53 54// Translate "kern.hostname" to []_C_int{0,1,2,3}. 55func nametomib(name string) (mib []_C_int, err error) { 56 const siz = unsafe.Sizeof(mib[0]) 57 58 // NOTE(rsc): It seems strange to set the buffer to have 59 // size CTL_MAXNAME+2 but use only CTL_MAXNAME 60 // as the size. I don't know why the +2 is here, but the 61 // kernel uses +2 for its own implementation of this function. 62 // I am scared that if we don't include the +2 here, the kernel 63 // will silently write 2 words farther than we specify 64 // and we'll get memory corruption. 65 var buf [CTL_MAXNAME + 2]_C_int 66 n := uintptr(CTL_MAXNAME) * siz 67 68 p := (*byte)(unsafe.Pointer(&buf[0])) 69 bytes, err := ByteSliceFromString(name) 70 if err != nil { 71 return nil, err 72 } 73 74 // Magic sysctl: "setting" 0.3 to a string name 75 // lets you read back the array of integers form. 76 if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { 77 return nil, err 78 } 79 return buf[0 : n/siz], nil 80} 81 82func direntIno(buf []byte) (uint64, bool) { 83 return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) 84} 85 86func direntReclen(buf []byte) (uint64, bool) { 87 namlen, ok := direntNamlen(buf) 88 if !ok { 89 return 0, false 90 } 91 return (16 + namlen + 1 + 7) &^ 7, true 92} 93 94func direntNamlen(buf []byte) (uint64, bool) { 95 return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) 96} 97 98//sysnb pipe() (r int, w int, err error) 99 100func Pipe(p []int) (err error) { 101 if len(p) != 2 { 102 return EINVAL 103 } 104 p[0], p[1], err = pipe() 105 return 106} 107 108//sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) 109func Pread(fd int, p []byte, offset int64) (n int, err error) { 110 return extpread(fd, p, 0, offset) 111} 112 113//sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) 114func Pwrite(fd int, p []byte, offset int64) (n int, err error) { 115 return extpwrite(fd, p, 0, offset) 116} 117 118func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { 119 var rsa RawSockaddrAny 120 var len _Socklen = SizeofSockaddrAny 121 nfd, err = accept4(fd, &rsa, &len, flags) 122 if err != nil { 123 return 124 } 125 if len > SizeofSockaddrAny { 126 panic("RawSockaddrAny too small") 127 } 128 sa, err = anyToSockaddr(fd, &rsa) 129 if err != nil { 130 Close(nfd) 131 nfd = 0 132 } 133 return 134} 135 136//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD 137 138func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { 139 var _p0 unsafe.Pointer 140 var bufsize uintptr 141 if len(buf) > 0 { 142 _p0 = unsafe.Pointer(&buf[0]) 143 bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) 144 } 145 r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) 146 n = int(r0) 147 if e1 != 0 { 148 err = e1 149 } 150 return 151} 152 153func setattrlistTimes(path string, times []Timespec, flags int) error { 154 // used on Darwin for UtimesNano 155 return ENOSYS 156} 157 158//sys ioctl(fd int, req uint, arg uintptr) (err error) 159 160//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL 161 162func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error { 163 err := sysctl(mib, old, oldlen, nil, 0) 164 if err != nil { 165 // Utsname members on Dragonfly are only 32 bytes and 166 // the syscall returns ENOMEM in case the actual value 167 // is longer. 168 if err == ENOMEM { 169 err = nil 170 } 171 } 172 return err 173} 174 175func Uname(uname *Utsname) error { 176 mib := []_C_int{CTL_KERN, KERN_OSTYPE} 177 n := unsafe.Sizeof(uname.Sysname) 178 if err := sysctlUname(mib, &uname.Sysname[0], &n); err != nil { 179 return err 180 } 181 uname.Sysname[unsafe.Sizeof(uname.Sysname)-1] = 0 182 183 mib = []_C_int{CTL_KERN, KERN_HOSTNAME} 184 n = unsafe.Sizeof(uname.Nodename) 185 if err := sysctlUname(mib, &uname.Nodename[0], &n); err != nil { 186 return err 187 } 188 uname.Nodename[unsafe.Sizeof(uname.Nodename)-1] = 0 189 190 mib = []_C_int{CTL_KERN, KERN_OSRELEASE} 191 n = unsafe.Sizeof(uname.Release) 192 if err := sysctlUname(mib, &uname.Release[0], &n); err != nil { 193 return err 194 } 195 uname.Release[unsafe.Sizeof(uname.Release)-1] = 0 196 197 mib = []_C_int{CTL_KERN, KERN_VERSION} 198 n = unsafe.Sizeof(uname.Version) 199 if err := sysctlUname(mib, &uname.Version[0], &n); err != nil { 200 return err 201 } 202 203 // The version might have newlines or tabs in it, convert them to 204 // spaces. 205 for i, b := range uname.Version { 206 if b == '\n' || b == '\t' { 207 if i == len(uname.Version)-1 { 208 uname.Version[i] = 0 209 } else { 210 uname.Version[i] = ' ' 211 } 212 } 213 } 214 215 mib = []_C_int{CTL_HW, HW_MACHINE} 216 n = unsafe.Sizeof(uname.Machine) 217 if err := sysctlUname(mib, &uname.Machine[0], &n); err != nil { 218 return err 219 } 220 uname.Machine[unsafe.Sizeof(uname.Machine)-1] = 0 221 222 return nil 223} 224 225func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { 226 if raceenabled { 227 raceReleaseMerge(unsafe.Pointer(&ioSync)) 228 } 229 return sendfile(outfd, infd, offset, count) 230} 231 232/* 233 * Exposed directly 234 */ 235//sys Access(path string, mode uint32) (err error) 236//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) 237//sys Chdir(path string) (err error) 238//sys Chflags(path string, flags int) (err error) 239//sys Chmod(path string, mode uint32) (err error) 240//sys Chown(path string, uid int, gid int) (err error) 241//sys Chroot(path string) (err error) 242//sys Close(fd int) (err error) 243//sys Dup(fd int) (nfd int, err error) 244//sys Dup2(from int, to int) (err error) 245//sys Exit(code int) 246//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) 247//sys Fchdir(fd int) (err error) 248//sys Fchflags(fd int, flags int) (err error) 249//sys Fchmod(fd int, mode uint32) (err error) 250//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) 251//sys Fchown(fd int, uid int, gid int) (err error) 252//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) 253//sys Flock(fd int, how int) (err error) 254//sys Fpathconf(fd int, name int) (val int, err error) 255//sys Fstat(fd int, stat *Stat_t) (err error) 256//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) 257//sys Fstatfs(fd int, stat *Statfs_t) (err error) 258//sys Fsync(fd int) (err error) 259//sys Ftruncate(fd int, length int64) (err error) 260//sys Getdents(fd int, buf []byte) (n int, err error) 261//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) 262//sys Getdtablesize() (size int) 263//sysnb Getegid() (egid int) 264//sysnb Geteuid() (uid int) 265//sysnb Getgid() (gid int) 266//sysnb Getpgid(pid int) (pgid int, err error) 267//sysnb Getpgrp() (pgrp int) 268//sysnb Getpid() (pid int) 269//sysnb Getppid() (ppid int) 270//sys Getpriority(which int, who int) (prio int, err error) 271//sysnb Getrlimit(which int, lim *Rlimit) (err error) 272//sysnb Getrusage(who int, rusage *Rusage) (err error) 273//sysnb Getsid(pid int) (sid int, err error) 274//sysnb Gettimeofday(tv *Timeval) (err error) 275//sysnb Getuid() (uid int) 276//sys Issetugid() (tainted bool) 277//sys Kill(pid int, signum syscall.Signal) (err error) 278//sys Kqueue() (fd int, err error) 279//sys Lchown(path string, uid int, gid int) (err error) 280//sys Link(path string, link string) (err error) 281//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) 282//sys Listen(s int, backlog int) (err error) 283//sys Lstat(path string, stat *Stat_t) (err error) 284//sys Mkdir(path string, mode uint32) (err error) 285//sys Mkdirat(dirfd int, path string, mode uint32) (err error) 286//sys Mkfifo(path string, mode uint32) (err error) 287//sys Mknod(path string, mode uint32, dev int) (err error) 288//sys Mknodat(fd int, path string, mode uint32, dev int) (err error) 289//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) 290//sys Open(path string, mode int, perm uint32) (fd int, err error) 291//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) 292//sys Pathconf(path string, name int) (val int, err error) 293//sys read(fd int, p []byte) (n int, err error) 294//sys Readlink(path string, buf []byte) (n int, err error) 295//sys Rename(from string, to string) (err error) 296//sys Renameat(fromfd int, from string, tofd int, to string) (err error) 297//sys Revoke(path string) (err error) 298//sys Rmdir(path string) (err error) 299//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK 300//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) 301//sysnb Setegid(egid int) (err error) 302//sysnb Seteuid(euid int) (err error) 303//sysnb Setgid(gid int) (err error) 304//sys Setlogin(name string) (err error) 305//sysnb Setpgid(pid int, pgid int) (err error) 306//sys Setpriority(which int, who int, prio int) (err error) 307//sysnb Setregid(rgid int, egid int) (err error) 308//sysnb Setreuid(ruid int, euid int) (err error) 309//sysnb Setresgid(rgid int, egid int, sgid int) (err error) 310//sysnb Setresuid(ruid int, euid int, suid int) (err error) 311//sysnb Setrlimit(which int, lim *Rlimit) (err error) 312//sysnb Setsid() (pid int, err error) 313//sysnb Settimeofday(tp *Timeval) (err error) 314//sysnb Setuid(uid int) (err error) 315//sys Stat(path string, stat *Stat_t) (err error) 316//sys Statfs(path string, stat *Statfs_t) (err error) 317//sys Symlink(path string, link string) (err error) 318//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) 319//sys Sync() (err error) 320//sys Truncate(path string, length int64) (err error) 321//sys Umask(newmask int) (oldmask int) 322//sys Undelete(path string) (err error) 323//sys Unlink(path string) (err error) 324//sys Unlinkat(dirfd int, path string, flags int) (err error) 325//sys Unmount(path string, flags int) (err error) 326//sys write(fd int, p []byte) (n int, err error) 327//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) 328//sys munmap(addr uintptr, length uintptr) (err error) 329//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ 330//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE 331//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) 332//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) 333 334/* 335 * Unimplemented 336 * TODO(jsing): Update this list for DragonFly. 337 */ 338// Profil 339// Sigaction 340// Sigprocmask 341// Getlogin 342// Sigpending 343// Sigaltstack 344// Reboot 345// Execve 346// Vfork 347// Sbrk 348// Sstk 349// Ovadvise 350// Mincore 351// Setitimer 352// Swapon 353// Select 354// Sigsuspend 355// Readv 356// Writev 357// Nfssvc 358// Getfh 359// Quotactl 360// Mount 361// Csops 362// Waitid 363// Add_profil 364// Kdebug_trace 365// Sigreturn 366// Atsocket 367// Kqueue_from_portset_np 368// Kqueue_portset 369// Getattrlist 370// Setattrlist 371// Getdirentriesattr 372// Searchfs 373// Delete 374// Copyfile 375// Watchevent 376// Waitevent 377// Modwatch 378// Getxattr 379// Fgetxattr 380// Setxattr 381// Fsetxattr 382// Removexattr 383// Fremovexattr 384// Listxattr 385// Flistxattr 386// Fsctl 387// Initgroups 388// Posix_spawn 389// Nfsclnt 390// Fhopen 391// Minherit 392// Semsys 393// Msgsys 394// Shmsys 395// Semctl 396// Semget 397// Semop 398// Msgctl 399// Msgget 400// Msgsnd 401// Msgrcv 402// Shmat 403// Shmctl 404// Shmdt 405// Shmget 406// Shm_open 407// Shm_unlink 408// Sem_open 409// Sem_close 410// Sem_unlink 411// Sem_wait 412// Sem_trywait 413// Sem_post 414// Sem_getvalue 415// Sem_init 416// Sem_destroy 417// Open_extended 418// Umask_extended 419// Stat_extended 420// Lstat_extended 421// Fstat_extended 422// Chmod_extended 423// Fchmod_extended 424// Access_extended 425// Settid 426// Gettid 427// Setsgroups 428// Getsgroups 429// Setwgroups 430// Getwgroups 431// Mkfifo_extended 432// Mkdir_extended 433// Identitysvc 434// Shared_region_check_np 435// Shared_region_map_np 436// __pthread_mutex_destroy 437// __pthread_mutex_init 438// __pthread_mutex_lock 439// __pthread_mutex_trylock 440// __pthread_mutex_unlock 441// __pthread_cond_init 442// __pthread_cond_destroy 443// __pthread_cond_broadcast 444// __pthread_cond_signal 445// Setsid_with_pid 446// __pthread_cond_timedwait 447// Aio_fsync 448// Aio_return 449// Aio_suspend 450// Aio_cancel 451// Aio_error 452// Aio_read 453// Aio_write 454// Lio_listio 455// __pthread_cond_wait 456// Iopolicysys 457// __pthread_kill 458// __pthread_sigmask 459// __sigwait 460// __disable_threadsignal 461// __pthread_markcancel 462// __pthread_canceled 463// __semwait_signal 464// Proc_info 465// Stat64_extended 466// Lstat64_extended 467// Fstat64_extended 468// __pthread_chdir 469// __pthread_fchdir 470// Audit 471// Auditon 472// Getauid 473// Setauid 474// Getaudit 475// Setaudit 476// Getaudit_addr 477// Setaudit_addr 478// Auditctl 479// Bsdthread_create 480// Bsdthread_terminate 481// Stack_snapshot 482// Bsdthread_register 483// Workq_open 484// Workq_ops 485// __mac_execve 486// __mac_syscall 487// __mac_get_file 488// __mac_set_file 489// __mac_get_link 490// __mac_set_link 491// __mac_get_proc 492// __mac_set_proc 493// __mac_get_fd 494// __mac_set_fd 495// __mac_get_pid 496// __mac_get_lcid 497// __mac_get_lctx 498// __mac_set_lctx 499// Setlcid 500// Read_nocancel 501// Write_nocancel 502// Open_nocancel 503// Close_nocancel 504// Wait4_nocancel 505// Recvmsg_nocancel 506// Sendmsg_nocancel 507// Recvfrom_nocancel 508// Accept_nocancel 509// Fcntl_nocancel 510// Select_nocancel 511// Fsync_nocancel 512// Connect_nocancel 513// Sigsuspend_nocancel 514// Readv_nocancel 515// Writev_nocancel 516// Sendto_nocancel 517// Pread_nocancel 518// Pwrite_nocancel 519// Waitid_nocancel 520// Msgsnd_nocancel 521// Msgrcv_nocancel 522// Sem_wait_nocancel 523// Aio_suspend_nocancel 524// __sigwait_nocancel 525// __semwait_signal_nocancel 526// __mac_mount 527// __mac_get_mount 528// __mac_getfsstat 529