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// 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 (
16	"fmt"
17	"runtime"
18	"syscall"
19	"unsafe"
20)
21
22// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
23type SockaddrDatalink struct {
24	Len    uint8
25	Family uint8
26	Index  uint16
27	Type   uint8
28	Nlen   uint8
29	Alen   uint8
30	Slen   uint8
31	Data   [12]int8
32	raw    RawSockaddrDatalink
33}
34
35// SockaddrCtl implements the Sockaddr interface for AF_SYSTEM type sockets.
36type SockaddrCtl struct {
37	ID   uint32
38	Unit uint32
39	raw  RawSockaddrCtl
40}
41
42func (sa *SockaddrCtl) sockaddr() (unsafe.Pointer, _Socklen, error) {
43	sa.raw.Sc_len = SizeofSockaddrCtl
44	sa.raw.Sc_family = AF_SYSTEM
45	sa.raw.Ss_sysaddr = AF_SYS_CONTROL
46	sa.raw.Sc_id = sa.ID
47	sa.raw.Sc_unit = sa.Unit
48	return unsafe.Pointer(&sa.raw), SizeofSockaddrCtl, nil
49}
50
51// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets.
52// SockaddrVM provides access to Darwin VM sockets: a mechanism that enables
53// bidirectional communication between a hypervisor and its guest virtual
54// machines.
55type SockaddrVM struct {
56	// CID and Port specify a context ID and port address for a VM socket.
57	// Guests have a unique CID, and hosts may have a well-known CID of:
58	//  - VMADDR_CID_HYPERVISOR: refers to the hypervisor process.
59	//  - VMADDR_CID_LOCAL: refers to local communication (loopback).
60	//  - VMADDR_CID_HOST: refers to other processes on the host.
61	CID  uint32
62	Port uint32
63	raw  RawSockaddrVM
64}
65
66func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) {
67	sa.raw.Len = SizeofSockaddrVM
68	sa.raw.Family = AF_VSOCK
69	sa.raw.Port = sa.Port
70	sa.raw.Cid = sa.CID
71
72	return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil
73}
74
75func anyToSockaddrGOOS(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
76	switch rsa.Addr.Family {
77	case AF_SYSTEM:
78		pp := (*RawSockaddrCtl)(unsafe.Pointer(rsa))
79		if pp.Ss_sysaddr == AF_SYS_CONTROL {
80			sa := new(SockaddrCtl)
81			sa.ID = pp.Sc_id
82			sa.Unit = pp.Sc_unit
83			return sa, nil
84		}
85	case AF_VSOCK:
86		pp := (*RawSockaddrVM)(unsafe.Pointer(rsa))
87		sa := &SockaddrVM{
88			CID:  pp.Cid,
89			Port: pp.Port,
90		}
91		return sa, nil
92	}
93	return nil, EAFNOSUPPORT
94}
95
96// Some external packages rely on SYS___SYSCTL being defined to implement their
97// own sysctl wrappers. Provide it here, even though direct syscalls are no
98// longer supported on darwin.
99const SYS___SYSCTL = SYS_SYSCTL
100
101// Translate "kern.hostname" to []_C_int{0,1,2,3}.
102func nametomib(name string) (mib []_C_int, err error) {
103	const siz = unsafe.Sizeof(mib[0])
104
105	// NOTE(rsc): It seems strange to set the buffer to have
106	// size CTL_MAXNAME+2 but use only CTL_MAXNAME
107	// as the size. I don't know why the +2 is here, but the
108	// kernel uses +2 for its own implementation of this function.
109	// I am scared that if we don't include the +2 here, the kernel
110	// will silently write 2 words farther than we specify
111	// and we'll get memory corruption.
112	var buf [CTL_MAXNAME + 2]_C_int
113	n := uintptr(CTL_MAXNAME) * siz
114
115	p := (*byte)(unsafe.Pointer(&buf[0]))
116	bytes, err := ByteSliceFromString(name)
117	if err != nil {
118		return nil, err
119	}
120
121	// Magic sysctl: "setting" 0.3 to a string name
122	// lets you read back the array of integers form.
123	if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {
124		return nil, err
125	}
126	return buf[0 : n/siz], nil
127}
128
129func direntIno(buf []byte) (uint64, bool) {
130	return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
131}
132
133func direntReclen(buf []byte) (uint64, bool) {
134	return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
135}
136
137func direntNamlen(buf []byte) (uint64, bool) {
138	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
139}
140
141func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
142func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
143
144type attrList struct {
145	bitmapCount uint16
146	_           uint16
147	CommonAttr  uint32
148	VolAttr     uint32
149	DirAttr     uint32
150	FileAttr    uint32
151	Forkattr    uint32
152}
153
154//sysnb	pipe(p *[2]int32) (err error)
155
156func Pipe(p []int) (err error) {
157	if len(p) != 2 {
158		return EINVAL
159	}
160	var x [2]int32
161	err = pipe(&x)
162	p[0] = int(x[0])
163	p[1] = int(x[1])
164	return
165}
166
167func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
168	var _p0 unsafe.Pointer
169	var bufsize uintptr
170	if len(buf) > 0 {
171		_p0 = unsafe.Pointer(&buf[0])
172		bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
173	}
174	return getfsstat(_p0, bufsize, flags)
175}
176
177func xattrPointer(dest []byte) *byte {
178	// It's only when dest is set to NULL that the OS X implementations of
179	// getxattr() and listxattr() return the current sizes of the named attributes.
180	// An empty byte array is not sufficient. To maintain the same behaviour as the
181	// linux implementation, we wrap around the system calls and pass in NULL when
182	// dest is empty.
183	var destp *byte
184	if len(dest) > 0 {
185		destp = &dest[0]
186	}
187	return destp
188}
189
190//sys	getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error)
191
192func Getxattr(path string, attr string, dest []byte) (sz int, err error) {
193	return getxattr(path, attr, xattrPointer(dest), len(dest), 0, 0)
194}
195
196func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) {
197	return getxattr(link, attr, xattrPointer(dest), len(dest), 0, XATTR_NOFOLLOW)
198}
199
200//sys	fgetxattr(fd int, attr string, dest *byte, size int, position uint32, options int) (sz int, err error)
201
202func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) {
203	return fgetxattr(fd, attr, xattrPointer(dest), len(dest), 0, 0)
204}
205
206//sys	setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error)
207
208func Setxattr(path string, attr string, data []byte, flags int) (err error) {
209	// The parameters for the OS X implementation vary slightly compared to the
210	// linux system call, specifically the position parameter:
211	//
212	//  linux:
213	//      int setxattr(
214	//          const char *path,
215	//          const char *name,
216	//          const void *value,
217	//          size_t size,
218	//          int flags
219	//      );
220	//
221	//  darwin:
222	//      int setxattr(
223	//          const char *path,
224	//          const char *name,
225	//          void *value,
226	//          size_t size,
227	//          u_int32_t position,
228	//          int options
229	//      );
230	//
231	// position specifies the offset within the extended attribute. In the
232	// current implementation, only the resource fork extended attribute makes
233	// use of this argument. For all others, position is reserved. We simply
234	// default to setting it to zero.
235	return setxattr(path, attr, xattrPointer(data), len(data), 0, flags)
236}
237
238func Lsetxattr(link string, attr string, data []byte, flags int) (err error) {
239	return setxattr(link, attr, xattrPointer(data), len(data), 0, flags|XATTR_NOFOLLOW)
240}
241
242//sys	fsetxattr(fd int, attr string, data *byte, size int, position uint32, options int) (err error)
243
244func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) {
245	return fsetxattr(fd, attr, xattrPointer(data), len(data), 0, 0)
246}
247
248//sys	removexattr(path string, attr string, options int) (err error)
249
250func Removexattr(path string, attr string) (err error) {
251	// We wrap around and explicitly zero out the options provided to the OS X
252	// implementation of removexattr, we do so for interoperability with the
253	// linux variant.
254	return removexattr(path, attr, 0)
255}
256
257func Lremovexattr(link string, attr string) (err error) {
258	return removexattr(link, attr, XATTR_NOFOLLOW)
259}
260
261//sys	fremovexattr(fd int, attr string, options int) (err error)
262
263func Fremovexattr(fd int, attr string) (err error) {
264	return fremovexattr(fd, attr, 0)
265}
266
267//sys	listxattr(path string, dest *byte, size int, options int) (sz int, err error)
268
269func Listxattr(path string, dest []byte) (sz int, err error) {
270	return listxattr(path, xattrPointer(dest), len(dest), 0)
271}
272
273func Llistxattr(link string, dest []byte) (sz int, err error) {
274	return listxattr(link, xattrPointer(dest), len(dest), XATTR_NOFOLLOW)
275}
276
277//sys	flistxattr(fd int, dest *byte, size int, options int) (sz int, err error)
278
279func Flistxattr(fd int, dest []byte) (sz int, err error) {
280	return flistxattr(fd, xattrPointer(dest), len(dest), 0)
281}
282
283func setattrlistTimes(path string, times []Timespec, flags int) error {
284	_p0, err := BytePtrFromString(path)
285	if err != nil {
286		return err
287	}
288
289	var attrList attrList
290	attrList.bitmapCount = ATTR_BIT_MAP_COUNT
291	attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME
292
293	// order is mtime, atime: the opposite of Chtimes
294	attributes := [2]Timespec{times[1], times[0]}
295	options := 0
296	if flags&AT_SYMLINK_NOFOLLOW != 0 {
297		options |= FSOPT_NOFOLLOW
298	}
299	return setattrlist(
300		_p0,
301		unsafe.Pointer(&attrList),
302		unsafe.Pointer(&attributes),
303		unsafe.Sizeof(attributes),
304		options)
305}
306
307//sys	setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error)
308
309func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error {
310	// Darwin doesn't support SYS_UTIMENSAT
311	return ENOSYS
312}
313
314/*
315 * Wrapped
316 */
317
318//sys	fcntl(fd int, cmd int, arg int) (val int, err error)
319
320//sys	kill(pid int, signum int, posix int) (err error)
321
322func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) }
323
324//sys	ioctl(fd int, req uint, arg uintptr) (err error)
325
326func IoctlCtlInfo(fd int, ctlInfo *CtlInfo) error {
327	err := ioctl(fd, CTLIOCGINFO, uintptr(unsafe.Pointer(ctlInfo)))
328	runtime.KeepAlive(ctlInfo)
329	return err
330}
331
332// IfreqMTU is struct ifreq used to get or set a network device's MTU.
333type IfreqMTU struct {
334	Name [IFNAMSIZ]byte
335	MTU  int32
336}
337
338// IoctlGetIfreqMTU performs the SIOCGIFMTU ioctl operation on fd to get the MTU
339// of the network device specified by ifname.
340func IoctlGetIfreqMTU(fd int, ifname string) (*IfreqMTU, error) {
341	var ifreq IfreqMTU
342	copy(ifreq.Name[:], ifname)
343	err := ioctl(fd, SIOCGIFMTU, uintptr(unsafe.Pointer(&ifreq)))
344	return &ifreq, err
345}
346
347// IoctlSetIfreqMTU performs the SIOCSIFMTU ioctl operation on fd to set the MTU
348// of the network device specified by ifreq.Name.
349func IoctlSetIfreqMTU(fd int, ifreq *IfreqMTU) error {
350	err := ioctl(fd, SIOCSIFMTU, uintptr(unsafe.Pointer(ifreq)))
351	runtime.KeepAlive(ifreq)
352	return err
353}
354
355//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL
356
357func Uname(uname *Utsname) error {
358	mib := []_C_int{CTL_KERN, KERN_OSTYPE}
359	n := unsafe.Sizeof(uname.Sysname)
360	if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
361		return err
362	}
363
364	mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
365	n = unsafe.Sizeof(uname.Nodename)
366	if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
367		return err
368	}
369
370	mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
371	n = unsafe.Sizeof(uname.Release)
372	if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
373		return err
374	}
375
376	mib = []_C_int{CTL_KERN, KERN_VERSION}
377	n = unsafe.Sizeof(uname.Version)
378	if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
379		return err
380	}
381
382	// The version might have newlines or tabs in it, convert them to
383	// spaces.
384	for i, b := range uname.Version {
385		if b == '\n' || b == '\t' {
386			if i == len(uname.Version)-1 {
387				uname.Version[i] = 0
388			} else {
389				uname.Version[i] = ' '
390			}
391		}
392	}
393
394	mib = []_C_int{CTL_HW, HW_MACHINE}
395	n = unsafe.Sizeof(uname.Machine)
396	if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
397		return err
398	}
399
400	return nil
401}
402
403func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
404	if raceenabled {
405		raceReleaseMerge(unsafe.Pointer(&ioSync))
406	}
407	var length = int64(count)
408	err = sendfile(infd, outfd, *offset, &length, nil, 0)
409	written = int(length)
410	return
411}
412
413func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
414	var value IPMreqn
415	vallen := _Socklen(SizeofIPMreqn)
416	errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
417	return &value, errno
418}
419
420func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
421	return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
422}
423
424// GetsockoptXucred is a getsockopt wrapper that returns an Xucred struct.
425// The usual level and opt are SOL_LOCAL and LOCAL_PEERCRED, respectively.
426func GetsockoptXucred(fd, level, opt int) (*Xucred, error) {
427	x := new(Xucred)
428	vallen := _Socklen(SizeofXucred)
429	err := getsockopt(fd, level, opt, unsafe.Pointer(x), &vallen)
430	return x, err
431}
432
433func SysctlKinfoProc(name string, args ...int) (*KinfoProc, error) {
434	mib, err := sysctlmib(name, args...)
435	if err != nil {
436		return nil, err
437	}
438
439	var kinfo KinfoProc
440	n := uintptr(SizeofKinfoProc)
441	if err := sysctl(mib, (*byte)(unsafe.Pointer(&kinfo)), &n, nil, 0); err != nil {
442		return nil, err
443	}
444	if n != SizeofKinfoProc {
445		return nil, EIO
446	}
447	return &kinfo, nil
448}
449
450func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) {
451	mib, err := sysctlmib(name, args...)
452	if err != nil {
453		return nil, err
454	}
455
456	// Find size.
457	n := uintptr(0)
458	if err := sysctl(mib, nil, &n, nil, 0); err != nil {
459		return nil, err
460	}
461	if n == 0 {
462		return nil, nil
463	}
464	if n%SizeofKinfoProc != 0 {
465		return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc)
466	}
467
468	// Read into buffer of that size.
469	buf := make([]KinfoProc, n/SizeofKinfoProc)
470	if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil {
471		return nil, err
472	}
473	if n%SizeofKinfoProc != 0 {
474		return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc)
475	}
476
477	// The actual call may return less than the original reported required
478	// size so ensure we deal with that.
479	return buf[:n/SizeofKinfoProc], nil
480}
481
482//sys	sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error)
483
484//sys	shmat(id int, addr uintptr, flag int) (ret uintptr, err error)
485//sys	shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error)
486//sys	shmdt(addr uintptr) (err error)
487//sys	shmget(key int, size int, flag int) (id int, err error)
488
489/*
490 * Exposed directly
491 */
492//sys	Access(path string, mode uint32) (err error)
493//sys	Adjtime(delta *Timeval, olddelta *Timeval) (err error)
494//sys	Chdir(path string) (err error)
495//sys	Chflags(path string, flags int) (err error)
496//sys	Chmod(path string, mode uint32) (err error)
497//sys	Chown(path string, uid int, gid int) (err error)
498//sys	Chroot(path string) (err error)
499//sys	ClockGettime(clockid int32, time *Timespec) (err error)
500//sys	Close(fd int) (err error)
501//sys	Clonefile(src string, dst string, flags int) (err error)
502//sys	Clonefileat(srcDirfd int, src string, dstDirfd int, dst string, flags int) (err error)
503//sys	Dup(fd int) (nfd int, err error)
504//sys	Dup2(from int, to int) (err error)
505//sys	Exchangedata(path1 string, path2 string, options int) (err error)
506//sys	Exit(code int)
507//sys	Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
508//sys	Fchdir(fd int) (err error)
509//sys	Fchflags(fd int, flags int) (err error)
510//sys	Fchmod(fd int, mode uint32) (err error)
511//sys	Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
512//sys	Fchown(fd int, uid int, gid int) (err error)
513//sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
514//sys	Fclonefileat(srcDirfd int, dstDirfd int, dst string, flags int) (err error)
515//sys	Flock(fd int, how int) (err error)
516//sys	Fpathconf(fd int, name int) (val int, err error)
517//sys	Fsync(fd int) (err error)
518//sys	Ftruncate(fd int, length int64) (err error)
519//sys	Getcwd(buf []byte) (n int, err error)
520//sys	Getdtablesize() (size int)
521//sysnb	Getegid() (egid int)
522//sysnb	Geteuid() (uid int)
523//sysnb	Getgid() (gid int)
524//sysnb	Getpgid(pid int) (pgid int, err error)
525//sysnb	Getpgrp() (pgrp int)
526//sysnb	Getpid() (pid int)
527//sysnb	Getppid() (ppid int)
528//sys	Getpriority(which int, who int) (prio int, err error)
529//sysnb	Getrlimit(which int, lim *Rlimit) (err error)
530//sysnb	Getrusage(who int, rusage *Rusage) (err error)
531//sysnb	Getsid(pid int) (sid int, err error)
532//sysnb	Gettimeofday(tp *Timeval) (err error)
533//sysnb	Getuid() (uid int)
534//sysnb	Issetugid() (tainted bool)
535//sys	Kqueue() (fd int, err error)
536//sys	Lchown(path string, uid int, gid int) (err error)
537//sys	Link(path string, link string) (err error)
538//sys	Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error)
539//sys	Listen(s int, backlog int) (err error)
540//sys	Mkdir(path string, mode uint32) (err error)
541//sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
542//sys	Mkfifo(path string, mode uint32) (err error)
543//sys	Mknod(path string, mode uint32, dev int) (err error)
544//sys	Open(path string, mode int, perm uint32) (fd int, err error)
545//sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
546//sys	Pathconf(path string, name int) (val int, err error)
547//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
548//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
549//sys	read(fd int, p []byte) (n int, err error)
550//sys	Readlink(path string, buf []byte) (n int, err error)
551//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
552//sys	Rename(from string, to string) (err error)
553//sys	Renameat(fromfd int, from string, tofd int, to string) (err error)
554//sys	Revoke(path string) (err error)
555//sys	Rmdir(path string) (err error)
556//sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
557//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
558//sys	Setegid(egid int) (err error)
559//sysnb	Seteuid(euid int) (err error)
560//sysnb	Setgid(gid int) (err error)
561//sys	Setlogin(name string) (err error)
562//sysnb	Setpgid(pid int, pgid int) (err error)
563//sys	Setpriority(which int, who int, prio int) (err error)
564//sys	Setprivexec(flag int) (err error)
565//sysnb	Setregid(rgid int, egid int) (err error)
566//sysnb	Setreuid(ruid int, euid int) (err error)
567//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
568//sysnb	Setsid() (pid int, err error)
569//sysnb	Settimeofday(tp *Timeval) (err error)
570//sysnb	Setuid(uid int) (err error)
571//sys	Symlink(path string, link string) (err error)
572//sys	Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
573//sys	Sync() (err error)
574//sys	Truncate(path string, length int64) (err error)
575//sys	Umask(newmask int) (oldmask int)
576//sys	Undelete(path string) (err error)
577//sys	Unlink(path string) (err error)
578//sys	Unlinkat(dirfd int, path string, flags int) (err error)
579//sys	Unmount(path string, flags int) (err error)
580//sys	write(fd int, p []byte) (n int, err error)
581//sys	mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
582//sys	munmap(addr uintptr, length uintptr) (err error)
583//sys	readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
584//sys	writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
585
586/*
587 * Unimplemented
588 */
589// Profil
590// Sigaction
591// Sigprocmask
592// Getlogin
593// Sigpending
594// Sigaltstack
595// Ioctl
596// Reboot
597// Execve
598// Vfork
599// Sbrk
600// Sstk
601// Ovadvise
602// Mincore
603// Setitimer
604// Swapon
605// Select
606// Sigsuspend
607// Readv
608// Writev
609// Nfssvc
610// Getfh
611// Quotactl
612// Mount
613// Csops
614// Waitid
615// Add_profil
616// Kdebug_trace
617// Sigreturn
618// Atsocket
619// Kqueue_from_portset_np
620// Kqueue_portset
621// Getattrlist
622// Setattrlist
623// Getdirentriesattr
624// Searchfs
625// Delete
626// Copyfile
627// Watchevent
628// Waitevent
629// Modwatch
630// Fsctl
631// Initgroups
632// Posix_spawn
633// Nfsclnt
634// Fhopen
635// Minherit
636// Semsys
637// Msgsys
638// Shmsys
639// Semctl
640// Semget
641// Semop
642// Msgctl
643// Msgget
644// Msgsnd
645// Msgrcv
646// Shm_open
647// Shm_unlink
648// Sem_open
649// Sem_close
650// Sem_unlink
651// Sem_wait
652// Sem_trywait
653// Sem_post
654// Sem_getvalue
655// Sem_init
656// Sem_destroy
657// Open_extended
658// Umask_extended
659// Stat_extended
660// Lstat_extended
661// Fstat_extended
662// Chmod_extended
663// Fchmod_extended
664// Access_extended
665// Settid
666// Gettid
667// Setsgroups
668// Getsgroups
669// Setwgroups
670// Getwgroups
671// Mkfifo_extended
672// Mkdir_extended
673// Identitysvc
674// Shared_region_check_np
675// Shared_region_map_np
676// __pthread_mutex_destroy
677// __pthread_mutex_init
678// __pthread_mutex_lock
679// __pthread_mutex_trylock
680// __pthread_mutex_unlock
681// __pthread_cond_init
682// __pthread_cond_destroy
683// __pthread_cond_broadcast
684// __pthread_cond_signal
685// Setsid_with_pid
686// __pthread_cond_timedwait
687// Aio_fsync
688// Aio_return
689// Aio_suspend
690// Aio_cancel
691// Aio_error
692// Aio_read
693// Aio_write
694// Lio_listio
695// __pthread_cond_wait
696// Iopolicysys
697// __pthread_kill
698// __pthread_sigmask
699// __sigwait
700// __disable_threadsignal
701// __pthread_markcancel
702// __pthread_canceled
703// __semwait_signal
704// Proc_info
705// sendfile
706// Stat64_extended
707// Lstat64_extended
708// Fstat64_extended
709// __pthread_chdir
710// __pthread_fchdir
711// Audit
712// Auditon
713// Getauid
714// Setauid
715// Getaudit
716// Setaudit
717// Getaudit_addr
718// Setaudit_addr
719// Auditctl
720// Bsdthread_create
721// Bsdthread_terminate
722// Stack_snapshot
723// Bsdthread_register
724// Workq_open
725// Workq_ops
726// __mac_execve
727// __mac_syscall
728// __mac_get_file
729// __mac_set_file
730// __mac_get_link
731// __mac_set_link
732// __mac_get_proc
733// __mac_set_proc
734// __mac_get_fd
735// __mac_set_fd
736// __mac_get_pid
737// __mac_get_lcid
738// __mac_get_lctx
739// __mac_set_lctx
740// Setlcid
741// Read_nocancel
742// Write_nocancel
743// Open_nocancel
744// Close_nocancel
745// Wait4_nocancel
746// Recvmsg_nocancel
747// Sendmsg_nocancel
748// Recvfrom_nocancel
749// Accept_nocancel
750// Fcntl_nocancel
751// Select_nocancel
752// Fsync_nocancel
753// Connect_nocancel
754// Sigsuspend_nocancel
755// Readv_nocancel
756// Writev_nocancel
757// Sendto_nocancel
758// Pread_nocancel
759// Pwrite_nocancel
760// Waitid_nocancel
761// Poll_nocancel
762// Msgsnd_nocancel
763// Msgrcv_nocancel
764// Sem_wait_nocancel
765// Aio_suspend_nocancel
766// __sigwait_nocancel
767// __semwait_signal_nocancel
768// __mac_mount
769// __mac_get_mount
770// __mac_getfsstat
771