blob: 21b8092cdd16bf4f6cd379f5aad02dd79094344f [file] [log] [blame]
khenaidooac637102019-01-14 15:44:34 -05001// 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// Darwin 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 (
khenaidooac637102019-01-14 15:44:34 -050016 "syscall"
17 "unsafe"
18)
19
khenaidooac637102019-01-14 15:44:34 -050020// 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
Andrea Campanella3614a922021-02-25 12:40:42 +010033// Some external packages rely on SYS___SYSCTL being defined to implement their
34// own sysctl wrappers. Provide it here, even though direct syscalls are no
35// longer supported on darwin.
36const SYS___SYSCTL = 202
37
khenaidooac637102019-01-14 15:44:34 -050038// Translate "kern.hostname" to []_C_int{0,1,2,3}.
39func nametomib(name string) (mib []_C_int, err error) {
40 const siz = unsafe.Sizeof(mib[0])
41
42 // NOTE(rsc): It seems strange to set the buffer to have
43 // size CTL_MAXNAME+2 but use only CTL_MAXNAME
44 // as the size. I don't know why the +2 is here, but the
45 // kernel uses +2 for its own implementation of this function.
46 // I am scared that if we don't include the +2 here, the kernel
47 // will silently write 2 words farther than we specify
48 // and we'll get memory corruption.
49 var buf [CTL_MAXNAME + 2]_C_int
50 n := uintptr(CTL_MAXNAME) * siz
51
52 p := (*byte)(unsafe.Pointer(&buf[0]))
53 bytes, err := ByteSliceFromString(name)
54 if err != nil {
55 return nil, err
56 }
57
58 // Magic sysctl: "setting" 0.3 to a string name
59 // lets you read back the array of integers form.
60 if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {
61 return nil, err
62 }
63 return buf[0 : n/siz], nil
64}
65
Scott Baker8461e152019-10-01 14:44:30 -070066func direntIno(buf []byte) (uint64, bool) {
67 return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
68}
69
70func direntReclen(buf []byte) (uint64, bool) {
71 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
72}
73
74func direntNamlen(buf []byte) (uint64, bool) {
75 return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
76}
77
khenaidooac637102019-01-14 15:44:34 -050078func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
79func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
80
khenaidooac637102019-01-14 15:44:34 -050081type attrList struct {
82 bitmapCount uint16
83 _ uint16
84 CommonAttr uint32
85 VolAttr uint32
86 DirAttr uint32
87 FileAttr uint32
88 Forkattr uint32
89}
90
khenaidooac637102019-01-14 15:44:34 -050091//sysnb pipe() (r int, w int, err error)
92
93func Pipe(p []int) (err error) {
94 if len(p) != 2 {
95 return EINVAL
96 }
97 p[0], p[1], err = pipe()
98 return
99}
100
101func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
102 var _p0 unsafe.Pointer
103 var bufsize uintptr
104 if len(buf) > 0 {
105 _p0 = unsafe.Pointer(&buf[0])
106 bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
107 }
108 return getfsstat(_p0, bufsize, flags)
109}
110
111func xattrPointer(dest []byte) *byte {
112 // It's only when dest is set to NULL that the OS X implementations of
113 // getxattr() and listxattr() return the current sizes of the named attributes.
114 // An empty byte array is not sufficient. To maintain the same behaviour as the
115 // linux implementation, we wrap around the system calls and pass in NULL when
116 // dest is empty.
117 var destp *byte
118 if len(dest) > 0 {
119 destp = &dest[0]
120 }
121 return destp
122}
123
124//sys getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error)
125
126func Getxattr(path string, attr string, dest []byte) (sz int, err error) {
127 return getxattr(path, attr, xattrPointer(dest), len(dest), 0, 0)
128}
129
130func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) {
131 return getxattr(link, attr, xattrPointer(dest), len(dest), 0, XATTR_NOFOLLOW)
132}
133
134//sys fgetxattr(fd int, attr string, dest *byte, size int, position uint32, options int) (sz int, err error)
135
136func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) {
137 return fgetxattr(fd, attr, xattrPointer(dest), len(dest), 0, 0)
138}
139
140//sys setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error)
141
142func Setxattr(path string, attr string, data []byte, flags int) (err error) {
143 // The parameters for the OS X implementation vary slightly compared to the
144 // linux system call, specifically the position parameter:
145 //
146 // linux:
147 // int setxattr(
148 // const char *path,
149 // const char *name,
150 // const void *value,
151 // size_t size,
152 // int flags
153 // );
154 //
155 // darwin:
156 // int setxattr(
157 // const char *path,
158 // const char *name,
159 // void *value,
160 // size_t size,
161 // u_int32_t position,
162 // int options
163 // );
164 //
165 // position specifies the offset within the extended attribute. In the
166 // current implementation, only the resource fork extended attribute makes
167 // use of this argument. For all others, position is reserved. We simply
168 // default to setting it to zero.
169 return setxattr(path, attr, xattrPointer(data), len(data), 0, flags)
170}
171
172func Lsetxattr(link string, attr string, data []byte, flags int) (err error) {
173 return setxattr(link, attr, xattrPointer(data), len(data), 0, flags|XATTR_NOFOLLOW)
174}
175
176//sys fsetxattr(fd int, attr string, data *byte, size int, position uint32, options int) (err error)
177
178func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) {
179 return fsetxattr(fd, attr, xattrPointer(data), len(data), 0, 0)
180}
181
182//sys removexattr(path string, attr string, options int) (err error)
183
184func Removexattr(path string, attr string) (err error) {
185 // We wrap around and explicitly zero out the options provided to the OS X
186 // implementation of removexattr, we do so for interoperability with the
187 // linux variant.
188 return removexattr(path, attr, 0)
189}
190
191func Lremovexattr(link string, attr string) (err error) {
192 return removexattr(link, attr, XATTR_NOFOLLOW)
193}
194
195//sys fremovexattr(fd int, attr string, options int) (err error)
196
197func Fremovexattr(fd int, attr string) (err error) {
198 return fremovexattr(fd, attr, 0)
199}
200
201//sys listxattr(path string, dest *byte, size int, options int) (sz int, err error)
202
203func Listxattr(path string, dest []byte) (sz int, err error) {
204 return listxattr(path, xattrPointer(dest), len(dest), 0)
205}
206
207func Llistxattr(link string, dest []byte) (sz int, err error) {
208 return listxattr(link, xattrPointer(dest), len(dest), XATTR_NOFOLLOW)
209}
210
211//sys flistxattr(fd int, dest *byte, size int, options int) (sz int, err error)
212
213func Flistxattr(fd int, dest []byte) (sz int, err error) {
214 return flistxattr(fd, xattrPointer(dest), len(dest), 0)
215}
216
217func setattrlistTimes(path string, times []Timespec, flags int) error {
218 _p0, err := BytePtrFromString(path)
219 if err != nil {
220 return err
221 }
222
223 var attrList attrList
224 attrList.bitmapCount = ATTR_BIT_MAP_COUNT
225 attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME
226
227 // order is mtime, atime: the opposite of Chtimes
228 attributes := [2]Timespec{times[1], times[0]}
229 options := 0
230 if flags&AT_SYMLINK_NOFOLLOW != 0 {
231 options |= FSOPT_NOFOLLOW
232 }
233 return setattrlist(
234 _p0,
235 unsafe.Pointer(&attrList),
236 unsafe.Pointer(&attributes),
237 unsafe.Sizeof(attributes),
238 options)
239}
240
241//sys setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error)
242
243func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error {
244 // Darwin doesn't support SYS_UTIMENSAT
245 return ENOSYS
246}
247
248/*
249 * Wrapped
250 */
251
Andrea Campanella3614a922021-02-25 12:40:42 +0100252//sys fcntl(fd int, cmd int, arg int) (val int, err error)
253
khenaidooac637102019-01-14 15:44:34 -0500254//sys kill(pid int, signum int, posix int) (err error)
255
256func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) }
257
258//sys ioctl(fd int, req uint, arg uintptr) (err error)
259
Andrea Campanella3614a922021-02-25 12:40:42 +0100260//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL
261
khenaidooac637102019-01-14 15:44:34 -0500262func Uname(uname *Utsname) error {
263 mib := []_C_int{CTL_KERN, KERN_OSTYPE}
264 n := unsafe.Sizeof(uname.Sysname)
265 if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
266 return err
267 }
268
269 mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
270 n = unsafe.Sizeof(uname.Nodename)
271 if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
272 return err
273 }
274
275 mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
276 n = unsafe.Sizeof(uname.Release)
277 if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
278 return err
279 }
280
281 mib = []_C_int{CTL_KERN, KERN_VERSION}
282 n = unsafe.Sizeof(uname.Version)
283 if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
284 return err
285 }
286
287 // The version might have newlines or tabs in it, convert them to
288 // spaces.
289 for i, b := range uname.Version {
290 if b == '\n' || b == '\t' {
291 if i == len(uname.Version)-1 {
292 uname.Version[i] = 0
293 } else {
294 uname.Version[i] = ' '
295 }
296 }
297 }
298
299 mib = []_C_int{CTL_HW, HW_MACHINE}
300 n = unsafe.Sizeof(uname.Machine)
301 if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
302 return err
303 }
304
305 return nil
306}
307
308func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
309 if raceenabled {
310 raceReleaseMerge(unsafe.Pointer(&ioSync))
311 }
312 var length = int64(count)
313 err = sendfile(infd, outfd, *offset, &length, nil, 0)
314 written = int(length)
315 return
316}
317
318//sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error)
319
320/*
321 * Exposed directly
322 */
323//sys Access(path string, mode uint32) (err error)
324//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
325//sys Chdir(path string) (err error)
326//sys Chflags(path string, flags int) (err error)
327//sys Chmod(path string, mode uint32) (err error)
328//sys Chown(path string, uid int, gid int) (err error)
329//sys Chroot(path string) (err error)
Stephane Barbarie260a5632019-02-26 16:12:49 -0500330//sys ClockGettime(clockid int32, time *Timespec) (err error)
khenaidooac637102019-01-14 15:44:34 -0500331//sys Close(fd int) (err error)
Andrea Campanella3614a922021-02-25 12:40:42 +0100332//sys Clonefile(src string, dst string, flags int) (err error)
333//sys Clonefileat(srcDirfd int, src string, dstDirfd int, dst string, flags int) (err error)
khenaidooac637102019-01-14 15:44:34 -0500334//sys Dup(fd int) (nfd int, err error)
335//sys Dup2(from int, to int) (err error)
336//sys Exchangedata(path1 string, path2 string, options int) (err error)
337//sys Exit(code int)
338//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
339//sys Fchdir(fd int) (err error)
340//sys Fchflags(fd int, flags int) (err error)
341//sys Fchmod(fd int, mode uint32) (err error)
342//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
343//sys Fchown(fd int, uid int, gid int) (err error)
344//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
Andrea Campanella3614a922021-02-25 12:40:42 +0100345//sys Fclonefileat(srcDirfd int, dstDirfd int, dst string, flags int) (err error)
khenaidooac637102019-01-14 15:44:34 -0500346//sys Flock(fd int, how int) (err error)
347//sys Fpathconf(fd int, name int) (val int, err error)
348//sys Fsync(fd int) (err error)
349//sys Ftruncate(fd int, length int64) (err error)
Andrea Campanella3614a922021-02-25 12:40:42 +0100350//sys Getcwd(buf []byte) (n int, err error)
khenaidooac637102019-01-14 15:44:34 -0500351//sys Getdtablesize() (size int)
352//sysnb Getegid() (egid int)
353//sysnb Geteuid() (uid int)
354//sysnb Getgid() (gid int)
355//sysnb Getpgid(pid int) (pgid int, err error)
356//sysnb Getpgrp() (pgrp int)
357//sysnb Getpid() (pid int)
358//sysnb Getppid() (ppid int)
359//sys Getpriority(which int, who int) (prio int, err error)
360//sysnb Getrlimit(which int, lim *Rlimit) (err error)
361//sysnb Getrusage(who int, rusage *Rusage) (err error)
362//sysnb Getsid(pid int) (sid int, err error)
Andrea Campanella3614a922021-02-25 12:40:42 +0100363//sysnb Gettimeofday(tp *Timeval) (err error)
khenaidooac637102019-01-14 15:44:34 -0500364//sysnb Getuid() (uid int)
365//sysnb Issetugid() (tainted bool)
366//sys Kqueue() (fd int, err error)
367//sys Lchown(path string, uid int, gid int) (err error)
368//sys Link(path string, link string) (err error)
369//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error)
370//sys Listen(s int, backlog int) (err error)
371//sys Mkdir(path string, mode uint32) (err error)
372//sys Mkdirat(dirfd int, path string, mode uint32) (err error)
373//sys Mkfifo(path string, mode uint32) (err error)
374//sys Mknod(path string, mode uint32, dev int) (err error)
375//sys Open(path string, mode int, perm uint32) (fd int, err error)
376//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
377//sys Pathconf(path string, name int) (val int, err error)
378//sys Pread(fd int, p []byte, offset int64) (n int, err error)
379//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
380//sys read(fd int, p []byte) (n int, err error)
381//sys Readlink(path string, buf []byte) (n int, err error)
382//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
383//sys Rename(from string, to string) (err error)
384//sys Renameat(fromfd int, from string, tofd int, to string) (err error)
385//sys Revoke(path string) (err error)
386//sys Rmdir(path string) (err error)
387//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
Scott Baker8461e152019-10-01 14:44:30 -0700388//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
khenaidooac637102019-01-14 15:44:34 -0500389//sys Setegid(egid int) (err error)
390//sysnb Seteuid(euid int) (err error)
391//sysnb Setgid(gid int) (err error)
392//sys Setlogin(name string) (err error)
393//sysnb Setpgid(pid int, pgid int) (err error)
394//sys Setpriority(which int, who int, prio int) (err error)
395//sys Setprivexec(flag int) (err error)
396//sysnb Setregid(rgid int, egid int) (err error)
397//sysnb Setreuid(ruid int, euid int) (err error)
398//sysnb Setrlimit(which int, lim *Rlimit) (err error)
399//sysnb Setsid() (pid int, err error)
400//sysnb Settimeofday(tp *Timeval) (err error)
401//sysnb Setuid(uid int) (err error)
402//sys Symlink(path string, link string) (err error)
403//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
404//sys Sync() (err error)
405//sys Truncate(path string, length int64) (err error)
406//sys Umask(newmask int) (oldmask int)
407//sys Undelete(path string) (err error)
408//sys Unlink(path string) (err error)
409//sys Unlinkat(dirfd int, path string, flags int) (err error)
410//sys Unmount(path string, flags int) (err error)
411//sys write(fd int, p []byte) (n int, err error)
412//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
413//sys munmap(addr uintptr, length uintptr) (err error)
414//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
415//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
416
417/*
418 * Unimplemented
419 */
420// Profil
421// Sigaction
422// Sigprocmask
423// Getlogin
424// Sigpending
425// Sigaltstack
426// Ioctl
427// Reboot
428// Execve
429// Vfork
430// Sbrk
431// Sstk
432// Ovadvise
433// Mincore
434// Setitimer
435// Swapon
436// Select
437// Sigsuspend
438// Readv
439// Writev
440// Nfssvc
441// Getfh
442// Quotactl
443// Mount
444// Csops
445// Waitid
446// Add_profil
447// Kdebug_trace
448// Sigreturn
449// Atsocket
450// Kqueue_from_portset_np
451// Kqueue_portset
452// Getattrlist
453// Setattrlist
454// Getdirentriesattr
455// Searchfs
456// Delete
457// Copyfile
458// Watchevent
459// Waitevent
460// Modwatch
461// Fsctl
462// Initgroups
463// Posix_spawn
464// Nfsclnt
465// Fhopen
466// Minherit
467// Semsys
468// Msgsys
469// Shmsys
470// Semctl
471// Semget
472// Semop
473// Msgctl
474// Msgget
475// Msgsnd
476// Msgrcv
477// Shmat
478// Shmctl
479// Shmdt
480// Shmget
481// Shm_open
482// Shm_unlink
483// Sem_open
484// Sem_close
485// Sem_unlink
486// Sem_wait
487// Sem_trywait
488// Sem_post
489// Sem_getvalue
490// Sem_init
491// Sem_destroy
492// Open_extended
493// Umask_extended
494// Stat_extended
495// Lstat_extended
496// Fstat_extended
497// Chmod_extended
498// Fchmod_extended
499// Access_extended
500// Settid
501// Gettid
502// Setsgroups
503// Getsgroups
504// Setwgroups
505// Getwgroups
506// Mkfifo_extended
507// Mkdir_extended
508// Identitysvc
509// Shared_region_check_np
510// Shared_region_map_np
511// __pthread_mutex_destroy
512// __pthread_mutex_init
513// __pthread_mutex_lock
514// __pthread_mutex_trylock
515// __pthread_mutex_unlock
516// __pthread_cond_init
517// __pthread_cond_destroy
518// __pthread_cond_broadcast
519// __pthread_cond_signal
520// Setsid_with_pid
521// __pthread_cond_timedwait
522// Aio_fsync
523// Aio_return
524// Aio_suspend
525// Aio_cancel
526// Aio_error
527// Aio_read
528// Aio_write
529// Lio_listio
530// __pthread_cond_wait
531// Iopolicysys
532// __pthread_kill
533// __pthread_sigmask
534// __sigwait
535// __disable_threadsignal
536// __pthread_markcancel
537// __pthread_canceled
538// __semwait_signal
539// Proc_info
540// sendfile
541// Stat64_extended
542// Lstat64_extended
543// Fstat64_extended
544// __pthread_chdir
545// __pthread_fchdir
546// Audit
547// Auditon
548// Getauid
549// Setauid
550// Getaudit
551// Setaudit
552// Getaudit_addr
553// Setaudit_addr
554// Auditctl
555// Bsdthread_create
556// Bsdthread_terminate
557// Stack_snapshot
558// Bsdthread_register
559// Workq_open
560// Workq_ops
561// __mac_execve
562// __mac_syscall
563// __mac_get_file
564// __mac_set_file
565// __mac_get_link
566// __mac_set_link
567// __mac_get_proc
568// __mac_set_proc
569// __mac_get_fd
570// __mac_set_fd
571// __mac_get_pid
572// __mac_get_lcid
573// __mac_get_lctx
574// __mac_set_lctx
575// Setlcid
576// Read_nocancel
577// Write_nocancel
578// Open_nocancel
579// Close_nocancel
580// Wait4_nocancel
581// Recvmsg_nocancel
582// Sendmsg_nocancel
583// Recvfrom_nocancel
584// Accept_nocancel
585// Fcntl_nocancel
586// Select_nocancel
587// Fsync_nocancel
588// Connect_nocancel
589// Sigsuspend_nocancel
590// Readv_nocancel
591// Writev_nocancel
592// Sendto_nocancel
593// Pread_nocancel
594// Pwrite_nocancel
595// Waitid_nocancel
596// Poll_nocancel
597// Msgsnd_nocancel
598// Msgrcv_nocancel
599// Sem_wait_nocancel
600// Aio_suspend_nocancel
601// __sigwait_nocancel
602// __semwait_signal_nocancel
603// __mac_mount
604// __mac_get_mount
605// __mac_getfsstat