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