xref: /illumos-gate/usr/src/uts/common/c2/audit_event.c (revision d2a70789f056fc6c9ce3ab047b52126d80b0e3da)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
545916cd2Sjpk  * Common Development and Distribution License (the "License").
645916cd2Sjpk  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
21794f0adbSRoger A. Faulkner 
227c478bd9Sstevel@tonic-gate /*
234a0fa546SMarek Pospisil  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
2489b43686SBayard Bell  * Copyright (c) 2011 Bayard G. Bell. All rights reserved.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate /*
287c478bd9Sstevel@tonic-gate  * This file contains the audit event table used to control the production
297c478bd9Sstevel@tonic-gate  * of audit records for each system call.
307c478bd9Sstevel@tonic-gate  */
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #include <sys/policy.h>
337c478bd9Sstevel@tonic-gate #include <sys/cred.h>
347c478bd9Sstevel@tonic-gate #include <sys/types.h>
357c478bd9Sstevel@tonic-gate #include <sys/systm.h>
367c478bd9Sstevel@tonic-gate #include <sys/systeminfo.h>	/* for sysinfo auditing */
377c478bd9Sstevel@tonic-gate #include <sys/utsname.h>	/* for sysinfo auditing */
387c478bd9Sstevel@tonic-gate #include <sys/proc.h>
397c478bd9Sstevel@tonic-gate #include <sys/vnode.h>
407c478bd9Sstevel@tonic-gate #include <sys/mman.h>		/* for mmap(2) auditing etc. */
417c478bd9Sstevel@tonic-gate #include <sys/fcntl.h>
427c478bd9Sstevel@tonic-gate #include <sys/modctl.h>		/* for modctl auditing */
437c478bd9Sstevel@tonic-gate #include <sys/vnode.h>
447c478bd9Sstevel@tonic-gate #include <sys/user.h>
457c478bd9Sstevel@tonic-gate #include <sys/types.h>
467c478bd9Sstevel@tonic-gate #include <sys/processor.h>
477c478bd9Sstevel@tonic-gate #include <sys/procset.h>
487c478bd9Sstevel@tonic-gate #include <sys/acl.h>
497c478bd9Sstevel@tonic-gate #include <sys/ipc.h>
507c478bd9Sstevel@tonic-gate #include <sys/door.h>
517c478bd9Sstevel@tonic-gate #include <sys/sem.h>
527c478bd9Sstevel@tonic-gate #include <sys/msg.h>
537c478bd9Sstevel@tonic-gate #include <sys/shm.h>
547c478bd9Sstevel@tonic-gate #include <sys/kmem.h>
557c478bd9Sstevel@tonic-gate #include <sys/file.h>		/* for accept */
567c478bd9Sstevel@tonic-gate #include <sys/utssys.h>		/* for fuser */
5745916cd2Sjpk #include <sys/tsol/label.h>
5861b9bf51Srica #include <sys/tsol/tndb.h>
5961b9bf51Srica #include <sys/tsol/tsyscall.h>
607c478bd9Sstevel@tonic-gate #include <c2/audit.h>
617c478bd9Sstevel@tonic-gate #include <c2/audit_kernel.h>
627c478bd9Sstevel@tonic-gate #include <c2/audit_kevents.h>
637c478bd9Sstevel@tonic-gate #include <c2/audit_record.h>
647c478bd9Sstevel@tonic-gate #include <sys/procset.h>
657c478bd9Sstevel@tonic-gate #include <nfs/mount.h>
667c478bd9Sstevel@tonic-gate #include <sys/param.h>
677c478bd9Sstevel@tonic-gate #include <sys/debug.h>
687c478bd9Sstevel@tonic-gate #include <sys/sysmacros.h>
697c478bd9Sstevel@tonic-gate #include <sys/stream.h>
707c478bd9Sstevel@tonic-gate #include <sys/strsubr.h>
717c478bd9Sstevel@tonic-gate #include <sys/stropts.h>
727c478bd9Sstevel@tonic-gate #include <sys/tihdr.h>
737c478bd9Sstevel@tonic-gate #include <sys/socket.h>
747c478bd9Sstevel@tonic-gate #include <sys/socketvar.h>
750f1702c5SYu Xiangning #include <sys/vfs_opreg.h>
760f1702c5SYu Xiangning #include <fs/sockfs/sockcommon.h>
777c478bd9Sstevel@tonic-gate #include <netinet/in.h>
787c478bd9Sstevel@tonic-gate #include <sys/ddi.h>
79df2381bfSpraks #include <sys/port_impl.h>
80*d2a70789SRichard Lowe #include <sys/secflags.h>
81df2381bfSpraks 
828fd04b83SRoger A. Faulkner static au_event_t	aui_fchownat(au_event_t);
83794f0adbSRoger A. Faulkner static au_event_t	aui_fchmodat(au_event_t);
847c478bd9Sstevel@tonic-gate static au_event_t	aui_open(au_event_t);
858fd04b83SRoger A. Faulkner static au_event_t	aui_openat(au_event_t);
868fd04b83SRoger A. Faulkner static au_event_t	aui_unlinkat(au_event_t);
878fd04b83SRoger A. Faulkner static au_event_t	aui_fstatat(au_event_t);
887c478bd9Sstevel@tonic-gate static au_event_t	aui_msgsys(au_event_t);
897c478bd9Sstevel@tonic-gate static au_event_t	aui_shmsys(au_event_t);
907c478bd9Sstevel@tonic-gate static au_event_t	aui_semsys(au_event_t);
917c478bd9Sstevel@tonic-gate static au_event_t	aui_utssys(au_event_t);
927c478bd9Sstevel@tonic-gate static au_event_t	aui_fcntl(au_event_t);
937c478bd9Sstevel@tonic-gate static au_event_t	aui_execve(au_event_t);
947c478bd9Sstevel@tonic-gate static au_event_t	aui_memcntl(au_event_t);
957c478bd9Sstevel@tonic-gate static au_event_t	aui_sysinfo(au_event_t);
96df2381bfSpraks static au_event_t	aui_portfs(au_event_t);
977c478bd9Sstevel@tonic-gate static au_event_t	aui_auditsys(au_event_t);
987c478bd9Sstevel@tonic-gate static au_event_t	aui_modctl(au_event_t);
997c478bd9Sstevel@tonic-gate static au_event_t	aui_acl(au_event_t);
1007c478bd9Sstevel@tonic-gate static au_event_t	aui_doorfs(au_event_t);
1017c478bd9Sstevel@tonic-gate static au_event_t	aui_privsys(au_event_t);
102657b1f3dSraf static au_event_t	aui_forksys(au_event_t);
10361b9bf51Srica static au_event_t	aui_labelsys(au_event_t);
1044be8c573SJan Friedel static au_event_t	aui_setpgrp(au_event_t);
1057c478bd9Sstevel@tonic-gate 
106*d2a70789SRichard Lowe 
107cb49a9fdSMarek Pospisil static void	aus_exit(struct t_audit_data *);
1087c478bd9Sstevel@tonic-gate static void	aus_open(struct t_audit_data *);
1098fd04b83SRoger A. Faulkner static void	aus_openat(struct t_audit_data *);
1107c478bd9Sstevel@tonic-gate static void	aus_acl(struct t_audit_data *);
1117c478bd9Sstevel@tonic-gate static void	aus_acct(struct t_audit_data *);
1127c478bd9Sstevel@tonic-gate static void	aus_chown(struct t_audit_data *);
1137c478bd9Sstevel@tonic-gate static void	aus_fchown(struct t_audit_data *);
1147c478bd9Sstevel@tonic-gate static void	aus_lchown(struct t_audit_data *);
1158fd04b83SRoger A. Faulkner static void	aus_fchownat(struct t_audit_data *);
1167c478bd9Sstevel@tonic-gate static void	aus_chmod(struct t_audit_data *);
1177c478bd9Sstevel@tonic-gate static void	aus_facl(struct t_audit_data *);
1187c478bd9Sstevel@tonic-gate static void	aus_fchmod(struct t_audit_data *);
119794f0adbSRoger A. Faulkner static void	aus_fchmodat(struct t_audit_data *);
1207c478bd9Sstevel@tonic-gate static void	aus_fcntl(struct t_audit_data *);
1217c478bd9Sstevel@tonic-gate static void	aus_mkdir(struct t_audit_data *);
122794f0adbSRoger A. Faulkner static void	aus_mkdirat(struct t_audit_data *);
1237c478bd9Sstevel@tonic-gate static void	aus_mknod(struct t_audit_data *);
124794f0adbSRoger A. Faulkner static void	aus_mknodat(struct t_audit_data *);
1257c478bd9Sstevel@tonic-gate static void	aus_mount(struct t_audit_data *);
1267c478bd9Sstevel@tonic-gate static void	aus_umount2(struct t_audit_data *);
1277c478bd9Sstevel@tonic-gate static void	aus_msgsys(struct t_audit_data *);
1287c478bd9Sstevel@tonic-gate static void	aus_semsys(struct t_audit_data *);
1297c478bd9Sstevel@tonic-gate static void	aus_close(struct t_audit_data *);
1307c478bd9Sstevel@tonic-gate static void	aus_fstatfs(struct t_audit_data *);
1317c478bd9Sstevel@tonic-gate static void	aus_setgid(struct t_audit_data *);
1324be8c573SJan Friedel static void	aus_setpgrp(struct t_audit_data *);
1337c478bd9Sstevel@tonic-gate static void	aus_setuid(struct t_audit_data *);
1347c478bd9Sstevel@tonic-gate static void	aus_shmsys(struct t_audit_data *);
1357c478bd9Sstevel@tonic-gate static void	aus_doorfs(struct t_audit_data *);
1367c478bd9Sstevel@tonic-gate static void	aus_ioctl(struct t_audit_data *);
1377c478bd9Sstevel@tonic-gate static void	aus_memcntl(struct t_audit_data *);
1387c478bd9Sstevel@tonic-gate static void	aus_mmap(struct t_audit_data *);
1397c478bd9Sstevel@tonic-gate static void	aus_munmap(struct t_audit_data *);
1407c478bd9Sstevel@tonic-gate static void	aus_priocntlsys(struct t_audit_data *);
1417c478bd9Sstevel@tonic-gate static void	aus_setegid(struct t_audit_data *);
1427c478bd9Sstevel@tonic-gate static void	aus_setgroups(struct t_audit_data *);
1437c478bd9Sstevel@tonic-gate static void	aus_seteuid(struct t_audit_data *);
1447c478bd9Sstevel@tonic-gate static void	aus_putmsg(struct t_audit_data *);
1457c478bd9Sstevel@tonic-gate static void	aus_putpmsg(struct t_audit_data *);
1467c478bd9Sstevel@tonic-gate static void	aus_getmsg(struct t_audit_data *);
1477c478bd9Sstevel@tonic-gate static void	aus_getpmsg(struct t_audit_data *);
1487c478bd9Sstevel@tonic-gate static void	aus_auditsys(struct t_audit_data *);
1497c478bd9Sstevel@tonic-gate static void	aus_sysinfo(struct t_audit_data *);
1507c478bd9Sstevel@tonic-gate static void	aus_modctl(struct t_audit_data *);
1517c478bd9Sstevel@tonic-gate static void	aus_kill(struct t_audit_data *);
1527c478bd9Sstevel@tonic-gate static void	aus_setregid(struct t_audit_data *);
1537c478bd9Sstevel@tonic-gate static void	aus_setreuid(struct t_audit_data *);
15461b9bf51Srica static void	aus_labelsys(struct t_audit_data *);
1557c478bd9Sstevel@tonic-gate 
1567c478bd9Sstevel@tonic-gate static void	auf_mknod(struct t_audit_data *, int, rval_t *);
157794f0adbSRoger A. Faulkner static void	auf_mknodat(struct t_audit_data *, int, rval_t *);
1587c478bd9Sstevel@tonic-gate static void	auf_msgsys(struct t_audit_data *, int, rval_t *);
1597c478bd9Sstevel@tonic-gate static void	auf_semsys(struct t_audit_data *, int, rval_t *);
1607c478bd9Sstevel@tonic-gate static void	auf_shmsys(struct t_audit_data *, int, rval_t *);
1617c478bd9Sstevel@tonic-gate static void	auf_read(struct t_audit_data *, int, rval_t *);
1627c478bd9Sstevel@tonic-gate static void	auf_write(struct t_audit_data *, int, rval_t *);
1637c478bd9Sstevel@tonic-gate 
1647c478bd9Sstevel@tonic-gate static void	aus_sigqueue(struct t_audit_data *);
1657c478bd9Sstevel@tonic-gate static void	aus_p_online(struct t_audit_data *);
1667c478bd9Sstevel@tonic-gate static void	aus_processor_bind(struct t_audit_data *);
1677c478bd9Sstevel@tonic-gate static void	aus_inst_sync(struct t_audit_data *);
1689acbbeafSnn static void	aus_brandsys(struct t_audit_data *);
1697c478bd9Sstevel@tonic-gate 
1707c478bd9Sstevel@tonic-gate static void	auf_accept(struct t_audit_data *, int, rval_t *);
1717c478bd9Sstevel@tonic-gate 
1727c478bd9Sstevel@tonic-gate static void	auf_bind(struct t_audit_data *, int, rval_t *);
1737c478bd9Sstevel@tonic-gate static void	auf_connect(struct t_audit_data *, int, rval_t *);
1747c478bd9Sstevel@tonic-gate static void	aus_shutdown(struct t_audit_data *);
1757c478bd9Sstevel@tonic-gate static void	auf_setsockopt(struct t_audit_data *, int, rval_t *);
1767c478bd9Sstevel@tonic-gate static void	aus_sockconfig(struct t_audit_data *);
1777c478bd9Sstevel@tonic-gate static void	auf_recv(struct t_audit_data *, int, rval_t *);
1787c478bd9Sstevel@tonic-gate static void	auf_recvmsg(struct t_audit_data *, int, rval_t *);
1797c478bd9Sstevel@tonic-gate static void	auf_send(struct t_audit_data *, int, rval_t *);
1807c478bd9Sstevel@tonic-gate static void	auf_sendmsg(struct t_audit_data *, int, rval_t *);
1817c478bd9Sstevel@tonic-gate static void	auf_recvfrom(struct t_audit_data *, int, rval_t *);
1827c478bd9Sstevel@tonic-gate static void	auf_sendto(struct t_audit_data *, int, rval_t *);
1837c478bd9Sstevel@tonic-gate static void	aus_socket(struct t_audit_data *);
1847c478bd9Sstevel@tonic-gate /*
1857c478bd9Sstevel@tonic-gate  * This table contains mapping information for converting system call numbers
1867c478bd9Sstevel@tonic-gate  * to audit event IDs. In several cases it is necessary to map a single system
1877c478bd9Sstevel@tonic-gate  * call to several events.
1887c478bd9Sstevel@tonic-gate  */
1897c478bd9Sstevel@tonic-gate 
190f9d0e028Sgww #define	aui_null	NULL	/* NULL initialize function */
191f9d0e028Sgww #define	aus_null	NULL	/* NULL start function */
192f9d0e028Sgww #define	auf_null	NULL	/* NULL finish function */
193f9d0e028Sgww 
1947c478bd9Sstevel@tonic-gate struct audit_s2e audit_s2e[] =
1957c478bd9Sstevel@tonic-gate {
1967c478bd9Sstevel@tonic-gate /*
1977c478bd9Sstevel@tonic-gate  * ----------	---------- 	----------	----------
1987c478bd9Sstevel@tonic-gate  * INITIAL	AUDIT		START		SYSTEM
1997c478bd9Sstevel@tonic-gate  * PROCESSING	EVENT		PROCESSING	CALL
2007c478bd9Sstevel@tonic-gate  * ----------	----------	----------	-----------
2017c478bd9Sstevel@tonic-gate  *		FINISH		EVENT
2027c478bd9Sstevel@tonic-gate  *		PROCESSING	CONTROL
2037c478bd9Sstevel@tonic-gate  * ----------------------------------------------------------
2047c478bd9Sstevel@tonic-gate  */
2057c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 0 unused (indirect) */
2067c478bd9Sstevel@tonic-gate 		auf_null,	0,
207cb49a9fdSMarek Pospisil aui_null,	AUE_EXIT,	aus_exit,	/* 1 exit */
2087c478bd9Sstevel@tonic-gate 		auf_null,	S2E_NPT,
209*d2a70789SRichard Lowe aui_null,	AUE_PSECFLAGS,	aus_null,	/* 2 psecflags */
2107c478bd9Sstevel@tonic-gate 		auf_null,	0,
2117c478bd9Sstevel@tonic-gate aui_null,	AUE_READ,	aus_null,	/* 3 read */
2127c478bd9Sstevel@tonic-gate 		auf_read,	S2E_PUB,
2137c478bd9Sstevel@tonic-gate aui_null,	AUE_WRITE,	aus_null,	/* 4 write */
2147c478bd9Sstevel@tonic-gate 		auf_write,	0,
2157c478bd9Sstevel@tonic-gate aui_open,	AUE_OPEN,	aus_open,	/* 5 open */
2167c478bd9Sstevel@tonic-gate 		auf_null,	S2E_SP,
2177c478bd9Sstevel@tonic-gate aui_null,	AUE_CLOSE,	aus_close,	/* 6 close */
2187c478bd9Sstevel@tonic-gate 		auf_null,	0,
219794f0adbSRoger A. Faulkner aui_null,	AUE_LINK,	aus_null,	/* 7 linkat */
2208fd04b83SRoger A. Faulkner 		auf_null,	0,
2218fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 8 (loadable) was creat */
2227c478bd9Sstevel@tonic-gate 		auf_null,	0,
2237c478bd9Sstevel@tonic-gate aui_null,	AUE_LINK,	aus_null,	/* 9 link */
2247c478bd9Sstevel@tonic-gate 		auf_null,	0,
2257c478bd9Sstevel@tonic-gate aui_null,	AUE_UNLINK,	aus_null,	/* 10 unlink */
2267c478bd9Sstevel@tonic-gate 		auf_null,	0,
227794f0adbSRoger A. Faulkner aui_null,	AUE_SYMLINK,	aus_null,	/* 11 symlinkat */
2288fd04b83SRoger A. Faulkner 		auf_null,	0,
2297c478bd9Sstevel@tonic-gate aui_null,	AUE_CHDIR,	aus_null,	/* 12 chdir */
2307c478bd9Sstevel@tonic-gate 		auf_null,	S2E_SP,
2317c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 13 time */
2327c478bd9Sstevel@tonic-gate 		auf_null,	0,
2337c478bd9Sstevel@tonic-gate aui_null,	AUE_MKNOD,	aus_mknod,	/* 14 mknod */
234794f0adbSRoger A. Faulkner 		auf_mknod,	S2E_MLD,
2357c478bd9Sstevel@tonic-gate aui_null,	AUE_CHMOD,	aus_chmod,	/* 15 chmod */
2367c478bd9Sstevel@tonic-gate 		auf_null,	0,
2377c478bd9Sstevel@tonic-gate aui_null,	AUE_CHOWN,	aus_chown,	/* 16 chown */
2387c478bd9Sstevel@tonic-gate 		auf_null,	0,
2397c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 17 brk */
2407c478bd9Sstevel@tonic-gate 		auf_null,	0,
2417c478bd9Sstevel@tonic-gate aui_null,	AUE_STAT,	aus_null,	/* 18 stat */
2427c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
2437c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 19 lseek */
2447c478bd9Sstevel@tonic-gate 		auf_null,	0,
2457c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 20 getpid */
2467c478bd9Sstevel@tonic-gate 		auf_null,	0,
2477c478bd9Sstevel@tonic-gate aui_null,	AUE_MOUNT,	aus_mount,	/* 21 mount */
2487c478bd9Sstevel@tonic-gate 		auf_null,	S2E_MLD,
249794f0adbSRoger A. Faulkner aui_null,	AUE_READLINK,	aus_null,	/* 22 readlinkat */
250794f0adbSRoger A. Faulkner 		auf_null,	S2E_PUB,
2517c478bd9Sstevel@tonic-gate aui_null,	AUE_SETUID,	aus_setuid,	/* 23 setuid */
2527c478bd9Sstevel@tonic-gate 		auf_null,	0,
2537c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 24 getuid */
2547c478bd9Sstevel@tonic-gate 		auf_null,	0,
2557c478bd9Sstevel@tonic-gate aui_null,	AUE_STIME,	aus_null,	/* 25 stime */
2567c478bd9Sstevel@tonic-gate 		auf_null,	0,
2578fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 26 pcsample */
2587c478bd9Sstevel@tonic-gate 		auf_null,	0,
2597c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 27 alarm */
2607c478bd9Sstevel@tonic-gate 		auf_null,	0,
2617c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 28 fstat */
2627c478bd9Sstevel@tonic-gate 		auf_null,	0,
2637c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 29 pause */
2647c478bd9Sstevel@tonic-gate 		auf_null,	0,
2658fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 30 (loadable) was utime */
2667c478bd9Sstevel@tonic-gate 		auf_null,	0,
2677c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 31 stty (TIOCSETP-audit?) */
2687c478bd9Sstevel@tonic-gate 		auf_null,	0,
2697c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 32 gtty */
2707c478bd9Sstevel@tonic-gate 		auf_null,	0,
2717c478bd9Sstevel@tonic-gate aui_null,	AUE_ACCESS,	aus_null,	/* 33 access */
2727c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
2737c478bd9Sstevel@tonic-gate aui_null,	AUE_NICE,	aus_null,	/* 34 nice */
2747c478bd9Sstevel@tonic-gate 		auf_null,	0,
2757c478bd9Sstevel@tonic-gate aui_null,	AUE_STATFS,	aus_null,	/* 35 statfs */
2767c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
2777c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 36 sync */
2787c478bd9Sstevel@tonic-gate 		auf_null,	0,
2797c478bd9Sstevel@tonic-gate aui_null,	AUE_KILL,	aus_kill,	/* 37 kill */
2807c478bd9Sstevel@tonic-gate 		auf_null,	0,
2817c478bd9Sstevel@tonic-gate aui_null,	AUE_FSTATFS,	aus_fstatfs,	/* 38 fstatfs */
2827c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
2834be8c573SJan Friedel aui_setpgrp,	AUE_SETPGRP,	aus_setpgrp,	/* 39 setpgrp */
2847c478bd9Sstevel@tonic-gate 		auf_null,	0,
2859acbbeafSnn aui_null,	AUE_NULL,	aus_null,	/* 40 uucopystr */
2867c478bd9Sstevel@tonic-gate 		auf_null,	0,
2878fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 41 (loadable) was dup */
2887c478bd9Sstevel@tonic-gate 		auf_null,	0,
2898fd04b83SRoger A. Faulkner aui_null,	AUE_PIPE,	aus_null,	/* 42 (loadable) pipe */
2907c478bd9Sstevel@tonic-gate 		auf_null,	0,
2917c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 43 times */
2927c478bd9Sstevel@tonic-gate 		auf_null,	0,
2937c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 44 profil */
2947c478bd9Sstevel@tonic-gate 		auf_null,	0,
2958fd04b83SRoger A. Faulkner aui_null,	AUE_ACCESS,	aus_null,	/* 45 faccessat */
296c4d3e299SBrent Paulson 		auf_null,	S2E_PUB,
2977c478bd9Sstevel@tonic-gate aui_null,	AUE_SETGID,	aus_setgid,	/* 46 setgid */
2987c478bd9Sstevel@tonic-gate 		auf_null,	0,
2997c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 47 getgid */
3007c478bd9Sstevel@tonic-gate 		auf_null,	0,
301794f0adbSRoger A. Faulkner aui_null,	AUE_MKNOD,	aus_mknodat,	/* 48 mknodat */
302794f0adbSRoger A. Faulkner 		auf_mknodat,	S2E_MLD,
3038fd04b83SRoger A. Faulkner aui_msgsys,	AUE_MSGSYS,	aus_msgsys,	/* 49 (loadable) msgsys */
3047c478bd9Sstevel@tonic-gate 		auf_msgsys,	0,
3057c478bd9Sstevel@tonic-gate #if defined(__x86)
3067c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 50 sysi86 */
3077c478bd9Sstevel@tonic-gate 		auf_null,	0,
3087c478bd9Sstevel@tonic-gate #else
3097c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 50 (loadable) was sys3b */
3107c478bd9Sstevel@tonic-gate 		auf_null,	0,
3117c478bd9Sstevel@tonic-gate #endif /* __x86 */
3128fd04b83SRoger A. Faulkner aui_null,	AUE_ACCT,	aus_acct,	/* 51 (loadable) sysacct */
3137c478bd9Sstevel@tonic-gate 		auf_null,	0,
3148fd04b83SRoger A. Faulkner aui_shmsys,	AUE_SHMSYS,	aus_shmsys,	/* 52 (loadable) shmsys */
3157c478bd9Sstevel@tonic-gate 		auf_shmsys,	0,
3168fd04b83SRoger A. Faulkner aui_semsys,	AUE_SEMSYS,	aus_semsys,	/* 53 (loadable) semsys */
3177c478bd9Sstevel@tonic-gate 		auf_semsys,	0,
3187c478bd9Sstevel@tonic-gate aui_null,	AUE_IOCTL,	aus_ioctl,	/* 54 ioctl */
3197c478bd9Sstevel@tonic-gate 		auf_null,	0,
3207c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 55 uadmin */
3217c478bd9Sstevel@tonic-gate 		auf_null,	0,
3228fd04b83SRoger A. Faulkner aui_fchownat,	AUE_NULL,	aus_fchownat,	/* 56 fchownat */
323c4d3e299SBrent Paulson 		auf_null,	0,
3247c478bd9Sstevel@tonic-gate aui_utssys,	AUE_FUSERS,	aus_null,	/* 57 utssys */
3257c478bd9Sstevel@tonic-gate 		auf_null,	0,
3267c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 58 fsync */
3277c478bd9Sstevel@tonic-gate 		auf_null,	0,
3287c478bd9Sstevel@tonic-gate aui_execve,	AUE_EXECVE,	aus_null,	/* 59 exece */
3297c478bd9Sstevel@tonic-gate 		auf_null,	S2E_MLD,
3307c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 60 umask */
3317c478bd9Sstevel@tonic-gate 		auf_null,	0,
3327c478bd9Sstevel@tonic-gate aui_null,	AUE_CHROOT,	aus_null,	/* 61 chroot */
3337c478bd9Sstevel@tonic-gate 		auf_null,	S2E_SP,
3347c478bd9Sstevel@tonic-gate aui_fcntl,	AUE_FCNTL,	aus_fcntl,	/* 62 fcntl */
3357c478bd9Sstevel@tonic-gate 		auf_null,	0,
3367c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 63 ulimit */
3377c478bd9Sstevel@tonic-gate 		auf_null,	0,
3388fd04b83SRoger A. Faulkner aui_null,	AUE_RENAME,	aus_null,	/* 64 renameat */
339c4d3e299SBrent Paulson 		auf_null,	0,
3408fd04b83SRoger A. Faulkner aui_unlinkat,	AUE_NULL,	aus_null,	/* 65 unlinkat */
341c4d3e299SBrent Paulson 		auf_null,	0,
3428fd04b83SRoger A. Faulkner aui_fstatat,	AUE_NULL,	aus_null,	/* 66 fstatat */
343c4d3e299SBrent Paulson 		auf_null,	S2E_PUB,
3448fd04b83SRoger A. Faulkner aui_fstatat,	AUE_NULL,	aus_null,	/* 67 fstatat64 */
345c4d3e299SBrent Paulson 		auf_null,	S2E_PUB,
3468fd04b83SRoger A. Faulkner aui_openat,	AUE_OPEN,	aus_openat,	/* 68 openat */
347c4d3e299SBrent Paulson 		auf_null,	S2E_SP,
3488fd04b83SRoger A. Faulkner aui_openat,	AUE_OPEN,	aus_openat,	/* 69 openat64 */
349c4d3e299SBrent Paulson 		auf_null,	S2E_SP,
3508fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 70 tasksys */
3517c478bd9Sstevel@tonic-gate 		auf_null,	0,
3528fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 71 (loadable) acctctl */
3537c478bd9Sstevel@tonic-gate 		auf_null,	0,
3548fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 72 (loadable) exacct */
3557c478bd9Sstevel@tonic-gate 		auf_null,	0,
3568fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 73 getpagesizes */
3577c478bd9Sstevel@tonic-gate 		auf_null,	0,
3588fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 74 rctlsys */
3597c478bd9Sstevel@tonic-gate 		auf_null,	0,
360f48205beScasper aui_null,	AUE_NULL,	aus_null,	/* 75 sidsys */
3617c478bd9Sstevel@tonic-gate 		auf_null,	0,
3628fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 76 (loadable) was fsat */
3637c478bd9Sstevel@tonic-gate 		auf_null,	0,
3648fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 77 syslwp_park */
3657c478bd9Sstevel@tonic-gate 		auf_null,	0,
3668fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 78 sendfilev */
3677c478bd9Sstevel@tonic-gate 		auf_null,	0,
3687c478bd9Sstevel@tonic-gate aui_null,	AUE_RMDIR,	aus_null,	/* 79 rmdir */
3697c478bd9Sstevel@tonic-gate 		auf_null,	0,
3707c478bd9Sstevel@tonic-gate aui_null,	AUE_MKDIR,	aus_mkdir,	/* 80 mkdir */
3717c478bd9Sstevel@tonic-gate 		auf_null,	0,
3727c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 81 getdents */
3737c478bd9Sstevel@tonic-gate 		auf_null,	0,
3747c478bd9Sstevel@tonic-gate aui_privsys,	AUE_NULL,	aus_null,	/* 82 privsys */
3757c478bd9Sstevel@tonic-gate 		auf_null,	0,
3768fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 83 ucredsys */
3777c478bd9Sstevel@tonic-gate 		auf_null,	0,
3787c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 84 sysfs */
3797c478bd9Sstevel@tonic-gate 		auf_null,	0,
3807c478bd9Sstevel@tonic-gate aui_null,	AUE_GETMSG,	aus_getmsg,	/* 85 getmsg */
3817c478bd9Sstevel@tonic-gate 		auf_null,	0,
3827c478bd9Sstevel@tonic-gate aui_null,	AUE_PUTMSG,	aus_putmsg,	/* 86 putmsg */
3837c478bd9Sstevel@tonic-gate 		auf_null,	0,
3848fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 87 (loadable) was poll */
3857c478bd9Sstevel@tonic-gate 		auf_null,	0,
3867c478bd9Sstevel@tonic-gate aui_null,	AUE_LSTAT,	aus_null,	/* 88 lstat */
3877c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
3887c478bd9Sstevel@tonic-gate aui_null,	AUE_SYMLINK,	aus_null,	/* 89 symlink */
3897c478bd9Sstevel@tonic-gate 		auf_null,	0,
3907c478bd9Sstevel@tonic-gate aui_null,	AUE_READLINK,	aus_null,	/* 90 readlink */
3917c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
3927c478bd9Sstevel@tonic-gate aui_null,	AUE_SETGROUPS,	aus_setgroups,	/* 91 setgroups */
3937c478bd9Sstevel@tonic-gate 		auf_null,	0,
3947c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 92 getgroups */
3957c478bd9Sstevel@tonic-gate 		auf_null,	0,
3967c478bd9Sstevel@tonic-gate aui_null,	AUE_FCHMOD,	aus_fchmod,	/* 93 fchmod */
3977c478bd9Sstevel@tonic-gate 		auf_null,	0,
3987c478bd9Sstevel@tonic-gate aui_null,	AUE_FCHOWN,	aus_fchown,	/* 94 fchown */
3997c478bd9Sstevel@tonic-gate 		auf_null,	0,
4007c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 95 sigprocmask */
4017c478bd9Sstevel@tonic-gate 		auf_null,	0,
4027c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 96 sigsuspend */
4037c478bd9Sstevel@tonic-gate 		auf_null,	0,
4047c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 97 sigaltstack */
4057c478bd9Sstevel@tonic-gate 		auf_null,	0,
4067c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 98 sigaction */
4077c478bd9Sstevel@tonic-gate 		auf_null,	0,
4087c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 99 sigpending */
4097c478bd9Sstevel@tonic-gate 		auf_null,	0,
4107c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 100 setcontext */
4117c478bd9Sstevel@tonic-gate 		auf_null,	0,
412794f0adbSRoger A. Faulkner aui_fchmodat,	AUE_NULL,	aus_fchmodat,	/* 101 fchmodat */
4137c478bd9Sstevel@tonic-gate 		auf_null,	0,
414794f0adbSRoger A. Faulkner aui_null,	AUE_MKDIR,	aus_mkdirat,	/* 102 mkdirat */
4157c478bd9Sstevel@tonic-gate 		auf_null,	0,
4167c478bd9Sstevel@tonic-gate aui_null,	AUE_STATVFS,	aus_null,	/* 103 statvfs */
4177c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
4187c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 104 fstatvfs */
4197c478bd9Sstevel@tonic-gate 		auf_null,	0,
4208fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 105 getloadavg */
4217c478bd9Sstevel@tonic-gate 		auf_null,	0,
4227c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 106 nfssys */
4237c478bd9Sstevel@tonic-gate 		auf_null,	0,
4248fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 107 waitsys */
4257c478bd9Sstevel@tonic-gate 		auf_null,	0,
4268fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 108 sigsendsys */
4277c478bd9Sstevel@tonic-gate 		auf_null,	0,
4287c478bd9Sstevel@tonic-gate #if defined(__x86)
4297c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 109 hrtsys */
4307c478bd9Sstevel@tonic-gate 		auf_null,	0,
4317c478bd9Sstevel@tonic-gate #else
4327c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 109 (loadable) */
4337c478bd9Sstevel@tonic-gate 		auf_null,	0,
4347c478bd9Sstevel@tonic-gate #endif /* __x86 */
4358fd04b83SRoger A. Faulkner aui_null,	AUE_UTIMES,	aus_null,	/* 110 utimesys */
436c4d3e299SBrent Paulson 		auf_null,	0,
4378fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 111 sigresend */
4387c478bd9Sstevel@tonic-gate 		auf_null,	0,
4398fd04b83SRoger A. Faulkner aui_null,	AUE_PRIOCNTLSYS, aus_priocntlsys, /* 112 priocntlsys */
4407c478bd9Sstevel@tonic-gate 		auf_null,	0,
4417c478bd9Sstevel@tonic-gate aui_null,	AUE_PATHCONF,	aus_null,	/* 113 pathconf */
4427c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
4437c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 114 mincore */
4447c478bd9Sstevel@tonic-gate 		auf_null,	0,
4457c478bd9Sstevel@tonic-gate aui_null,	AUE_MMAP,	aus_mmap,	/* 115 mmap */
4467c478bd9Sstevel@tonic-gate 		auf_null,	0,
4477c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 116 mprotect */
4487c478bd9Sstevel@tonic-gate 		auf_null,	0,
4497c478bd9Sstevel@tonic-gate aui_null,	AUE_MUNMAP,	aus_munmap,	/* 117 munmap */
4507c478bd9Sstevel@tonic-gate 		auf_null,	0,
4517c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 118 fpathconf */
4527c478bd9Sstevel@tonic-gate 		auf_null,	0,
4537c478bd9Sstevel@tonic-gate aui_null,	AUE_VFORK,	aus_null,	/* 119 vfork */
4547c478bd9Sstevel@tonic-gate 		auf_null,	0,
4557c478bd9Sstevel@tonic-gate aui_null,	AUE_FCHDIR,	aus_null,	/* 120 fchdir */
4567c478bd9Sstevel@tonic-gate 		auf_null,	0,
4577c478bd9Sstevel@tonic-gate aui_null,	AUE_READ,	aus_null,	/* 121 readv */
4587c478bd9Sstevel@tonic-gate 		auf_read,	S2E_PUB,
4597c478bd9Sstevel@tonic-gate aui_null,	AUE_WRITE,	aus_null,	/* 122 writev */
4607c478bd9Sstevel@tonic-gate 		auf_write,	0,
4618fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 123 (loadable) was xstat */
4627c478bd9Sstevel@tonic-gate 		auf_null,	0,
4638fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 124 (loadable) was lxstat */
4648fd04b83SRoger A. Faulkner 		auf_null,	0,
4658fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 125 (loadable) was fxstat */
4668fd04b83SRoger A. Faulkner 		auf_null,	0,
4678fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 126 (loadable) was xmknod */
4688fd04b83SRoger A. Faulkner 		auf_null,	0,
4698fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 127 mmapobj */
4707c478bd9Sstevel@tonic-gate 		auf_null,	0,
4717c478bd9Sstevel@tonic-gate aui_null,	AUE_SETRLIMIT,	aus_null,	/* 128 setrlimit */
4727c478bd9Sstevel@tonic-gate 		auf_null,	0,
4737c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 129 getrlimit */
4747c478bd9Sstevel@tonic-gate 		auf_null,	0,
4757c478bd9Sstevel@tonic-gate aui_null,	AUE_LCHOWN,	aus_lchown,	/* 130 lchown */
4767c478bd9Sstevel@tonic-gate 		auf_null,	0,
4777c478bd9Sstevel@tonic-gate aui_memcntl,	AUE_MEMCNTL,	aus_memcntl,	/* 131 memcntl */
4787c478bd9Sstevel@tonic-gate 		auf_null,	0,
4797c478bd9Sstevel@tonic-gate aui_null,	AUE_GETPMSG,	aus_getpmsg,	/* 132 getpmsg */
4807c478bd9Sstevel@tonic-gate 		auf_null,	0,
4817c478bd9Sstevel@tonic-gate aui_null,	AUE_PUTPMSG,	aus_putpmsg,	/* 133 putpmsg */
4827c478bd9Sstevel@tonic-gate 		auf_null,	0,
4837c478bd9Sstevel@tonic-gate aui_null,	AUE_RENAME,	aus_null,	/* 134 rename */
4847c478bd9Sstevel@tonic-gate 		auf_null,	0,
4857c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 135 uname */
4867c478bd9Sstevel@tonic-gate 		auf_null,	0,
4877c478bd9Sstevel@tonic-gate aui_null,	AUE_SETEGID,	aus_setegid,	/* 136 setegid */
4887c478bd9Sstevel@tonic-gate 		auf_null,	0,
4897c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 137 sysconfig */
4907c478bd9Sstevel@tonic-gate 		auf_null,	0,
4917c478bd9Sstevel@tonic-gate aui_null,	AUE_ADJTIME,	aus_null,	/* 138 adjtime */
4927c478bd9Sstevel@tonic-gate 		auf_null,	0,
4937c478bd9Sstevel@tonic-gate aui_sysinfo,	AUE_SYSINFO,	aus_sysinfo,	/* 139 systeminfo */
4947c478bd9Sstevel@tonic-gate 		auf_null,	0,
4958fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 140 (loadable) sharefs */
4967c478bd9Sstevel@tonic-gate 		auf_null,	0,
4977c478bd9Sstevel@tonic-gate aui_null,	AUE_SETEUID,	aus_seteuid,	/* 141 seteuid */
4987c478bd9Sstevel@tonic-gate 		auf_null,	0,
499657b1f3dSraf aui_forksys,	AUE_NULL,	aus_null,	/* 142 forksys */
5007c478bd9Sstevel@tonic-gate 		auf_null,	0,
5018fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 143 (loadable) was fork1 */
5027c478bd9Sstevel@tonic-gate 		auf_null,	0,
5037c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 144 sigwait */
5047c478bd9Sstevel@tonic-gate 		auf_null,	0,
5057c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 145 lwp_info */
5067c478bd9Sstevel@tonic-gate 		auf_null,	0,
5077c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 146 yield */
5087c478bd9Sstevel@tonic-gate 		auf_null,	0,
5098fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 147 (loadable) */
5108fd04b83SRoger A. Faulkner 						/*	was lwp_sema_wait */
5117c478bd9Sstevel@tonic-gate 		auf_null,	0,
5127c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 148 lwp_sema_post */
5137c478bd9Sstevel@tonic-gate 		auf_null,	0,
5147c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 149 lwp_sema_trywait */
5157c478bd9Sstevel@tonic-gate 		auf_null,	0,
5168fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 150 lwp_detach */
5177c478bd9Sstevel@tonic-gate 		auf_null,	0,
5188fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 151 corectl */
5197c478bd9Sstevel@tonic-gate 		auf_null,	0,
5207c478bd9Sstevel@tonic-gate aui_modctl,	AUE_MODCTL,	aus_modctl,	/* 152 modctl */
5217c478bd9Sstevel@tonic-gate 		auf_null,	0,
5227c478bd9Sstevel@tonic-gate aui_null,	AUE_FCHROOT,	aus_null,	/* 153 fchroot */
5237c478bd9Sstevel@tonic-gate 		auf_null,	0,
5248fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 154 (loadable) was utimes */
5257c478bd9Sstevel@tonic-gate 		auf_null,	0,
5267c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 155 vhangup */
5277c478bd9Sstevel@tonic-gate 		auf_null,	0,
5287c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 156 gettimeofday */
5297c478bd9Sstevel@tonic-gate 		auf_null,	0,
5307c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 157 getitimer */
5317c478bd9Sstevel@tonic-gate 		auf_null,	0,
5327c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 158 setitimer */
5337c478bd9Sstevel@tonic-gate 		auf_null,	0,
5347c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 159 lwp_create */
5357c478bd9Sstevel@tonic-gate 		auf_null,	0,
5367c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 160 lwp_exit */
5377c478bd9Sstevel@tonic-gate 		auf_null,	0,
5387c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 161 lwp_suspend */
5397c478bd9Sstevel@tonic-gate 		auf_null,	0,
5407c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 162 lwp_continue */
5417c478bd9Sstevel@tonic-gate 		auf_null,	0,
5427c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 163 lwp_kill */
5437c478bd9Sstevel@tonic-gate 		auf_null,	0,
5447c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 164 lwp_self */
5457c478bd9Sstevel@tonic-gate 		auf_null,	0,
5468fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 165 lwp_sigmask */
5477c478bd9Sstevel@tonic-gate 		auf_null,	0,
5488fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 166 lwp_private */
5497c478bd9Sstevel@tonic-gate 		auf_null,	0,
5507c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 167 lwp_wait */
5517c478bd9Sstevel@tonic-gate 		auf_null,	0,
552883492d5Sraf aui_null,	AUE_NULL,	aus_null,	/* 168 lwp_mutex_wakeup  */
5537c478bd9Sstevel@tonic-gate 		auf_null,	0,
5548fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 169 (loadable) */
5558fd04b83SRoger A. Faulkner 						/*	was lwp_mutex_lock */
5567c478bd9Sstevel@tonic-gate 		auf_null,	0,
5577c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 170 lwp_cond_wait */
5587c478bd9Sstevel@tonic-gate 		auf_null,	0,
5597c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 171 lwp_cond_signal */
5607c478bd9Sstevel@tonic-gate 		auf_null,	0,
5617c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 172 lwp_cond_broadcast */
5627c478bd9Sstevel@tonic-gate 		auf_null,	0,
5637c478bd9Sstevel@tonic-gate aui_null,	AUE_READ,	aus_null,	/* 173 pread */
5647c478bd9Sstevel@tonic-gate 		auf_read,	S2E_PUB,
5657c478bd9Sstevel@tonic-gate aui_null,	AUE_WRITE,	aus_null,	/* 174 pwrite */
5667c478bd9Sstevel@tonic-gate 		auf_write,	0,
5677c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 175 llseek */
5687c478bd9Sstevel@tonic-gate 		auf_null,	0,
5698fd04b83SRoger A. Faulkner aui_null,	AUE_INST_SYNC,	aus_inst_sync,  /* 176 (loadable) inst_sync */
5707c478bd9Sstevel@tonic-gate 		auf_null,	0,
5719acbbeafSnn aui_null,	AUE_BRANDSYS,	aus_brandsys,	/* 177 brandsys */
5727c478bd9Sstevel@tonic-gate 		auf_null,	0,
5738fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 178 (loadable) kaio */
5747c478bd9Sstevel@tonic-gate 		auf_null,	0,
5758fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 179 (loadable) cpc */
5767c478bd9Sstevel@tonic-gate 		auf_null,	0,
5778fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 180 lgrpsys */
5787c478bd9Sstevel@tonic-gate 		auf_null,	0,
5798fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 181 rusagesys */
5807c478bd9Sstevel@tonic-gate 		auf_null,	0,
581df2381bfSpraks aui_portfs,	AUE_PORTFS,	aus_null,	/* 182 (loadable) portfs */
5827e309bc2SJan Friedel 		auf_null,	S2E_MLD,
5838fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 183 pollsys */
5847c478bd9Sstevel@tonic-gate 		auf_null,	0,
58561b9bf51Srica aui_labelsys,	AUE_NULL,	aus_labelsys,	/* 184 labelsys */
5867c478bd9Sstevel@tonic-gate 		auf_null,	0,
5877c478bd9Sstevel@tonic-gate aui_acl,	AUE_ACLSET,	aus_acl,	/* 185 acl */
5887c478bd9Sstevel@tonic-gate 		auf_null,	0,
5897c478bd9Sstevel@tonic-gate aui_auditsys,	AUE_AUDITSYS,	aus_auditsys,	/* 186 auditsys  */
5907c478bd9Sstevel@tonic-gate 		auf_null,	0,
5918fd04b83SRoger A. Faulkner aui_null,	AUE_PROCESSOR_BIND, aus_processor_bind, /* 187 processor_bind */
5928fd04b83SRoger A. Faulkner 		auf_null,	0,
5937c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 188 processor_info */
5947c478bd9Sstevel@tonic-gate 		auf_null,	0,
5957c478bd9Sstevel@tonic-gate aui_null,	AUE_P_ONLINE,	aus_p_online,	/* 189 p_online */
5967c478bd9Sstevel@tonic-gate 		auf_null,	0,
5977c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_sigqueue,	/* 190 sigqueue */
5987c478bd9Sstevel@tonic-gate 		auf_null,	0,
5997c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 191 clock_gettime */
6007c478bd9Sstevel@tonic-gate 		auf_null,	0,
6017c478bd9Sstevel@tonic-gate aui_null,	AUE_CLOCK_SETTIME,	aus_null,	/* 192 clock_settime */
6027c478bd9Sstevel@tonic-gate 		auf_null,	0,
6037c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 193 clock_getres */
6047c478bd9Sstevel@tonic-gate 		auf_null,	0,
6057c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 194 timer_create */
6067c478bd9Sstevel@tonic-gate 		auf_null,	0,
6077c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 195 timer_delete */
6087c478bd9Sstevel@tonic-gate 		auf_null,	0,
6097c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 196 timer_settime */
6107c478bd9Sstevel@tonic-gate 		auf_null,	0,
6117c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 197 timer_gettime */
6127c478bd9Sstevel@tonic-gate 		auf_null,	0,
6137c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 198 timer_getoverrun */
6147c478bd9Sstevel@tonic-gate 		auf_null,	0,
6157c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 199 nanosleep */
6167c478bd9Sstevel@tonic-gate 		auf_null,	0,
6177c478bd9Sstevel@tonic-gate aui_acl,	AUE_FACLSET,	aus_facl,	/* 200 facl */
6187c478bd9Sstevel@tonic-gate 		auf_null,	0,
6197c478bd9Sstevel@tonic-gate aui_doorfs,	AUE_DOORFS,	aus_doorfs,	/* 201 (loadable) doorfs */
6207c478bd9Sstevel@tonic-gate 		auf_null,	0,
6217c478bd9Sstevel@tonic-gate aui_null,	AUE_SETREUID,	aus_setreuid,	/* 202 setreuid */
6227c478bd9Sstevel@tonic-gate 		auf_null,	0,
6237c478bd9Sstevel@tonic-gate aui_null,	AUE_SETREGID,	aus_setregid,	/* 203 setregid */
6247c478bd9Sstevel@tonic-gate 		auf_null,	0,
6257c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 204 install_utrap */
6267c478bd9Sstevel@tonic-gate 		auf_null,	0,
6277c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 205 signotify */
6287c478bd9Sstevel@tonic-gate 		auf_null,	0,
6297c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 206 schedctl */
6307c478bd9Sstevel@tonic-gate 		auf_null,	0,
6317c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 207 (loadable) pset */
6327c478bd9Sstevel@tonic-gate 		auf_null,	0,
6338fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 208 sparc_utrap_install */
6347c478bd9Sstevel@tonic-gate 		auf_null,	0,
6357c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 209 resolvepath */
6367c478bd9Sstevel@tonic-gate 		auf_null,	0,
6377c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 210 lwp_mutex_timedlock */
6387c478bd9Sstevel@tonic-gate 		auf_null,	0,
6397c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 211 lwp_sema_timedwait */
6407c478bd9Sstevel@tonic-gate 		auf_null,	0,
6417c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 212 lwp_rwlock_sys */
6427c478bd9Sstevel@tonic-gate 		auf_null,	0,
6438fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 213 getdents64 */
6447c478bd9Sstevel@tonic-gate 		auf_null,	0,
6457c478bd9Sstevel@tonic-gate aui_null,	AUE_MMAP,	aus_mmap,	/* 214 mmap64 */
6467c478bd9Sstevel@tonic-gate 		auf_null,	0,
6477c478bd9Sstevel@tonic-gate aui_null,	AUE_STAT,	aus_null,	/* 215 stat64 */
6487c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
6497c478bd9Sstevel@tonic-gate aui_null,	AUE_LSTAT,	aus_null,	/* 216 lstat64 */
6507c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
6517c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 217 fstat64 */
6527c478bd9Sstevel@tonic-gate 		auf_null,	0,
6537c478bd9Sstevel@tonic-gate aui_null,	AUE_STATVFS,	aus_null,	/* 218 statvfs64 */
6547c478bd9Sstevel@tonic-gate 		auf_null,	S2E_PUB,
6557c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 219 fstatvfs64 */
6567c478bd9Sstevel@tonic-gate 		auf_null,	0,
6577c478bd9Sstevel@tonic-gate aui_null,	AUE_SETRLIMIT,	aus_null,	/* 220 setrlimit64 */
6587c478bd9Sstevel@tonic-gate 		auf_null,	0,
6597c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 221 getrlimit64 */
6607c478bd9Sstevel@tonic-gate 		auf_null,	0,
6617c478bd9Sstevel@tonic-gate aui_null,	AUE_READ,	aus_null,	/* 222 pread64  */
6627c478bd9Sstevel@tonic-gate 		auf_read,	S2E_PUB,
6637c478bd9Sstevel@tonic-gate aui_null,	AUE_WRITE,	aus_null,	/* 223 pwrite64 */
6647c478bd9Sstevel@tonic-gate 		auf_write,	0,
6658fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 224 (loadable) was creat64 */
6668fd04b83SRoger A. Faulkner 		auf_null,	0,
6677c478bd9Sstevel@tonic-gate aui_open,	AUE_OPEN,	aus_open,	/* 225 open64 */
6687c478bd9Sstevel@tonic-gate 		auf_null,	S2E_SP,
6697c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 226 (loadable) rpcsys */
6707c478bd9Sstevel@tonic-gate 		auf_null,	0,
6718fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 227 zone */
6727c478bd9Sstevel@tonic-gate 		auf_null,	0,
6738fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 228 (loadable) autofssys */
6747c478bd9Sstevel@tonic-gate 		auf_null,	0,
6758fd04b83SRoger A. Faulkner aui_null,	AUE_NULL,	aus_null,	/* 229 getcwd */
6767c478bd9Sstevel@tonic-gate 		auf_null,	0,
6777c478bd9Sstevel@tonic-gate aui_null,	AUE_SOCKET,	aus_socket,	/* 230 so_socket */
6787c478bd9Sstevel@tonic-gate 		auf_null,	0,
6797c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 231 so_socketpair */
6807c478bd9Sstevel@tonic-gate 		auf_null,	0,
6817c478bd9Sstevel@tonic-gate aui_null,	AUE_BIND,	aus_null,	/* 232 bind */
6827c478bd9Sstevel@tonic-gate 		auf_bind,	0,
6837c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 233 listen */
6847c478bd9Sstevel@tonic-gate 		auf_null,	0,
6857c478bd9Sstevel@tonic-gate aui_null,	AUE_ACCEPT,	aus_null,	/* 234 accept */
6867c478bd9Sstevel@tonic-gate 		auf_accept,	0,
6877c478bd9Sstevel@tonic-gate aui_null,	AUE_CONNECT,	aus_null,	/* 235 connect */
6887c478bd9Sstevel@tonic-gate 		auf_connect,	0,
6897c478bd9Sstevel@tonic-gate aui_null,	AUE_SHUTDOWN,	aus_shutdown,	/* 236 shutdown */
6907c478bd9Sstevel@tonic-gate 		auf_null,	0,
6917c478bd9Sstevel@tonic-gate aui_null,	AUE_READ,	aus_null,	/* 237 recv */
6927c478bd9Sstevel@tonic-gate 		auf_recv,	0,
6937c478bd9Sstevel@tonic-gate aui_null,	AUE_RECVFROM,	aus_null,	/* 238 recvfrom */
6947c478bd9Sstevel@tonic-gate 		auf_recvfrom,	0,
6957c478bd9Sstevel@tonic-gate aui_null,	AUE_RECVMSG,	aus_null,	/* 239 recvmsg */
6967c478bd9Sstevel@tonic-gate 		auf_recvmsg,	0,
6977c478bd9Sstevel@tonic-gate aui_null,	AUE_WRITE,	aus_null,	/* 240 send */
6987c478bd9Sstevel@tonic-gate 		auf_send,	0,
6997c478bd9Sstevel@tonic-gate aui_null,	AUE_SENDMSG,	aus_null,	/* 241 sendmsg */
7007c478bd9Sstevel@tonic-gate 		auf_sendmsg,	0,
7017c478bd9Sstevel@tonic-gate aui_null,	AUE_SENDTO,	aus_null,	/* 242 sendto */
7027c478bd9Sstevel@tonic-gate 		auf_sendto,	0,
7037c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 243 getpeername */
7047c478bd9Sstevel@tonic-gate 		auf_null,	0,
7057c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 244 getsockname */
7067c478bd9Sstevel@tonic-gate 		auf_null,	0,
7077c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 245 getsockopt */
7087c478bd9Sstevel@tonic-gate 		auf_null,	0,
7097c478bd9Sstevel@tonic-gate aui_null,	AUE_SETSOCKOPT,	aus_null,	/* 246 setsockopt */
7107c478bd9Sstevel@tonic-gate 		auf_setsockopt,	0,
7117c478bd9Sstevel@tonic-gate aui_null,	AUE_SOCKCONFIG,	aus_sockconfig,	/* 247 sockconfig */
7127c478bd9Sstevel@tonic-gate 		auf_null,	0,
7137c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 248 ntp_gettime */
7147c478bd9Sstevel@tonic-gate 		auf_null,	0,
7158fd04b83SRoger A. Faulkner aui_null,	AUE_NTP_ADJTIME, aus_null,	/* 249 ntp_adjtime */
7167c478bd9Sstevel@tonic-gate 		auf_null,	0,
7177c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 250 lwp_mutex_unlock */
7187c478bd9Sstevel@tonic-gate 		auf_null,	0,
7197c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 251 lwp_mutex_trylock */
7207c478bd9Sstevel@tonic-gate 		auf_null,	0,
721883492d5Sraf aui_null,	AUE_NULL,	aus_null,	/* 252 lwp_mutex_register */
7227c478bd9Sstevel@tonic-gate 		auf_null,	0,
7237c478bd9Sstevel@tonic-gate aui_null,	AUE_NULL,	aus_null,	/* 253 cladm */
7247c478bd9Sstevel@tonic-gate 		auf_null,	0,
7259acbbeafSnn aui_null,	AUE_NULL,	aus_null,	/* 254 uucopy */
7267c478bd9Sstevel@tonic-gate 		auf_null,	0,
7277c478bd9Sstevel@tonic-gate aui_null,	AUE_UMOUNT2,	aus_umount2,	/* 255 umount2 */
7287c478bd9Sstevel@tonic-gate 		auf_null,	0
7297c478bd9Sstevel@tonic-gate };
7307c478bd9Sstevel@tonic-gate 
7317c478bd9Sstevel@tonic-gate uint_t num_syscall = sizeof (audit_s2e) / sizeof (struct audit_s2e);
7327c478bd9Sstevel@tonic-gate 
7337c478bd9Sstevel@tonic-gate 
734cb49a9fdSMarek Pospisil /* exit start function */
735cb49a9fdSMarek Pospisil /*ARGSUSED*/
736cb49a9fdSMarek Pospisil static void
737cb49a9fdSMarek Pospisil aus_exit(struct t_audit_data *tad)
738cb49a9fdSMarek Pospisil {
739cb49a9fdSMarek Pospisil 	uint32_t rval;
740cb49a9fdSMarek Pospisil 	struct a {
741cb49a9fdSMarek Pospisil 		long rval;
742cb49a9fdSMarek Pospisil 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
743cb49a9fdSMarek Pospisil 
744cb49a9fdSMarek Pospisil 	rval = (uint32_t)uap->rval;
745cb49a9fdSMarek Pospisil 	au_uwrite(au_to_arg32(1, "exit status", rval));
746cb49a9fdSMarek Pospisil }
747cb49a9fdSMarek Pospisil 
748*d2a70789SRichard Lowe 
7497c478bd9Sstevel@tonic-gate /* acct start function */
7507c478bd9Sstevel@tonic-gate /*ARGSUSED*/
7517c478bd9Sstevel@tonic-gate static void
7527c478bd9Sstevel@tonic-gate aus_acct(struct t_audit_data *tad)
7537c478bd9Sstevel@tonic-gate {
7547c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
7557c478bd9Sstevel@tonic-gate 	uintptr_t fname;
7567c478bd9Sstevel@tonic-gate 
7577c478bd9Sstevel@tonic-gate 	struct a {
7587c478bd9Sstevel@tonic-gate 		long	fname;		/* char * */
7597c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
7607c478bd9Sstevel@tonic-gate 
7617c478bd9Sstevel@tonic-gate 	fname = (uintptr_t)uap->fname;
7627c478bd9Sstevel@tonic-gate 
7637c478bd9Sstevel@tonic-gate 	if (fname == 0)
7647c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "accounting off", (uint32_t)0));
7657c478bd9Sstevel@tonic-gate }
7667c478bd9Sstevel@tonic-gate 
7677c478bd9Sstevel@tonic-gate /* chown start function */
7687c478bd9Sstevel@tonic-gate /*ARGSUSED*/
7697c478bd9Sstevel@tonic-gate static void
7707c478bd9Sstevel@tonic-gate aus_chown(struct t_audit_data *tad)
7717c478bd9Sstevel@tonic-gate {
7727c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
7737c478bd9Sstevel@tonic-gate 	uint32_t uid, gid;
7747c478bd9Sstevel@tonic-gate 
7757c478bd9Sstevel@tonic-gate 	struct a {
7767c478bd9Sstevel@tonic-gate 		long	fname;		/* char * */
7777c478bd9Sstevel@tonic-gate 		long	uid;
7787c478bd9Sstevel@tonic-gate 		long	gid;
7797c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
7807c478bd9Sstevel@tonic-gate 
7817c478bd9Sstevel@tonic-gate 	uid = (uint32_t)uap->uid;
7827c478bd9Sstevel@tonic-gate 	gid = (uint32_t)uap->gid;
7837c478bd9Sstevel@tonic-gate 
7847c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "new file uid", uid));
7857c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "new file gid", gid));
7867c478bd9Sstevel@tonic-gate }
7877c478bd9Sstevel@tonic-gate 
7887c478bd9Sstevel@tonic-gate /* fchown start function */
7897c478bd9Sstevel@tonic-gate /*ARGSUSED*/
7907c478bd9Sstevel@tonic-gate static void
7917c478bd9Sstevel@tonic-gate aus_fchown(struct t_audit_data *tad)
7927c478bd9Sstevel@tonic-gate {
7937c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
7947c478bd9Sstevel@tonic-gate 	uint32_t uid, gid, fd;
7957c478bd9Sstevel@tonic-gate 	struct file  *fp;
7967c478bd9Sstevel@tonic-gate 	struct vnode *vp;
7977c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
7987c478bd9Sstevel@tonic-gate 
7997c478bd9Sstevel@tonic-gate 	struct a {
8007c478bd9Sstevel@tonic-gate 		long fd;
8017c478bd9Sstevel@tonic-gate 		long uid;
8027c478bd9Sstevel@tonic-gate 		long gid;
8037c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
8047c478bd9Sstevel@tonic-gate 
8057c478bd9Sstevel@tonic-gate 	fd  = (uint32_t)uap->fd;
8067c478bd9Sstevel@tonic-gate 	uid = (uint32_t)uap->uid;
8077c478bd9Sstevel@tonic-gate 	gid = (uint32_t)uap->gid;
8087c478bd9Sstevel@tonic-gate 
8097c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "new file uid", uid));
8107c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "new file gid", gid));
8117c478bd9Sstevel@tonic-gate 
8127c478bd9Sstevel@tonic-gate 		/*
8137c478bd9Sstevel@tonic-gate 		 * convert file pointer to file descriptor
8147c478bd9Sstevel@tonic-gate 		 *   Note: fd ref count incremented here.
8157c478bd9Sstevel@tonic-gate 		 */
8167c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL)
8177c478bd9Sstevel@tonic-gate 		return;
8187c478bd9Sstevel@tonic-gate 
8197c478bd9Sstevel@tonic-gate 	/* get path from file struct here */
8207c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
8217c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
8227c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
8237c478bd9Sstevel@tonic-gate 	} else {
8247c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
8257c478bd9Sstevel@tonic-gate 	}
8267c478bd9Sstevel@tonic-gate 
8277c478bd9Sstevel@tonic-gate 	vp = fp->f_vnode;
8287c478bd9Sstevel@tonic-gate 	audit_attributes(vp);
8297c478bd9Sstevel@tonic-gate 
8307c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
8317c478bd9Sstevel@tonic-gate 	releasef(fd);
8327c478bd9Sstevel@tonic-gate }
8337c478bd9Sstevel@tonic-gate 
8347c478bd9Sstevel@tonic-gate /*ARGSUSED*/
8357c478bd9Sstevel@tonic-gate static void
8367c478bd9Sstevel@tonic-gate aus_lchown(struct t_audit_data *tad)
8377c478bd9Sstevel@tonic-gate {
8387c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
8397c478bd9Sstevel@tonic-gate 	uint32_t uid, gid;
8407c478bd9Sstevel@tonic-gate 
8417c478bd9Sstevel@tonic-gate 
8427c478bd9Sstevel@tonic-gate 	struct a {
8437c478bd9Sstevel@tonic-gate 		long	fname;		/* char	* */
8447c478bd9Sstevel@tonic-gate 		long	uid;
8457c478bd9Sstevel@tonic-gate 		long	gid;
8467c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
8477c478bd9Sstevel@tonic-gate 
8487c478bd9Sstevel@tonic-gate 	uid = (uint32_t)uap->uid;
8497c478bd9Sstevel@tonic-gate 	gid = (uint32_t)uap->gid;
8507c478bd9Sstevel@tonic-gate 
8517c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "new file uid", uid));
8527c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "new file gid", gid));
8537c478bd9Sstevel@tonic-gate }
8547c478bd9Sstevel@tonic-gate 
8558fd04b83SRoger A. Faulkner static au_event_t
8568fd04b83SRoger A. Faulkner aui_fchownat(au_event_t e)
8578fd04b83SRoger A. Faulkner {
8588fd04b83SRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
8598fd04b83SRoger A. Faulkner 
8608fd04b83SRoger A. Faulkner 	struct a {
8618fd04b83SRoger A. Faulkner 		long	fd;
8628fd04b83SRoger A. Faulkner 		long	fname;		/* char * */
8638fd04b83SRoger A. Faulkner 		long	uid;
8648fd04b83SRoger A. Faulkner 		long	gid;
8658fd04b83SRoger A. Faulkner 		long	flags;
8668fd04b83SRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
8678fd04b83SRoger A. Faulkner 
8688fd04b83SRoger A. Faulkner 	if (uap->fname == NULL)
8698fd04b83SRoger A. Faulkner 		e = AUE_FCHOWN;
8708fd04b83SRoger A. Faulkner 	else if (uap->flags & AT_SYMLINK_NOFOLLOW)
8718fd04b83SRoger A. Faulkner 		e = AUE_LCHOWN;
8728fd04b83SRoger A. Faulkner 	else
8738fd04b83SRoger A. Faulkner 		e = AUE_CHOWN;
8748fd04b83SRoger A. Faulkner 
8758fd04b83SRoger A. Faulkner 	return (e);
8768fd04b83SRoger A. Faulkner }
8778fd04b83SRoger A. Faulkner 
8788fd04b83SRoger A. Faulkner /*ARGSUSED*/
8798fd04b83SRoger A. Faulkner static void
8808fd04b83SRoger A. Faulkner aus_fchownat(struct t_audit_data *tad)
8818fd04b83SRoger A. Faulkner {
8828fd04b83SRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
8838fd04b83SRoger A. Faulkner 	uint32_t uid, gid;
8848fd04b83SRoger A. Faulkner 
8858fd04b83SRoger A. Faulkner 	struct a {
8868fd04b83SRoger A. Faulkner 		long	fd;
8878fd04b83SRoger A. Faulkner 		long	fname;		/* char * */
8888fd04b83SRoger A. Faulkner 		long	uid;
8898fd04b83SRoger A. Faulkner 		long	gid;
8908fd04b83SRoger A. Faulkner 		long	flags;
8918fd04b83SRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
8928fd04b83SRoger A. Faulkner 
8938fd04b83SRoger A. Faulkner 	uid = (uint32_t)uap->uid;
8948fd04b83SRoger A. Faulkner 	gid = (uint32_t)uap->gid;
8958fd04b83SRoger A. Faulkner 
8968fd04b83SRoger A. Faulkner 	au_uwrite(au_to_arg32(3, "new file uid", uid));
8978fd04b83SRoger A. Faulkner 	au_uwrite(au_to_arg32(4, "new file gid", gid));
8988fd04b83SRoger A. Faulkner }
8998fd04b83SRoger A. Faulkner 
9007c478bd9Sstevel@tonic-gate /*ARGSUSED*/
9017c478bd9Sstevel@tonic-gate static void
9027c478bd9Sstevel@tonic-gate aus_chmod(struct t_audit_data *tad)
9037c478bd9Sstevel@tonic-gate {
9047c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
9057c478bd9Sstevel@tonic-gate 	uint32_t fmode;
9067c478bd9Sstevel@tonic-gate 
9077c478bd9Sstevel@tonic-gate 	struct a {
9087c478bd9Sstevel@tonic-gate 		long	fname;		/* char	* */
9097c478bd9Sstevel@tonic-gate 		long	fmode;
9107c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
9117c478bd9Sstevel@tonic-gate 
9127c478bd9Sstevel@tonic-gate 	fmode = (uint32_t)uap->fmode;
9137c478bd9Sstevel@tonic-gate 
9147c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "new file mode", fmode&07777));
9157c478bd9Sstevel@tonic-gate }
9167c478bd9Sstevel@tonic-gate 
9177c478bd9Sstevel@tonic-gate /*ARGSUSED*/
9187c478bd9Sstevel@tonic-gate static void
9197c478bd9Sstevel@tonic-gate aus_fchmod(struct t_audit_data *tad)
9207c478bd9Sstevel@tonic-gate {
9217c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
9227c478bd9Sstevel@tonic-gate 	uint32_t fmode, fd;
9237c478bd9Sstevel@tonic-gate 	struct file  *fp;
9247c478bd9Sstevel@tonic-gate 	struct vnode *vp;
9257c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
9267c478bd9Sstevel@tonic-gate 
9277c478bd9Sstevel@tonic-gate 	struct a {
9287c478bd9Sstevel@tonic-gate 		long	fd;
9297c478bd9Sstevel@tonic-gate 		long	fmode;
9307c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
9317c478bd9Sstevel@tonic-gate 
9327c478bd9Sstevel@tonic-gate 	fd = (uint32_t)uap->fd;
9337c478bd9Sstevel@tonic-gate 	fmode = (uint32_t)uap->fmode;
9347c478bd9Sstevel@tonic-gate 
9357c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "new file mode", fmode&07777));
9367c478bd9Sstevel@tonic-gate 
937794f0adbSRoger A. Faulkner 	/*
938794f0adbSRoger A. Faulkner 	 * convert file pointer to file descriptor
939794f0adbSRoger A. Faulkner 	 *   Note: fd ref count incremented here.
940794f0adbSRoger A. Faulkner 	 */
9417c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL)
9427c478bd9Sstevel@tonic-gate 		return;
9437c478bd9Sstevel@tonic-gate 
944794f0adbSRoger A. Faulkner 	/* get path from file struct here */
945794f0adbSRoger A. Faulkner 	fad = F2A(fp);
946794f0adbSRoger A. Faulkner 	if (fad->fad_aupath != NULL) {
947794f0adbSRoger A. Faulkner 		au_uwrite(au_to_path(fad->fad_aupath));
948794f0adbSRoger A. Faulkner 	} else {
949794f0adbSRoger A. Faulkner 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
950794f0adbSRoger A. Faulkner 	}
951794f0adbSRoger A. Faulkner 
952794f0adbSRoger A. Faulkner 	vp = fp->f_vnode;
953794f0adbSRoger A. Faulkner 	audit_attributes(vp);
954794f0adbSRoger A. Faulkner 
955794f0adbSRoger A. Faulkner 	/* decrement file descriptor reference count */
956794f0adbSRoger A. Faulkner 	releasef(fd);
957794f0adbSRoger A. Faulkner }
958794f0adbSRoger A. Faulkner 
959794f0adbSRoger A. Faulkner static au_event_t
960794f0adbSRoger A. Faulkner aui_fchmodat(au_event_t e)
961794f0adbSRoger A. Faulkner {
962794f0adbSRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
963794f0adbSRoger A. Faulkner 
964794f0adbSRoger A. Faulkner 	struct a {
965794f0adbSRoger A. Faulkner 		long	fd;
966794f0adbSRoger A. Faulkner 		long	fname;		/* char	* */
967794f0adbSRoger A. Faulkner 		long	fmode;
968794f0adbSRoger A. Faulkner 		long	flag;
969794f0adbSRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
970794f0adbSRoger A. Faulkner 
971794f0adbSRoger A. Faulkner 	if (uap->fname == NULL)
972794f0adbSRoger A. Faulkner 		e = AUE_FCHMOD;
973794f0adbSRoger A. Faulkner 	else
974794f0adbSRoger A. Faulkner 		e = AUE_CHMOD;
975794f0adbSRoger A. Faulkner 
976794f0adbSRoger A. Faulkner 	return (e);
977794f0adbSRoger A. Faulkner }
978794f0adbSRoger A. Faulkner 
979794f0adbSRoger A. Faulkner /*ARGSUSED*/
980794f0adbSRoger A. Faulkner static void
981794f0adbSRoger A. Faulkner aus_fchmodat(struct t_audit_data *tad)
982794f0adbSRoger A. Faulkner {
983794f0adbSRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
984794f0adbSRoger A. Faulkner 	uint32_t fmode;
985794f0adbSRoger A. Faulkner 	uint32_t fd;
986794f0adbSRoger A. Faulkner 	struct file  *fp;
987794f0adbSRoger A. Faulkner 	struct vnode *vp;
988794f0adbSRoger A. Faulkner 	struct f_audit_data *fad;
989794f0adbSRoger A. Faulkner 
990794f0adbSRoger A. Faulkner 	struct a {
991794f0adbSRoger A. Faulkner 		long	fd;
992794f0adbSRoger A. Faulkner 		long	fname;		/* char	* */
993794f0adbSRoger A. Faulkner 		long	fmode;
994794f0adbSRoger A. Faulkner 		long	flag;
995794f0adbSRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
996794f0adbSRoger A. Faulkner 
997794f0adbSRoger A. Faulkner 	fd = (uint32_t)uap->fd;
998794f0adbSRoger A. Faulkner 	fmode = (uint32_t)uap->fmode;
999794f0adbSRoger A. Faulkner 
1000794f0adbSRoger A. Faulkner 	au_uwrite(au_to_arg32(2, "new file mode", fmode&07777));
1001794f0adbSRoger A. Faulkner 
1002794f0adbSRoger A. Faulkner 	if (fd == AT_FDCWD || uap->fname != NULL)	/* same as chmod() */
1003794f0adbSRoger A. Faulkner 		return;
1004794f0adbSRoger A. Faulkner 
1005794f0adbSRoger A. Faulkner 	/*
1006794f0adbSRoger A. Faulkner 	 * convert file pointer to file descriptor
1007794f0adbSRoger A. Faulkner 	 *   Note: fd ref count incremented here.
1008794f0adbSRoger A. Faulkner 	 */
1009794f0adbSRoger A. Faulkner 	if ((fp = getf(fd)) == NULL)
1010794f0adbSRoger A. Faulkner 		return;
1011794f0adbSRoger A. Faulkner 
1012794f0adbSRoger A. Faulkner 	/* get path from file struct here */
10137c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
10147c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
10157c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
10167c478bd9Sstevel@tonic-gate 	} else {
10177c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
10187c478bd9Sstevel@tonic-gate 	}
10197c478bd9Sstevel@tonic-gate 
10207c478bd9Sstevel@tonic-gate 	vp = fp->f_vnode;
10217c478bd9Sstevel@tonic-gate 	audit_attributes(vp);
10227c478bd9Sstevel@tonic-gate 
10237c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
10247c478bd9Sstevel@tonic-gate 	releasef(fd);
10257c478bd9Sstevel@tonic-gate }
10267c478bd9Sstevel@tonic-gate 
10278fd04b83SRoger A. Faulkner /*
10288fd04b83SRoger A. Faulkner  * convert open mode to appropriate open event
10298fd04b83SRoger A. Faulkner  */
10308fd04b83SRoger A. Faulkner au_event_t
10318fd04b83SRoger A. Faulkner open_event(uint_t fm)
10328fd04b83SRoger A. Faulkner {
10338fd04b83SRoger A. Faulkner 	au_event_t e;
10348fd04b83SRoger A. Faulkner 
1035794f0adbSRoger A. Faulkner 	switch (fm & (O_ACCMODE | O_CREAT | O_TRUNC)) {
10368fd04b83SRoger A. Faulkner 	case O_RDONLY:
10378fd04b83SRoger A. Faulkner 		e = AUE_OPEN_R;
10388fd04b83SRoger A. Faulkner 		break;
10398fd04b83SRoger A. Faulkner 	case O_RDONLY | O_CREAT:
10408fd04b83SRoger A. Faulkner 		e = AUE_OPEN_RC;
10418fd04b83SRoger A. Faulkner 		break;
10428fd04b83SRoger A. Faulkner 	case O_RDONLY | O_TRUNC:
10438fd04b83SRoger A. Faulkner 		e = AUE_OPEN_RT;
10448fd04b83SRoger A. Faulkner 		break;
10458fd04b83SRoger A. Faulkner 	case O_RDONLY | O_TRUNC | O_CREAT:
10468fd04b83SRoger A. Faulkner 		e = AUE_OPEN_RTC;
10478fd04b83SRoger A. Faulkner 		break;
10488fd04b83SRoger A. Faulkner 	case O_WRONLY:
10498fd04b83SRoger A. Faulkner 		e = AUE_OPEN_W;
10508fd04b83SRoger A. Faulkner 		break;
10518fd04b83SRoger A. Faulkner 	case O_WRONLY | O_CREAT:
10528fd04b83SRoger A. Faulkner 		e = AUE_OPEN_WC;
10538fd04b83SRoger A. Faulkner 		break;
10548fd04b83SRoger A. Faulkner 	case O_WRONLY | O_TRUNC:
10558fd04b83SRoger A. Faulkner 		e = AUE_OPEN_WT;
10568fd04b83SRoger A. Faulkner 		break;
10578fd04b83SRoger A. Faulkner 	case O_WRONLY | O_TRUNC | O_CREAT:
10588fd04b83SRoger A. Faulkner 		e = AUE_OPEN_WTC;
10598fd04b83SRoger A. Faulkner 		break;
10608fd04b83SRoger A. Faulkner 	case O_RDWR:
10618fd04b83SRoger A. Faulkner 		e = AUE_OPEN_RW;
10628fd04b83SRoger A. Faulkner 		break;
10638fd04b83SRoger A. Faulkner 	case O_RDWR | O_CREAT:
10648fd04b83SRoger A. Faulkner 		e = AUE_OPEN_RWC;
10658fd04b83SRoger A. Faulkner 		break;
10668fd04b83SRoger A. Faulkner 	case O_RDWR | O_TRUNC:
10678fd04b83SRoger A. Faulkner 		e = AUE_OPEN_RWT;
10688fd04b83SRoger A. Faulkner 		break;
10698fd04b83SRoger A. Faulkner 	case O_RDWR | O_TRUNC | O_CREAT:
10708fd04b83SRoger A. Faulkner 		e = AUE_OPEN_RWTC;
10718fd04b83SRoger A. Faulkner 		break;
1072794f0adbSRoger A. Faulkner 	case O_SEARCH:
1073794f0adbSRoger A. Faulkner 		e = AUE_OPEN_S;
1074794f0adbSRoger A. Faulkner 		break;
1075794f0adbSRoger A. Faulkner 	case O_EXEC:
1076794f0adbSRoger A. Faulkner 		e = AUE_OPEN_E;
1077794f0adbSRoger A. Faulkner 		break;
10788fd04b83SRoger A. Faulkner 	default:
10798fd04b83SRoger A. Faulkner 		e = AUE_NULL;
10808fd04b83SRoger A. Faulkner 		break;
10818fd04b83SRoger A. Faulkner 	}
10827c478bd9Sstevel@tonic-gate 
10838fd04b83SRoger A. Faulkner 	return (e);
10848fd04b83SRoger A. Faulkner }
10858fd04b83SRoger A. Faulkner 
10868fd04b83SRoger A. Faulkner /* ARGSUSED */
10877c478bd9Sstevel@tonic-gate static au_event_t
10887c478bd9Sstevel@tonic-gate aui_open(au_event_t e)
10897c478bd9Sstevel@tonic-gate {
10907c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
10917c478bd9Sstevel@tonic-gate 	uint_t fm;
10927c478bd9Sstevel@tonic-gate 
10937c478bd9Sstevel@tonic-gate 	struct a {
10947c478bd9Sstevel@tonic-gate 		long	fnamep;		/* char	* */
10957c478bd9Sstevel@tonic-gate 		long	fmode;
10967c478bd9Sstevel@tonic-gate 		long	cmode;
10977c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
10987c478bd9Sstevel@tonic-gate 
10997c478bd9Sstevel@tonic-gate 	fm = (uint_t)uap->fmode;
11007c478bd9Sstevel@tonic-gate 
11018fd04b83SRoger A. Faulkner 	return (open_event(fm));
11027c478bd9Sstevel@tonic-gate }
11037c478bd9Sstevel@tonic-gate 
11047c478bd9Sstevel@tonic-gate static void
11057c478bd9Sstevel@tonic-gate aus_open(struct t_audit_data *tad)
11067c478bd9Sstevel@tonic-gate {
11077c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
11087c478bd9Sstevel@tonic-gate 	uint_t fm;
11097c478bd9Sstevel@tonic-gate 
11107c478bd9Sstevel@tonic-gate 	struct a {
11117c478bd9Sstevel@tonic-gate 		long	fnamep;		/* char	* */
11127c478bd9Sstevel@tonic-gate 		long	fmode;
11137c478bd9Sstevel@tonic-gate 		long	cmode;
11147c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
11157c478bd9Sstevel@tonic-gate 
11167c478bd9Sstevel@tonic-gate 	fm = (uint_t)uap->fmode;
11177c478bd9Sstevel@tonic-gate 
11187c478bd9Sstevel@tonic-gate 	/* If no write, create, or trunc modes, mark as a public op */
11198fd04b83SRoger A. Faulkner 	if ((fm & (O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_TRUNC)) == O_RDONLY)
11204a0fa546SMarek Pospisil 		tad->tad_ctrl |= TAD_PUBLIC_EV;
11217c478bd9Sstevel@tonic-gate }
11227c478bd9Sstevel@tonic-gate 
11238fd04b83SRoger A. Faulkner /* ARGSUSED */
11247c478bd9Sstevel@tonic-gate static au_event_t
11258fd04b83SRoger A. Faulkner aui_openat(au_event_t e)
11267c478bd9Sstevel@tonic-gate {
11278fd04b83SRoger A. Faulkner 	t_audit_data_t *tad = T2A(curthread);
11287c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
11298fd04b83SRoger A. Faulkner 	uint_t fm;
11308fd04b83SRoger A. Faulkner 
11317c478bd9Sstevel@tonic-gate 	struct a {
11328fd04b83SRoger A. Faulkner 		long	filedes;
11338fd04b83SRoger A. Faulkner 		long	fnamep;		/* char	* */
11348fd04b83SRoger A. Faulkner 		long	fmode;
11358fd04b83SRoger A. Faulkner 		long	cmode;
11367c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
11377c478bd9Sstevel@tonic-gate 
11388fd04b83SRoger A. Faulkner 	fm = (uint_t)uap->fmode;
11397c478bd9Sstevel@tonic-gate 
1140c4d3e299SBrent Paulson 	/*
1141c4d3e299SBrent Paulson 	 * __openattrdirat() does an extra pathname lookup in order to
1142c4d3e299SBrent Paulson 	 * enter the extended system attribute namespace of the referenced
1143c4d3e299SBrent Paulson 	 * extended attribute filename.
1144c4d3e299SBrent Paulson 	 */
1145c4d3e299SBrent Paulson 	if (fm & FXATTRDIROPEN)
1146c4d3e299SBrent Paulson 		tad->tad_ctrl |= TAD_MLD;
11477c478bd9Sstevel@tonic-gate 
11488fd04b83SRoger A. Faulkner 	return (open_event(fm));
11498fd04b83SRoger A. Faulkner }
11507c478bd9Sstevel@tonic-gate 
11518fd04b83SRoger A. Faulkner static void
11528fd04b83SRoger A. Faulkner aus_openat(struct t_audit_data *tad)
11538fd04b83SRoger A. Faulkner {
11548fd04b83SRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
11558fd04b83SRoger A. Faulkner 	uint_t fm;
11567c478bd9Sstevel@tonic-gate 
11578fd04b83SRoger A. Faulkner 	struct a {
11588fd04b83SRoger A. Faulkner 		long	filedes;
11598fd04b83SRoger A. Faulkner 		long	fnamep;		/* char	* */
11608fd04b83SRoger A. Faulkner 		long	fmode;
11618fd04b83SRoger A. Faulkner 		long	cmode;
11628fd04b83SRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
11637c478bd9Sstevel@tonic-gate 
11648fd04b83SRoger A. Faulkner 	fm = (uint_t)uap->fmode;
11657c478bd9Sstevel@tonic-gate 
11668fd04b83SRoger A. Faulkner 	/* If no write, create, or trunc modes, mark as a public op */
11678fd04b83SRoger A. Faulkner 	if ((fm & (O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_TRUNC)) == O_RDONLY)
11684a0fa546SMarek Pospisil 		tad->tad_ctrl |= TAD_PUBLIC_EV;
11697c478bd9Sstevel@tonic-gate }
11707c478bd9Sstevel@tonic-gate 
11718fd04b83SRoger A. Faulkner static au_event_t
11728fd04b83SRoger A. Faulkner aui_unlinkat(au_event_t e)
11737c478bd9Sstevel@tonic-gate {
11747c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
11758fd04b83SRoger A. Faulkner 
11767c478bd9Sstevel@tonic-gate 	struct a {
11778fd04b83SRoger A. Faulkner 		long	filedes;
11788fd04b83SRoger A. Faulkner 		long	fnamep;		/* char	* */
11798fd04b83SRoger A. Faulkner 		long	flags;
11807c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
11817c478bd9Sstevel@tonic-gate 
11828fd04b83SRoger A. Faulkner 	if (uap->flags & AT_REMOVEDIR)
11838fd04b83SRoger A. Faulkner 		e = AUE_RMDIR;
11848fd04b83SRoger A. Faulkner 	else
11858fd04b83SRoger A. Faulkner 		e = AUE_UNLINK;
11867c478bd9Sstevel@tonic-gate 
11878fd04b83SRoger A. Faulkner 	return (e);
11888fd04b83SRoger A. Faulkner }
11897c478bd9Sstevel@tonic-gate 
11908fd04b83SRoger A. Faulkner static au_event_t
11918fd04b83SRoger A. Faulkner aui_fstatat(au_event_t e)
11928fd04b83SRoger A. Faulkner {
11938fd04b83SRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
11947c478bd9Sstevel@tonic-gate 
11958fd04b83SRoger A. Faulkner 	struct a {
11968fd04b83SRoger A. Faulkner 		long	filedes;
11978fd04b83SRoger A. Faulkner 		long	fnamep;		/* char	* */
11988fd04b83SRoger A. Faulkner 		long	statb;
11998fd04b83SRoger A. Faulkner 		long	flags;
12008fd04b83SRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
12018fd04b83SRoger A. Faulkner 
12028fd04b83SRoger A. Faulkner 	if (uap->fnamep == NULL)
12038fd04b83SRoger A. Faulkner 		e = AUE_FSTAT;
12048fd04b83SRoger A. Faulkner 	else if (uap->flags & AT_SYMLINK_NOFOLLOW)
12058fd04b83SRoger A. Faulkner 		e = AUE_LSTAT;
12068fd04b83SRoger A. Faulkner 	else
12078fd04b83SRoger A. Faulkner 		e = AUE_STAT;
12088fd04b83SRoger A. Faulkner 
12098fd04b83SRoger A. Faulkner 	return (e);
12107c478bd9Sstevel@tonic-gate }
12117c478bd9Sstevel@tonic-gate 
12127c478bd9Sstevel@tonic-gate /* msgsys */
12137c478bd9Sstevel@tonic-gate static au_event_t
12147c478bd9Sstevel@tonic-gate aui_msgsys(au_event_t e)
12157c478bd9Sstevel@tonic-gate {
12167c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
12177c478bd9Sstevel@tonic-gate 	uint_t fm;
12187c478bd9Sstevel@tonic-gate 
12197c478bd9Sstevel@tonic-gate 	struct a {
12207c478bd9Sstevel@tonic-gate 		long	id;	/* function code id */
12217c478bd9Sstevel@tonic-gate 		long	ap;	/* arg pointer for recvmsg */
12227c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
12237c478bd9Sstevel@tonic-gate 
12247c478bd9Sstevel@tonic-gate 	struct b {
12257c478bd9Sstevel@tonic-gate 		long	msgid;
12267c478bd9Sstevel@tonic-gate 		long	cmd;
12277c478bd9Sstevel@tonic-gate 		long	buf;	/* struct msqid_ds * */
12287c478bd9Sstevel@tonic-gate 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
12297c478bd9Sstevel@tonic-gate 
12307c478bd9Sstevel@tonic-gate 	fm  = (uint_t)uap->id;
12317c478bd9Sstevel@tonic-gate 
12327c478bd9Sstevel@tonic-gate 	switch (fm) {
12337c478bd9Sstevel@tonic-gate 	case 0:		/* msgget */
12347c478bd9Sstevel@tonic-gate 		e = AUE_MSGGET;
12357c478bd9Sstevel@tonic-gate 		break;
12367c478bd9Sstevel@tonic-gate 	case 1:		/* msgctl */
12377c478bd9Sstevel@tonic-gate 		switch ((uint_t)uap1->cmd) {
12387c478bd9Sstevel@tonic-gate 		case IPC_RMID:
12397c478bd9Sstevel@tonic-gate 			e = AUE_MSGCTL_RMID;
12407c478bd9Sstevel@tonic-gate 			break;
12417c478bd9Sstevel@tonic-gate 		case IPC_SET:
12427c478bd9Sstevel@tonic-gate 			e = AUE_MSGCTL_SET;
12437c478bd9Sstevel@tonic-gate 			break;
12447c478bd9Sstevel@tonic-gate 		case IPC_STAT:
12457c478bd9Sstevel@tonic-gate 			e = AUE_MSGCTL_STAT;
12467c478bd9Sstevel@tonic-gate 			break;
12477c478bd9Sstevel@tonic-gate 		default:
12487c478bd9Sstevel@tonic-gate 			e = AUE_MSGCTL;
12497c478bd9Sstevel@tonic-gate 			break;
12507c478bd9Sstevel@tonic-gate 		}
12517c478bd9Sstevel@tonic-gate 		break;
12527c478bd9Sstevel@tonic-gate 	case 2:		/* msgrcv */
12537c478bd9Sstevel@tonic-gate 		e = AUE_MSGRCV;
12547c478bd9Sstevel@tonic-gate 		break;
12557c478bd9Sstevel@tonic-gate 	case 3:		/* msgsnd */
12567c478bd9Sstevel@tonic-gate 		e = AUE_MSGSND;
12577c478bd9Sstevel@tonic-gate 		break;
12587c478bd9Sstevel@tonic-gate 	default:	/* illegal system call */
12597c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
12607c478bd9Sstevel@tonic-gate 		break;
12617c478bd9Sstevel@tonic-gate 	}
12627c478bd9Sstevel@tonic-gate 
12637c478bd9Sstevel@tonic-gate 	return (e);
12647c478bd9Sstevel@tonic-gate }
12657c478bd9Sstevel@tonic-gate 
12667c478bd9Sstevel@tonic-gate 
12677c478bd9Sstevel@tonic-gate /* shmsys */
12687c478bd9Sstevel@tonic-gate static au_event_t
12697c478bd9Sstevel@tonic-gate aui_shmsys(au_event_t e)
12707c478bd9Sstevel@tonic-gate {
12717c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
12727c478bd9Sstevel@tonic-gate 	int fm;
12737c478bd9Sstevel@tonic-gate 
12747c478bd9Sstevel@tonic-gate 	struct a {		/* shmsys */
12757c478bd9Sstevel@tonic-gate 		long	id;	/* function code id */
12767c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
12777c478bd9Sstevel@tonic-gate 
12787c478bd9Sstevel@tonic-gate 	struct b {		/* ctrl */
12797c478bd9Sstevel@tonic-gate 		long	shmid;
12807c478bd9Sstevel@tonic-gate 		long	cmd;
12817c478bd9Sstevel@tonic-gate 		long	arg;		/* struct shmid_ds * */
12827c478bd9Sstevel@tonic-gate 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
12837c478bd9Sstevel@tonic-gate 	fm  = (uint_t)uap->id;
12847c478bd9Sstevel@tonic-gate 
12857c478bd9Sstevel@tonic-gate 	switch (fm) {
12867c478bd9Sstevel@tonic-gate 	case 0:		/* shmat */
12877c478bd9Sstevel@tonic-gate 		e = AUE_SHMAT;
12887c478bd9Sstevel@tonic-gate 		break;
12897c478bd9Sstevel@tonic-gate 	case 1:		/* shmctl */
12907c478bd9Sstevel@tonic-gate 		switch ((uint_t)uap1->cmd) {
12917c478bd9Sstevel@tonic-gate 		case IPC_RMID:
12927c478bd9Sstevel@tonic-gate 			e = AUE_SHMCTL_RMID;
12937c478bd9Sstevel@tonic-gate 			break;
12947c478bd9Sstevel@tonic-gate 		case IPC_SET:
12957c478bd9Sstevel@tonic-gate 			e = AUE_SHMCTL_SET;
12967c478bd9Sstevel@tonic-gate 			break;
12977c478bd9Sstevel@tonic-gate 		case IPC_STAT:
12987c478bd9Sstevel@tonic-gate 			e = AUE_SHMCTL_STAT;
12997c478bd9Sstevel@tonic-gate 			break;
13007c478bd9Sstevel@tonic-gate 		default:
13017c478bd9Sstevel@tonic-gate 			e = AUE_SHMCTL;
13027c478bd9Sstevel@tonic-gate 			break;
13037c478bd9Sstevel@tonic-gate 		}
13047c478bd9Sstevel@tonic-gate 		break;
13057c478bd9Sstevel@tonic-gate 	case 2:		/* shmdt */
13067c478bd9Sstevel@tonic-gate 		e = AUE_SHMDT;
13077c478bd9Sstevel@tonic-gate 		break;
13087c478bd9Sstevel@tonic-gate 	case 3:		/* shmget */
13097c478bd9Sstevel@tonic-gate 		e = AUE_SHMGET;
13107c478bd9Sstevel@tonic-gate 		break;
13117c478bd9Sstevel@tonic-gate 	default:	/* illegal system call */
13127c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
13137c478bd9Sstevel@tonic-gate 		break;
13147c478bd9Sstevel@tonic-gate 	}
13157c478bd9Sstevel@tonic-gate 
13167c478bd9Sstevel@tonic-gate 	return (e);
13177c478bd9Sstevel@tonic-gate }
13187c478bd9Sstevel@tonic-gate 
13197c478bd9Sstevel@tonic-gate 
13207c478bd9Sstevel@tonic-gate /* semsys */
13217c478bd9Sstevel@tonic-gate static au_event_t
13227c478bd9Sstevel@tonic-gate aui_semsys(au_event_t e)
13237c478bd9Sstevel@tonic-gate {
13247c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
13257c478bd9Sstevel@tonic-gate 	uint_t fm;
13267c478bd9Sstevel@tonic-gate 
13277c478bd9Sstevel@tonic-gate 	struct a {		/* semsys */
13287c478bd9Sstevel@tonic-gate 		long	id;
13297c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
13307c478bd9Sstevel@tonic-gate 
13317c478bd9Sstevel@tonic-gate 	struct b {		/* ctrl */
13327c478bd9Sstevel@tonic-gate 		long	semid;
13337c478bd9Sstevel@tonic-gate 		long	semnum;
13347c478bd9Sstevel@tonic-gate 		long	cmd;
13357c478bd9Sstevel@tonic-gate 		long	arg;
13367c478bd9Sstevel@tonic-gate 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
13377c478bd9Sstevel@tonic-gate 
13387c478bd9Sstevel@tonic-gate 	fm = (uint_t)uap->id;
13397c478bd9Sstevel@tonic-gate 
13407c478bd9Sstevel@tonic-gate 	switch (fm) {
13417c478bd9Sstevel@tonic-gate 	case 0:		/* semctl */
13427c478bd9Sstevel@tonic-gate 		switch ((uint_t)uap1->cmd) {
13437c478bd9Sstevel@tonic-gate 		case IPC_RMID:
13447c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_RMID;
13457c478bd9Sstevel@tonic-gate 			break;
13467c478bd9Sstevel@tonic-gate 		case IPC_SET:
13477c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_SET;
13487c478bd9Sstevel@tonic-gate 			break;
13497c478bd9Sstevel@tonic-gate 		case IPC_STAT:
13507c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_STAT;
13517c478bd9Sstevel@tonic-gate 			break;
13527c478bd9Sstevel@tonic-gate 		case GETNCNT:
13537c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_GETNCNT;
13547c478bd9Sstevel@tonic-gate 			break;
13557c478bd9Sstevel@tonic-gate 		case GETPID:
13567c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_GETPID;
13577c478bd9Sstevel@tonic-gate 			break;
13587c478bd9Sstevel@tonic-gate 		case GETVAL:
13597c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_GETVAL;
13607c478bd9Sstevel@tonic-gate 			break;
13617c478bd9Sstevel@tonic-gate 		case GETALL:
13627c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_GETALL;
13637c478bd9Sstevel@tonic-gate 			break;
13647c478bd9Sstevel@tonic-gate 		case GETZCNT:
13657c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_GETZCNT;
13667c478bd9Sstevel@tonic-gate 			break;
13677c478bd9Sstevel@tonic-gate 		case SETVAL:
13687c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_SETVAL;
13697c478bd9Sstevel@tonic-gate 			break;
13707c478bd9Sstevel@tonic-gate 		case SETALL:
13717c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL_SETALL;
13727c478bd9Sstevel@tonic-gate 			break;
13737c478bd9Sstevel@tonic-gate 		default:
13747c478bd9Sstevel@tonic-gate 			e = AUE_SEMCTL;
13757c478bd9Sstevel@tonic-gate 			break;
13767c478bd9Sstevel@tonic-gate 		}
13777c478bd9Sstevel@tonic-gate 		break;
13787c478bd9Sstevel@tonic-gate 	case 1:		/* semget */
13797c478bd9Sstevel@tonic-gate 		e = AUE_SEMGET;
13807c478bd9Sstevel@tonic-gate 		break;
13817c478bd9Sstevel@tonic-gate 	case 2:		/* semop */
13827c478bd9Sstevel@tonic-gate 		e = AUE_SEMOP;
13837c478bd9Sstevel@tonic-gate 		break;
13847c478bd9Sstevel@tonic-gate 	default:	/* illegal system call */
13857c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
13867c478bd9Sstevel@tonic-gate 		break;
13877c478bd9Sstevel@tonic-gate 	}
13887c478bd9Sstevel@tonic-gate 
13897c478bd9Sstevel@tonic-gate 	return (e);
13907c478bd9Sstevel@tonic-gate }
13917c478bd9Sstevel@tonic-gate 
13927c478bd9Sstevel@tonic-gate /* utssys - uname(2), ustat(2), fusers(2) */
13937c478bd9Sstevel@tonic-gate static au_event_t
13947c478bd9Sstevel@tonic-gate aui_utssys(au_event_t e)
13957c478bd9Sstevel@tonic-gate {
13967c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
13977c478bd9Sstevel@tonic-gate 	uint_t type;
13987c478bd9Sstevel@tonic-gate 
13997c478bd9Sstevel@tonic-gate 	struct a {
14007c478bd9Sstevel@tonic-gate 		union {
14017c478bd9Sstevel@tonic-gate 			long	cbuf;		/* char * */
14027c478bd9Sstevel@tonic-gate 			long	ubuf;		/* struct stat * */
14037c478bd9Sstevel@tonic-gate 		} ub;
14047c478bd9Sstevel@tonic-gate 		union {
14057c478bd9Sstevel@tonic-gate 			long	mv;	/* for USTAT */
14067c478bd9Sstevel@tonic-gate 			long	flags;	/* for FUSERS */
14077c478bd9Sstevel@tonic-gate 		} un;
14087c478bd9Sstevel@tonic-gate 		long	type;
14097c478bd9Sstevel@tonic-gate 		long	outbp;		/* char * for FUSERS */
14107c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
14117c478bd9Sstevel@tonic-gate 
14127c478bd9Sstevel@tonic-gate 	type = (uint_t)uap->type;
14137c478bd9Sstevel@tonic-gate 
14147c478bd9Sstevel@tonic-gate 	if (type == UTS_FUSERS)
14157c478bd9Sstevel@tonic-gate 		return (e);
14167c478bd9Sstevel@tonic-gate 	else
14177c478bd9Sstevel@tonic-gate 		return ((au_event_t)AUE_NULL);
14187c478bd9Sstevel@tonic-gate }
14197c478bd9Sstevel@tonic-gate 
14207c478bd9Sstevel@tonic-gate static au_event_t
14217c478bd9Sstevel@tonic-gate aui_fcntl(au_event_t e)
14227c478bd9Sstevel@tonic-gate {
14237c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
14247c478bd9Sstevel@tonic-gate 	uint_t cmd;
14257c478bd9Sstevel@tonic-gate 
14267c478bd9Sstevel@tonic-gate 	struct a {
14277c478bd9Sstevel@tonic-gate 		long	fdes;
14287c478bd9Sstevel@tonic-gate 		long	cmd;
14297c478bd9Sstevel@tonic-gate 		long	arg;
14307c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
14317c478bd9Sstevel@tonic-gate 
14327c478bd9Sstevel@tonic-gate 	cmd = (uint_t)uap->cmd;
14337c478bd9Sstevel@tonic-gate 
14347c478bd9Sstevel@tonic-gate 	switch (cmd) {
14357c478bd9Sstevel@tonic-gate 	case F_GETLK:
14367c478bd9Sstevel@tonic-gate 	case F_SETLK:
14377c478bd9Sstevel@tonic-gate 	case F_SETLKW:
14387c478bd9Sstevel@tonic-gate 		break;
14397c478bd9Sstevel@tonic-gate 	case F_SETFL:
14407c478bd9Sstevel@tonic-gate 	case F_GETFL:
14417c478bd9Sstevel@tonic-gate 	case F_GETFD:
14427c478bd9Sstevel@tonic-gate 		break;
14437c478bd9Sstevel@tonic-gate 	default:
14447c478bd9Sstevel@tonic-gate 		e = (au_event_t)AUE_NULL;
14457c478bd9Sstevel@tonic-gate 		break;
14467c478bd9Sstevel@tonic-gate 	}
14477c478bd9Sstevel@tonic-gate 	return ((au_event_t)e);
14487c478bd9Sstevel@tonic-gate }
14497c478bd9Sstevel@tonic-gate 
14507c478bd9Sstevel@tonic-gate /* null function for now */
14517c478bd9Sstevel@tonic-gate static au_event_t
14527c478bd9Sstevel@tonic-gate aui_execve(au_event_t e)
14537c478bd9Sstevel@tonic-gate {
14547c478bd9Sstevel@tonic-gate 	return (e);
14557c478bd9Sstevel@tonic-gate }
14567c478bd9Sstevel@tonic-gate 
14577c478bd9Sstevel@tonic-gate /*ARGSUSED*/
14587c478bd9Sstevel@tonic-gate static void
14597c478bd9Sstevel@tonic-gate aus_fcntl(struct t_audit_data *tad)
14607c478bd9Sstevel@tonic-gate {
14617c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
146251b433b7SMarek Pospisil 	uint32_t cmd, fd, flags;
14637c478bd9Sstevel@tonic-gate 	struct file  *fp;
14647c478bd9Sstevel@tonic-gate 	struct vnode *vp;
14657c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
14667c478bd9Sstevel@tonic-gate 
14677c478bd9Sstevel@tonic-gate 	struct a {
14687c478bd9Sstevel@tonic-gate 		long	fd;
14697c478bd9Sstevel@tonic-gate 		long	cmd;
14707c478bd9Sstevel@tonic-gate 		long	arg;
14717c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
14727c478bd9Sstevel@tonic-gate 
147351b433b7SMarek Pospisil 	cmd	= (uint32_t)uap->cmd;
147451b433b7SMarek Pospisil 	fd	= (uint32_t)uap->fd;
147551b433b7SMarek Pospisil 	flags	= (uint32_t)uap->arg;
14767c478bd9Sstevel@tonic-gate 
14777c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "cmd", cmd));
14787c478bd9Sstevel@tonic-gate 
147951b433b7SMarek Pospisil 	if (cmd == F_SETFL)
148051b433b7SMarek Pospisil 		au_uwrite(au_to_arg32(3, "flags", flags));
148151b433b7SMarek Pospisil 
14827c478bd9Sstevel@tonic-gate 		/*
14837c478bd9Sstevel@tonic-gate 		 * convert file pointer to file descriptor
14847c478bd9Sstevel@tonic-gate 		 *   Note: fd ref count incremented here.
14857c478bd9Sstevel@tonic-gate 		 */
14867c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL)
14877c478bd9Sstevel@tonic-gate 		return;
14887c478bd9Sstevel@tonic-gate 
14897c478bd9Sstevel@tonic-gate 	/* get path from file struct here */
14907c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
14917c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
14927c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
14937c478bd9Sstevel@tonic-gate 	} else {
14947c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
14957c478bd9Sstevel@tonic-gate 	}
14967c478bd9Sstevel@tonic-gate 
14977c478bd9Sstevel@tonic-gate 	vp = fp->f_vnode;
14987c478bd9Sstevel@tonic-gate 	audit_attributes(vp);
14997c478bd9Sstevel@tonic-gate 
15007c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
15017c478bd9Sstevel@tonic-gate 	releasef(fd);
15027c478bd9Sstevel@tonic-gate }
15037c478bd9Sstevel@tonic-gate 
15047c478bd9Sstevel@tonic-gate /*ARGSUSED*/
15057c478bd9Sstevel@tonic-gate static void
15067c478bd9Sstevel@tonic-gate aus_kill(struct t_audit_data *tad)
15077c478bd9Sstevel@tonic-gate {
15087c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
15097c478bd9Sstevel@tonic-gate 	struct proc *p;
15107c478bd9Sstevel@tonic-gate 	uint32_t signo;
15117c478bd9Sstevel@tonic-gate 	uid_t uid, ruid;
15127c478bd9Sstevel@tonic-gate 	gid_t gid, rgid;
15137c478bd9Sstevel@tonic-gate 	pid_t pid;
15147c478bd9Sstevel@tonic-gate 	const auditinfo_addr_t *ainfo;
15157c478bd9Sstevel@tonic-gate 	cred_t *cr;
15167c478bd9Sstevel@tonic-gate 
15177c478bd9Sstevel@tonic-gate 	struct a {
15187c478bd9Sstevel@tonic-gate 		long	pid;
15197c478bd9Sstevel@tonic-gate 		long	signo;
15207c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
15217c478bd9Sstevel@tonic-gate 
15227c478bd9Sstevel@tonic-gate 	pid   = (pid_t)uap->pid;
15237c478bd9Sstevel@tonic-gate 	signo = (uint32_t)uap->signo;
15247c478bd9Sstevel@tonic-gate 
15257c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "signal", signo));
15267c478bd9Sstevel@tonic-gate 	if (pid > 0) {
15277c478bd9Sstevel@tonic-gate 		mutex_enter(&pidlock);
15287c478bd9Sstevel@tonic-gate 		if (((p = prfind(pid)) == (struct proc *)0) ||
15297c478bd9Sstevel@tonic-gate 		    (p->p_stat == SIDL)) {
15307c478bd9Sstevel@tonic-gate 			mutex_exit(&pidlock);
15317c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "process", (uint32_t)pid));
15327c478bd9Sstevel@tonic-gate 			return;
15337c478bd9Sstevel@tonic-gate 		}
15347c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_lock); /* so process doesn't go away */
15357c478bd9Sstevel@tonic-gate 		mutex_exit(&pidlock);
15367c478bd9Sstevel@tonic-gate 
15377c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_crlock);
15387c478bd9Sstevel@tonic-gate 		crhold(cr = p->p_cred);
15397c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_crlock);
15407c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_lock);
15417c478bd9Sstevel@tonic-gate 
15427c478bd9Sstevel@tonic-gate 		ainfo = crgetauinfo(cr);
15437c478bd9Sstevel@tonic-gate 		if (ainfo == NULL) {
15447c478bd9Sstevel@tonic-gate 			crfree(cr);
15457c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "process", (uint32_t)pid));
15467c478bd9Sstevel@tonic-gate 			return;
15477c478bd9Sstevel@tonic-gate 		}
15487c478bd9Sstevel@tonic-gate 
15497c478bd9Sstevel@tonic-gate 		uid  = crgetuid(cr);
15507c478bd9Sstevel@tonic-gate 		gid  = crgetgid(cr);
15517c478bd9Sstevel@tonic-gate 		ruid = crgetruid(cr);
15527c478bd9Sstevel@tonic-gate 		rgid = crgetrgid(cr);
15537c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
15547c478bd9Sstevel@tonic-gate 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
155545916cd2Sjpk 
155645916cd2Sjpk 		if (is_system_labeled())
155745916cd2Sjpk 			au_uwrite(au_to_label(CR_SL(cr)));
155845916cd2Sjpk 
15597c478bd9Sstevel@tonic-gate 		crfree(cr);
15607c478bd9Sstevel@tonic-gate 	}
15617c478bd9Sstevel@tonic-gate 	else
15627c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "process", (uint32_t)pid));
15637c478bd9Sstevel@tonic-gate }
15647c478bd9Sstevel@tonic-gate 
15657c478bd9Sstevel@tonic-gate /*ARGSUSED*/
15667c478bd9Sstevel@tonic-gate static void
15677c478bd9Sstevel@tonic-gate aus_mkdir(struct t_audit_data *tad)
15687c478bd9Sstevel@tonic-gate {
15697c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
15707c478bd9Sstevel@tonic-gate 	uint32_t dmode;
15717c478bd9Sstevel@tonic-gate 
15727c478bd9Sstevel@tonic-gate 	struct a {
15737c478bd9Sstevel@tonic-gate 		long	dirnamep;		/* char * */
15747c478bd9Sstevel@tonic-gate 		long	dmode;
15757c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
15767c478bd9Sstevel@tonic-gate 
15777c478bd9Sstevel@tonic-gate 	dmode = (uint32_t)uap->dmode;
15787c478bd9Sstevel@tonic-gate 
15797c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "mode", dmode));
15807c478bd9Sstevel@tonic-gate }
15817c478bd9Sstevel@tonic-gate 
1582794f0adbSRoger A. Faulkner /*ARGSUSED*/
1583794f0adbSRoger A. Faulkner static void
1584794f0adbSRoger A. Faulkner aus_mkdirat(struct t_audit_data *tad)
1585794f0adbSRoger A. Faulkner {
1586794f0adbSRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
1587794f0adbSRoger A. Faulkner 	uint32_t dmode;
1588794f0adbSRoger A. Faulkner 
1589794f0adbSRoger A. Faulkner 	struct a {
1590794f0adbSRoger A. Faulkner 		long	fd;
1591794f0adbSRoger A. Faulkner 		long	dirnamep;		/* char * */
1592794f0adbSRoger A. Faulkner 		long	dmode;
1593794f0adbSRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
1594794f0adbSRoger A. Faulkner 
1595794f0adbSRoger A. Faulkner 	dmode = (uint32_t)uap->dmode;
1596794f0adbSRoger A. Faulkner 
1597794f0adbSRoger A. Faulkner 	au_uwrite(au_to_arg32(2, "mode", dmode));
1598794f0adbSRoger A. Faulkner }
1599794f0adbSRoger A. Faulkner 
16007c478bd9Sstevel@tonic-gate /*ARGSUSED*/
16017c478bd9Sstevel@tonic-gate static void
16027c478bd9Sstevel@tonic-gate aus_mknod(struct t_audit_data *tad)
16037c478bd9Sstevel@tonic-gate {
16047c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
16057c478bd9Sstevel@tonic-gate 	uint32_t fmode;
16067c478bd9Sstevel@tonic-gate 	dev_t dev;
16077c478bd9Sstevel@tonic-gate 
16087c478bd9Sstevel@tonic-gate 	struct a {
16097c478bd9Sstevel@tonic-gate 		long	pnamep;		/* char * */
16107c478bd9Sstevel@tonic-gate 		long	fmode;
16117c478bd9Sstevel@tonic-gate 		long	dev;
16127c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
16137c478bd9Sstevel@tonic-gate 
16147c478bd9Sstevel@tonic-gate 	fmode = (uint32_t)uap->fmode;
16157c478bd9Sstevel@tonic-gate 	dev   = (dev_t)uap->dev;
16167c478bd9Sstevel@tonic-gate 
16177c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "mode", fmode));
16187c478bd9Sstevel@tonic-gate #ifdef _LP64
16197c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg64(3, "dev", dev));
16207c478bd9Sstevel@tonic-gate #else
16217c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "dev", dev));
16227c478bd9Sstevel@tonic-gate #endif
16237c478bd9Sstevel@tonic-gate }
16247c478bd9Sstevel@tonic-gate 
16257c478bd9Sstevel@tonic-gate /*ARGSUSED*/
16267c478bd9Sstevel@tonic-gate static void
16277c478bd9Sstevel@tonic-gate auf_mknod(struct t_audit_data *tad, int error, rval_t *rval)
16287c478bd9Sstevel@tonic-gate {
16297c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
16307c478bd9Sstevel@tonic-gate 	vnode_t	*dvp;
16317c478bd9Sstevel@tonic-gate 	caddr_t pnamep;
16327c478bd9Sstevel@tonic-gate 
16337c478bd9Sstevel@tonic-gate 	struct a {
16347c478bd9Sstevel@tonic-gate 		long	pnamep;		/* char * */
16357c478bd9Sstevel@tonic-gate 		long	fmode;
16367c478bd9Sstevel@tonic-gate 		long	dev;
16377c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
16387c478bd9Sstevel@tonic-gate 
16397c478bd9Sstevel@tonic-gate 	/* no error, then already path token in audit record */
1640794f0adbSRoger A. Faulkner 	if (error != EPERM && error != EINVAL)
16417c478bd9Sstevel@tonic-gate 		return;
16427c478bd9Sstevel@tonic-gate 
1643794f0adbSRoger A. Faulkner 	/* do the lookup to force generation of path token */
1644794f0adbSRoger A. Faulkner 	pnamep = (caddr_t)uap->pnamep;
1645794f0adbSRoger A. Faulkner 	tad->tad_ctrl |= TAD_NOATTRB;
1646794f0adbSRoger A. Faulkner 	error = lookupname(pnamep, UIO_USERSPACE, NO_FOLLOW, &dvp, NULLVPP);
1647794f0adbSRoger A. Faulkner 	if (error == 0)
1648794f0adbSRoger A. Faulkner 		VN_RELE(dvp);
1649794f0adbSRoger A. Faulkner }
1650794f0adbSRoger A. Faulkner 
1651794f0adbSRoger A. Faulkner /*ARGSUSED*/
1652794f0adbSRoger A. Faulkner static void
1653794f0adbSRoger A. Faulkner aus_mknodat(struct t_audit_data *tad)
1654794f0adbSRoger A. Faulkner {
1655794f0adbSRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
1656794f0adbSRoger A. Faulkner 	uint32_t fmode;
1657794f0adbSRoger A. Faulkner 	dev_t dev;
1658794f0adbSRoger A. Faulkner 
1659794f0adbSRoger A. Faulkner 	struct a {
1660794f0adbSRoger A. Faulkner 		long	fd;
1661794f0adbSRoger A. Faulkner 		long	pnamep;		/* char * */
1662794f0adbSRoger A. Faulkner 		long	fmode;
1663794f0adbSRoger A. Faulkner 		long	dev;
1664794f0adbSRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
1665794f0adbSRoger A. Faulkner 
1666794f0adbSRoger A. Faulkner 	fmode = (uint32_t)uap->fmode;
1667794f0adbSRoger A. Faulkner 	dev   = (dev_t)uap->dev;
1668794f0adbSRoger A. Faulkner 
1669794f0adbSRoger A. Faulkner 	au_uwrite(au_to_arg32(2, "mode", fmode));
1670794f0adbSRoger A. Faulkner #ifdef _LP64
1671794f0adbSRoger A. Faulkner 	au_uwrite(au_to_arg64(3, "dev", dev));
1672794f0adbSRoger A. Faulkner #else
1673794f0adbSRoger A. Faulkner 	au_uwrite(au_to_arg32(3, "dev", dev));
1674794f0adbSRoger A. Faulkner #endif
1675794f0adbSRoger A. Faulkner }
1676794f0adbSRoger A. Faulkner 
1677794f0adbSRoger A. Faulkner /*ARGSUSED*/
1678794f0adbSRoger A. Faulkner static void
1679794f0adbSRoger A. Faulkner auf_mknodat(struct t_audit_data *tad, int error, rval_t *rval)
1680794f0adbSRoger A. Faulkner {
1681794f0adbSRoger A. Faulkner 	klwp_t *clwp = ttolwp(curthread);
1682794f0adbSRoger A. Faulkner 	vnode_t	*startvp;
1683794f0adbSRoger A. Faulkner 	vnode_t	*dvp;
1684794f0adbSRoger A. Faulkner 	caddr_t pnamep;
1685794f0adbSRoger A. Faulkner 	int fd;
1686794f0adbSRoger A. Faulkner 
1687794f0adbSRoger A. Faulkner 	struct a {
1688794f0adbSRoger A. Faulkner 		long	fd;
1689794f0adbSRoger A. Faulkner 		long	pnamep;		/* char * */
1690794f0adbSRoger A. Faulkner 		long	fmode;
1691794f0adbSRoger A. Faulkner 		long	dev;
1692794f0adbSRoger A. Faulkner 	} *uap = (struct a *)clwp->lwp_ap;
1693794f0adbSRoger A. Faulkner 
1694794f0adbSRoger A. Faulkner 	/* no error, then already path token in audit record */
1695794f0adbSRoger A. Faulkner 	if (error != EPERM && error != EINVAL)
16967c478bd9Sstevel@tonic-gate 		return;
16977c478bd9Sstevel@tonic-gate 
16987c478bd9Sstevel@tonic-gate 	/* do the lookup to force generation of path token */
1699794f0adbSRoger A. Faulkner 	fd = (int)uap->fd;
17007c478bd9Sstevel@tonic-gate 	pnamep = (caddr_t)uap->pnamep;
1701794f0adbSRoger A. Faulkner 	if (pnamep == NULL ||
1702794f0adbSRoger A. Faulkner 	    fgetstartvp(fd, pnamep, &startvp) != 0)
1703794f0adbSRoger A. Faulkner 		return;
17044a0fa546SMarek Pospisil 	tad->tad_ctrl |= TAD_NOATTRB;
1705794f0adbSRoger A. Faulkner 	error = lookupnameat(pnamep, UIO_USERSPACE, NO_FOLLOW, &dvp, NULLVPP,
1706794f0adbSRoger A. Faulkner 	    startvp);
17077c478bd9Sstevel@tonic-gate 	if (error == 0)
17087c478bd9Sstevel@tonic-gate 		VN_RELE(dvp);
1709794f0adbSRoger A. Faulkner 	if (startvp != NULL)
1710794f0adbSRoger A. Faulkner 		VN_RELE(startvp);
17117c478bd9Sstevel@tonic-gate }
17127c478bd9Sstevel@tonic-gate 
17137c478bd9Sstevel@tonic-gate /*ARGSUSED*/
17147c478bd9Sstevel@tonic-gate static void
17157c478bd9Sstevel@tonic-gate aus_mount(struct t_audit_data *tad)
17167c478bd9Sstevel@tonic-gate {	/* AUS_START */
17177c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
17187c478bd9Sstevel@tonic-gate 	uint32_t flags;
17197c478bd9Sstevel@tonic-gate 	uintptr_t u_fstype, dataptr;
17207c478bd9Sstevel@tonic-gate 	STRUCT_DECL(nfs_args, nfsargs);
17217c478bd9Sstevel@tonic-gate 	size_t len;
17227c478bd9Sstevel@tonic-gate 	char *fstype, *hostname;
17237c478bd9Sstevel@tonic-gate 
17247c478bd9Sstevel@tonic-gate 	struct a {
17257c478bd9Sstevel@tonic-gate 		long	spec;		/* char    * */
17267c478bd9Sstevel@tonic-gate 		long	dir;		/* char    * */
17277c478bd9Sstevel@tonic-gate 		long	flags;
17287c478bd9Sstevel@tonic-gate 		long	fstype;		/* char    * */
17297c478bd9Sstevel@tonic-gate 		long	dataptr;	/* char    * */
17307c478bd9Sstevel@tonic-gate 		long	datalen;
17317c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
17327c478bd9Sstevel@tonic-gate 
17337c478bd9Sstevel@tonic-gate 	u_fstype = (uintptr_t)uap->fstype;
17347c478bd9Sstevel@tonic-gate 	flags    = (uint32_t)uap->flags;
17357c478bd9Sstevel@tonic-gate 	dataptr  = (uintptr_t)uap->dataptr;
17367c478bd9Sstevel@tonic-gate 
17377c478bd9Sstevel@tonic-gate 	fstype = kmem_alloc(MAXNAMELEN, KM_SLEEP);
17387c478bd9Sstevel@tonic-gate 	if (copyinstr((caddr_t)u_fstype, (caddr_t)fstype, MAXNAMELEN, &len))
17397c478bd9Sstevel@tonic-gate 		goto mount_free_fstype;
17407c478bd9Sstevel@tonic-gate 
17417c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "flags", flags));
17427c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_text(fstype));
17437c478bd9Sstevel@tonic-gate 
17447c478bd9Sstevel@tonic-gate 	if (strncmp(fstype, "nfs", 3) == 0) {
17457c478bd9Sstevel@tonic-gate 
17467c478bd9Sstevel@tonic-gate 		STRUCT_INIT(nfsargs, get_udatamodel());
17477c478bd9Sstevel@tonic-gate 		bzero(STRUCT_BUF(nfsargs), STRUCT_SIZE(nfsargs));
17487c478bd9Sstevel@tonic-gate 
17497c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)dataptr,
17507c478bd9Sstevel@tonic-gate 				STRUCT_BUF(nfsargs),
17517c478bd9Sstevel@tonic-gate 				MIN(uap->datalen, STRUCT_SIZE(nfsargs)))) {
17527c478bd9Sstevel@tonic-gate 			/* DEBUG debug_enter((char *)NULL); */
17537c478bd9Sstevel@tonic-gate 			goto mount_free_fstype;
17547c478bd9Sstevel@tonic-gate 		}
17557c478bd9Sstevel@tonic-gate 		hostname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
17567c478bd9Sstevel@tonic-gate 		if (copyinstr(STRUCT_FGETP(nfsargs, hostname),
17577c478bd9Sstevel@tonic-gate 				(caddr_t)hostname,
17587c478bd9Sstevel@tonic-gate 				MAXNAMELEN, &len)) {
17597c478bd9Sstevel@tonic-gate 			goto mount_free_hostname;
17607c478bd9Sstevel@tonic-gate 		}
17617c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_text(hostname));
17627c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "internal flags",
17637c478bd9Sstevel@tonic-gate 			(uint_t)STRUCT_FGET(nfsargs, flags)));
17647c478bd9Sstevel@tonic-gate 
17657c478bd9Sstevel@tonic-gate mount_free_hostname:
17667c478bd9Sstevel@tonic-gate 		kmem_free(hostname, MAXNAMELEN);
17677c478bd9Sstevel@tonic-gate 	}
17687c478bd9Sstevel@tonic-gate 
17697c478bd9Sstevel@tonic-gate mount_free_fstype:
17707c478bd9Sstevel@tonic-gate 	kmem_free(fstype, MAXNAMELEN);
17717c478bd9Sstevel@tonic-gate }	/* AUS_MOUNT */
17727c478bd9Sstevel@tonic-gate 
17737c478bd9Sstevel@tonic-gate static void
17747c478bd9Sstevel@tonic-gate aus_umount_path(caddr_t umount_dir)
17757c478bd9Sstevel@tonic-gate {
17767c478bd9Sstevel@tonic-gate 	char			*dir_path;
17777c478bd9Sstevel@tonic-gate 	struct audit_path	*path;
17787c478bd9Sstevel@tonic-gate 	size_t			path_len, dir_len;
17797c478bd9Sstevel@tonic-gate 
17807c478bd9Sstevel@tonic-gate 	/* length alloc'd for two string pointers */
17817c478bd9Sstevel@tonic-gate 	path_len = sizeof (struct audit_path) + sizeof (char *);
17827c478bd9Sstevel@tonic-gate 	path = kmem_alloc(path_len, KM_SLEEP);
17837c478bd9Sstevel@tonic-gate 	dir_path = kmem_alloc(MAXPATHLEN, KM_SLEEP);
17847c478bd9Sstevel@tonic-gate 
17857c478bd9Sstevel@tonic-gate 	if (copyinstr(umount_dir, (caddr_t)dir_path,
17867c478bd9Sstevel@tonic-gate 	    MAXPATHLEN, &dir_len))
17877c478bd9Sstevel@tonic-gate 		goto umount2_free_dir;
17887c478bd9Sstevel@tonic-gate 
17897c478bd9Sstevel@tonic-gate 	/*
17907c478bd9Sstevel@tonic-gate 	 * the audit_path struct assumes that the buffer pointed to
17917c478bd9Sstevel@tonic-gate 	 * by audp_sect[n] contains string 0 immediatedly followed
17927c478bd9Sstevel@tonic-gate 	 * by string 1.
17937c478bd9Sstevel@tonic-gate 	 */
17947c478bd9Sstevel@tonic-gate 	path->audp_sect[0] = dir_path;
17957c478bd9Sstevel@tonic-gate 	path->audp_sect[1] = dir_path + strlen(dir_path) + 1;
17967c478bd9Sstevel@tonic-gate 	path->audp_size = path_len;
17977c478bd9Sstevel@tonic-gate 	path->audp_ref = 1;		/* not used */
17987c478bd9Sstevel@tonic-gate 	path->audp_cnt = 1;		/* one path string */
17997c478bd9Sstevel@tonic-gate 
18007c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_path(path));
18017c478bd9Sstevel@tonic-gate 
18027c478bd9Sstevel@tonic-gate umount2_free_dir:
18037c478bd9Sstevel@tonic-gate 	kmem_free(dir_path, MAXPATHLEN);
18047c478bd9Sstevel@tonic-gate 	kmem_free(path, path_len);
18057c478bd9Sstevel@tonic-gate }
18067c478bd9Sstevel@tonic-gate 
18077c478bd9Sstevel@tonic-gate /*ARGSUSED*/
18087c478bd9Sstevel@tonic-gate static void
18097c478bd9Sstevel@tonic-gate aus_umount2(struct t_audit_data *tad)
18107c478bd9Sstevel@tonic-gate {
18117c478bd9Sstevel@tonic-gate 	klwp_t			*clwp = ttolwp(curthread);
18127c478bd9Sstevel@tonic-gate 	struct a {
18137c478bd9Sstevel@tonic-gate 		long	dir;		/* char    * */
18147c478bd9Sstevel@tonic-gate 		long	flags;
18157c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
18167c478bd9Sstevel@tonic-gate 
18177c478bd9Sstevel@tonic-gate 	aus_umount_path((caddr_t)uap->dir);
18187c478bd9Sstevel@tonic-gate 
18197c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "flags", (uint32_t)uap->flags));
18207c478bd9Sstevel@tonic-gate }
18217c478bd9Sstevel@tonic-gate 
18227c478bd9Sstevel@tonic-gate static void
18237c478bd9Sstevel@tonic-gate aus_msgsys(struct t_audit_data *tad)
18247c478bd9Sstevel@tonic-gate {
18257c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
18267c478bd9Sstevel@tonic-gate 	uint32_t msgid;
18277c478bd9Sstevel@tonic-gate 
18287c478bd9Sstevel@tonic-gate 	struct b {
18297c478bd9Sstevel@tonic-gate 		long	msgid;
18307c478bd9Sstevel@tonic-gate 		long	cmd;
18317c478bd9Sstevel@tonic-gate 		long	buf;		/* struct msqid_ds * */
18327c478bd9Sstevel@tonic-gate 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
18337c478bd9Sstevel@tonic-gate 
18347c478bd9Sstevel@tonic-gate 	msgid = (uint32_t)uap1->msgid;
18357c478bd9Sstevel@tonic-gate 
18367c478bd9Sstevel@tonic-gate 
18377c478bd9Sstevel@tonic-gate 	switch (tad->tad_event) {
18387c478bd9Sstevel@tonic-gate 	case AUE_MSGGET:		/* msgget */
18397c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "msg key", msgid));
18407c478bd9Sstevel@tonic-gate 		break;
18417c478bd9Sstevel@tonic-gate 	case AUE_MSGCTL:		/* msgctl */
18427c478bd9Sstevel@tonic-gate 	case AUE_MSGCTL_RMID:		/* msgctl */
1843f158b2dfSJan Friedel 	case AUE_MSGCTL_SET:		/* msgctl */
18447c478bd9Sstevel@tonic-gate 	case AUE_MSGCTL_STAT:		/* msgctl */
18457c478bd9Sstevel@tonic-gate 	case AUE_MSGRCV:		/* msgrcv */
18467c478bd9Sstevel@tonic-gate 	case AUE_MSGSND:		/* msgsnd */
18477c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "msg ID", msgid));
18487c478bd9Sstevel@tonic-gate 		break;
18497c478bd9Sstevel@tonic-gate 	}
18507c478bd9Sstevel@tonic-gate }
18517c478bd9Sstevel@tonic-gate 
18527c478bd9Sstevel@tonic-gate /*ARGSUSED*/
18537c478bd9Sstevel@tonic-gate static void
18547c478bd9Sstevel@tonic-gate auf_msgsys(struct t_audit_data *tad, int error, rval_t *rval)
18557c478bd9Sstevel@tonic-gate {
18567c478bd9Sstevel@tonic-gate 	int id;
18577c478bd9Sstevel@tonic-gate 
18587c478bd9Sstevel@tonic-gate 	if (error != 0)
18597c478bd9Sstevel@tonic-gate 		return;
18607c478bd9Sstevel@tonic-gate 	if (tad->tad_event == AUE_MSGGET) {
18617c478bd9Sstevel@tonic-gate 		uint32_t scid;
18627c478bd9Sstevel@tonic-gate 		uint32_t sy_flags;
18637c478bd9Sstevel@tonic-gate 
18647c478bd9Sstevel@tonic-gate 		/* need to determine type of executing binary */
18657c478bd9Sstevel@tonic-gate 		scid = tad->tad_scid;
18667c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32_IMPL
18677c478bd9Sstevel@tonic-gate 		if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE)
18687c478bd9Sstevel@tonic-gate 			sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
18697c478bd9Sstevel@tonic-gate 		else
18707c478bd9Sstevel@tonic-gate 			sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK;
18717c478bd9Sstevel@tonic-gate #else
18727c478bd9Sstevel@tonic-gate 		sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
18737c478bd9Sstevel@tonic-gate #endif
18747c478bd9Sstevel@tonic-gate 		if (sy_flags == SE_32RVAL1)
18757c478bd9Sstevel@tonic-gate 			id = rval->r_val1;
18767c478bd9Sstevel@tonic-gate 		if (sy_flags == (SE_32RVAL2|SE_32RVAL1))
18777c478bd9Sstevel@tonic-gate 			id = rval->r_val1;
18787c478bd9Sstevel@tonic-gate 		if (sy_flags == SE_64RVAL)
18797c478bd9Sstevel@tonic-gate 			id = (int)rval->r_vals;
18807c478bd9Sstevel@tonic-gate 
18817c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_ipc(AT_IPC_MSG, id));
18827c478bd9Sstevel@tonic-gate 	}
18837c478bd9Sstevel@tonic-gate }
18847c478bd9Sstevel@tonic-gate 
18857c478bd9Sstevel@tonic-gate static void
18867c478bd9Sstevel@tonic-gate aus_semsys(struct t_audit_data *tad)
18877c478bd9Sstevel@tonic-gate {
18887c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
18897c478bd9Sstevel@tonic-gate 	uint32_t semid;
18907c478bd9Sstevel@tonic-gate 
18917c478bd9Sstevel@tonic-gate 	struct b {		/* ctrl */
18927c478bd9Sstevel@tonic-gate 		long	semid;
18937c478bd9Sstevel@tonic-gate 		long	semnum;
18947c478bd9Sstevel@tonic-gate 		long	cmd;
18957c478bd9Sstevel@tonic-gate 		long	arg;
18967c478bd9Sstevel@tonic-gate 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
18977c478bd9Sstevel@tonic-gate 
18987c478bd9Sstevel@tonic-gate 	semid = (uint32_t)uap1->semid;
18997c478bd9Sstevel@tonic-gate 
19007c478bd9Sstevel@tonic-gate 	switch (tad->tad_event) {
19017c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_RMID:
19027c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_STAT:
19037c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_GETNCNT:
19047c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_GETPID:
19057c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_GETVAL:
19067c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_GETALL:
19077c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_GETZCNT:
1908f158b2dfSJan Friedel 	case AUE_SEMCTL_SET:
19097c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_SETVAL:
19107c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL_SETALL:
19117c478bd9Sstevel@tonic-gate 	case AUE_SEMCTL:
19127c478bd9Sstevel@tonic-gate 	case AUE_SEMOP:
19137c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "sem ID", semid));
19147c478bd9Sstevel@tonic-gate 		break;
19157c478bd9Sstevel@tonic-gate 	case AUE_SEMGET:
19167c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "sem key", semid));
19177c478bd9Sstevel@tonic-gate 		break;
19187c478bd9Sstevel@tonic-gate 	}
19197c478bd9Sstevel@tonic-gate }
19207c478bd9Sstevel@tonic-gate 
19217c478bd9Sstevel@tonic-gate /*ARGSUSED*/
19227c478bd9Sstevel@tonic-gate static void
19237c478bd9Sstevel@tonic-gate auf_semsys(struct t_audit_data *tad, int error, rval_t *rval)
19247c478bd9Sstevel@tonic-gate {
19257c478bd9Sstevel@tonic-gate 	int id;
19267c478bd9Sstevel@tonic-gate 
19277c478bd9Sstevel@tonic-gate 	if (error != 0)
19287c478bd9Sstevel@tonic-gate 		return;
19297c478bd9Sstevel@tonic-gate 	if (tad->tad_event == AUE_SEMGET) {
19307c478bd9Sstevel@tonic-gate 		uint32_t scid;
19317c478bd9Sstevel@tonic-gate 		uint32_t sy_flags;
19327c478bd9Sstevel@tonic-gate 
19337c478bd9Sstevel@tonic-gate 		/* need to determine type of executing binary */
19347c478bd9Sstevel@tonic-gate 		scid = tad->tad_scid;
19357c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32_IMPL
19367c478bd9Sstevel@tonic-gate 		if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE)
19377c478bd9Sstevel@tonic-gate 			sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
19387c478bd9Sstevel@tonic-gate 		else
19397c478bd9Sstevel@tonic-gate 			sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK;
19407c478bd9Sstevel@tonic-gate #else
19417c478bd9Sstevel@tonic-gate 		sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
19427c478bd9Sstevel@tonic-gate #endif
19437c478bd9Sstevel@tonic-gate 		if (sy_flags == SE_32RVAL1)
19447c478bd9Sstevel@tonic-gate 			id = rval->r_val1;
19457c478bd9Sstevel@tonic-gate 		if (sy_flags == (SE_32RVAL2|SE_32RVAL1))
19467c478bd9Sstevel@tonic-gate 			id = rval->r_val1;
19477c478bd9Sstevel@tonic-gate 		if (sy_flags == SE_64RVAL)
19487c478bd9Sstevel@tonic-gate 			id = (int)rval->r_vals;
19497c478bd9Sstevel@tonic-gate 
19507c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_ipc(AT_IPC_SEM, id));
19517c478bd9Sstevel@tonic-gate 	}
19527c478bd9Sstevel@tonic-gate }
19537c478bd9Sstevel@tonic-gate 
19547c478bd9Sstevel@tonic-gate /*ARGSUSED*/
19557c478bd9Sstevel@tonic-gate static void
19567c478bd9Sstevel@tonic-gate aus_close(struct t_audit_data *tad)
19577c478bd9Sstevel@tonic-gate {
19587c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
19597c478bd9Sstevel@tonic-gate 	uint32_t fd;
19607c478bd9Sstevel@tonic-gate 	struct file *fp;
19617c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
19627c478bd9Sstevel@tonic-gate 	struct vnode *vp;
19637c478bd9Sstevel@tonic-gate 	struct vattr attr;
19649e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
19657c478bd9Sstevel@tonic-gate 
19667c478bd9Sstevel@tonic-gate 	struct a {
19677c478bd9Sstevel@tonic-gate 		long	i;
19687c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
19697c478bd9Sstevel@tonic-gate 
19707c478bd9Sstevel@tonic-gate 	fd = (uint32_t)uap->i;
19717c478bd9Sstevel@tonic-gate 
19727c478bd9Sstevel@tonic-gate 	attr.va_mask = 0;
19737c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "fd", fd));
19747c478bd9Sstevel@tonic-gate 
19757c478bd9Sstevel@tonic-gate 		/*
19767c478bd9Sstevel@tonic-gate 		 * convert file pointer to file descriptor
19777c478bd9Sstevel@tonic-gate 		 *   Note: fd ref count incremented here.
19787c478bd9Sstevel@tonic-gate 		 */
19797c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL)
19807c478bd9Sstevel@tonic-gate 		return;
19817c478bd9Sstevel@tonic-gate 
19827c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
1983d0fa49b7STony Nguyen 	tad->tad_evmod = (au_emod_t)fad->fad_flags;
19847c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
19857c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
19867c478bd9Sstevel@tonic-gate 		if ((vp = fp->f_vnode) != NULL) {
19877c478bd9Sstevel@tonic-gate 			attr.va_mask = AT_ALL;
1988da6c28aaSamw 			if (VOP_GETATTR(vp, &attr, 0, CRED(), NULL) == 0) {
19897c478bd9Sstevel@tonic-gate 				/*
19907c478bd9Sstevel@tonic-gate 				 * When write was not used and the file can be
19917c478bd9Sstevel@tonic-gate 				 * considered public, skip the audit.
19927c478bd9Sstevel@tonic-gate 				 */
19937c478bd9Sstevel@tonic-gate 				if (((fp->f_flag & FWRITE) == 0) &&
19944a0fa546SMarek Pospisil 				    object_is_public(&attr)) {
19957c478bd9Sstevel@tonic-gate 					tad->tad_flag = 0;
19967c478bd9Sstevel@tonic-gate 					tad->tad_evmod = 0;
19977c478bd9Sstevel@tonic-gate 					/* free any residual audit data */
1998005d3febSMarek Pospisil 					au_close(kctx, &(u_ad), 0, 0, 0, NULL);
19997c478bd9Sstevel@tonic-gate 					releasef(fd);
20007c478bd9Sstevel@tonic-gate 					return;
20017c478bd9Sstevel@tonic-gate 				}
200245916cd2Sjpk 				au_uwrite(au_to_attr(&attr));
200345916cd2Sjpk 				audit_sec_attributes(&(u_ad), vp);
20047c478bd9Sstevel@tonic-gate 			}
20057c478bd9Sstevel@tonic-gate 		}
20067c478bd9Sstevel@tonic-gate 	}
20077c478bd9Sstevel@tonic-gate 
20087c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
20097c478bd9Sstevel@tonic-gate 	releasef(fd);
20107c478bd9Sstevel@tonic-gate }
20117c478bd9Sstevel@tonic-gate 
20127c478bd9Sstevel@tonic-gate /*ARGSUSED*/
20137c478bd9Sstevel@tonic-gate static void
20147c478bd9Sstevel@tonic-gate aus_fstatfs(struct t_audit_data *tad)
20157c478bd9Sstevel@tonic-gate {
20167c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
20177c478bd9Sstevel@tonic-gate 	uint32_t fd;
20187c478bd9Sstevel@tonic-gate 	struct file  *fp;
20197c478bd9Sstevel@tonic-gate 	struct vnode *vp;
20207c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
20217c478bd9Sstevel@tonic-gate 
20227c478bd9Sstevel@tonic-gate 	struct a {
20237c478bd9Sstevel@tonic-gate 		long	fd;
20247c478bd9Sstevel@tonic-gate 		long	buf;		/* struct statfs * */
20257c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
20267c478bd9Sstevel@tonic-gate 
20277c478bd9Sstevel@tonic-gate 	fd = (uint_t)uap->fd;
20287c478bd9Sstevel@tonic-gate 
20297c478bd9Sstevel@tonic-gate 		/*
20307c478bd9Sstevel@tonic-gate 		 * convert file pointer to file descriptor
20317c478bd9Sstevel@tonic-gate 		 *   Note: fd ref count incremented here.
20327c478bd9Sstevel@tonic-gate 		 */
20337c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL)
20347c478bd9Sstevel@tonic-gate 		return;
20357c478bd9Sstevel@tonic-gate 
20367c478bd9Sstevel@tonic-gate 		/* get path from file struct here */
20377c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
20387c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
20397c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
20407c478bd9Sstevel@tonic-gate 	} else {
20417c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
20427c478bd9Sstevel@tonic-gate 	}
20437c478bd9Sstevel@tonic-gate 
20447c478bd9Sstevel@tonic-gate 	vp = fp->f_vnode;
20457c478bd9Sstevel@tonic-gate 	audit_attributes(vp);
20467c478bd9Sstevel@tonic-gate 
20477c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
20487c478bd9Sstevel@tonic-gate 	releasef(fd);
20497c478bd9Sstevel@tonic-gate }
20507c478bd9Sstevel@tonic-gate 
20514be8c573SJan Friedel static au_event_t
20524be8c573SJan Friedel aui_setpgrp(au_event_t e)
20534be8c573SJan Friedel {
20544be8c573SJan Friedel 	klwp_t *clwp = ttolwp(curthread);
20554be8c573SJan Friedel 	int flag;
20564be8c573SJan Friedel 
20574be8c573SJan Friedel 	struct a {
20584be8c573SJan Friedel 		long	flag;
20594be8c573SJan Friedel 		long	pid;
20604be8c573SJan Friedel 		long	pgid;
20614be8c573SJan Friedel 	} *uap = (struct a *)clwp->lwp_ap;
20624be8c573SJan Friedel 
20634be8c573SJan Friedel 	flag = (int)uap->flag;
20644be8c573SJan Friedel 
20654be8c573SJan Friedel 
20664be8c573SJan Friedel 	switch (flag) {
20674be8c573SJan Friedel 
20684be8c573SJan Friedel 	case 1:	/* setpgrp() */
20694be8c573SJan Friedel 		e = AUE_SETPGRP;
20704be8c573SJan Friedel 		break;
20714be8c573SJan Friedel 
20724be8c573SJan Friedel 	case 3: /* setsid() */
20734be8c573SJan Friedel 		e = AUE_SETSID;
20744be8c573SJan Friedel 		break;
20754be8c573SJan Friedel 
20764be8c573SJan Friedel 	case 5: /* setpgid() */
20774be8c573SJan Friedel 		e = AUE_SETPGID;
20784be8c573SJan Friedel 		break;
20794be8c573SJan Friedel 
20804be8c573SJan Friedel 	case 0: /* getpgrp()	- not security relevant */
20814be8c573SJan Friedel 	case 2: /* getsid()	- not security relevant */
20824be8c573SJan Friedel 	case 4: /* getpgid() 	- not security relevant */
20834be8c573SJan Friedel 		e = AUE_NULL;
20844be8c573SJan Friedel 		break;
20854be8c573SJan Friedel 
20864be8c573SJan Friedel 	default:
20874be8c573SJan Friedel 		e = AUE_NULL;
20884be8c573SJan Friedel 		break;
20894be8c573SJan Friedel 	}
20904be8c573SJan Friedel 
20914be8c573SJan Friedel 	return (e);
20924be8c573SJan Friedel }
20934be8c573SJan Friedel 
209445a9a7b1SJan Friedel /*ARGSUSED*/
20957c478bd9Sstevel@tonic-gate static void
20967c478bd9Sstevel@tonic-gate aus_setpgrp(struct t_audit_data *tad)
20977c478bd9Sstevel@tonic-gate {
20984be8c573SJan Friedel 	klwp_t		*clwp = ttolwp(curthread);
20994be8c573SJan Friedel 	pid_t		pgid;
21004be8c573SJan Friedel 	struct proc	*p;
21014be8c573SJan Friedel 	uid_t		uid, ruid;
21024be8c573SJan Friedel 	gid_t		gid, rgid;
21034be8c573SJan Friedel 	pid_t		pid;
21044be8c573SJan Friedel 	cred_t		*cr;
21054be8c573SJan Friedel 	int		flag;
21064be8c573SJan Friedel 	const auditinfo_addr_t	*ainfo;
21077c478bd9Sstevel@tonic-gate 
21087c478bd9Sstevel@tonic-gate 	struct a {
21094be8c573SJan Friedel 		long	flag;
21107c478bd9Sstevel@tonic-gate 		long	pid;
21114be8c573SJan Friedel 		long	pgid;
21127c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
21137c478bd9Sstevel@tonic-gate 
21144be8c573SJan Friedel 	flag = (int)uap->flag;
21157c478bd9Sstevel@tonic-gate 	pid  = (pid_t)uap->pid;
21164be8c573SJan Friedel 	pgid = (pid_t)uap->pgid;
21174be8c573SJan Friedel 
21184be8c573SJan Friedel 
21194be8c573SJan Friedel 	switch (flag) {
21204be8c573SJan Friedel 
21214be8c573SJan Friedel 	case 0: /* getpgrp() */
21224be8c573SJan Friedel 	case 1: /* setpgrp() */
21234be8c573SJan Friedel 	case 2: /* getsid() */
21244be8c573SJan Friedel 	case 3: /* setsid() */
21254be8c573SJan Friedel 	case 4: /* getpgid() */
21264be8c573SJan Friedel 		break;
21274be8c573SJan Friedel 
21284be8c573SJan Friedel 	case 5: /* setpgid() */
21297c478bd9Sstevel@tonic-gate 
21307c478bd9Sstevel@tonic-gate 		/* current process? */
21314be8c573SJan Friedel 		if (pid == 0) {
21324be8c573SJan Friedel 			return;
21334be8c573SJan Friedel 		}
21347c478bd9Sstevel@tonic-gate 
21354be8c573SJan Friedel 		mutex_enter(&pidlock);
21364be8c573SJan Friedel 		p = prfind(pid);
21374be8c573SJan Friedel 		if (p == NULL || p->p_as == &kas ||
21384be8c573SJan Friedel 		    p->p_stat == SIDL || p->p_stat == SZOMB) {
21394be8c573SJan Friedel 			mutex_exit(&pidlock);
21404be8c573SJan Friedel 			return;
21414be8c573SJan Friedel 		}
21424be8c573SJan Friedel 		mutex_enter(&p->p_lock);	/* so process doesn't go away */
21437c478bd9Sstevel@tonic-gate 		mutex_exit(&pidlock);
21447c478bd9Sstevel@tonic-gate 
21454be8c573SJan Friedel 		mutex_enter(&p->p_crlock);
21464be8c573SJan Friedel 		crhold(cr = p->p_cred);
21474be8c573SJan Friedel 		mutex_exit(&p->p_crlock);
21484be8c573SJan Friedel 		mutex_exit(&p->p_lock);
21494be8c573SJan Friedel 
21504be8c573SJan Friedel 		ainfo = crgetauinfo(cr);
21514be8c573SJan Friedel 		if (ainfo == NULL) {
21524be8c573SJan Friedel 			crfree(cr);
21534be8c573SJan Friedel 			return;
21544be8c573SJan Friedel 		}
21557c478bd9Sstevel@tonic-gate 
21564be8c573SJan Friedel 		uid  = crgetuid(cr);
21574be8c573SJan Friedel 		gid  = crgetgid(cr);
21584be8c573SJan Friedel 		ruid = crgetruid(cr);
21594be8c573SJan Friedel 		rgid = crgetrgid(cr);
21604be8c573SJan Friedel 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
21614be8c573SJan Friedel 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
21627c478bd9Sstevel@tonic-gate 		crfree(cr);
21634be8c573SJan Friedel 		au_uwrite(au_to_arg32(2, "pgid", pgid));
21644be8c573SJan Friedel 		break;
21657c478bd9Sstevel@tonic-gate 
21664be8c573SJan Friedel 	default:
21674be8c573SJan Friedel 		break;
21684be8c573SJan Friedel 	}
21697c478bd9Sstevel@tonic-gate }
21704be8c573SJan Friedel 
21717c478bd9Sstevel@tonic-gate 
21727c478bd9Sstevel@tonic-gate /*ARGSUSED*/
21737c478bd9Sstevel@tonic-gate static void
21747c478bd9Sstevel@tonic-gate aus_setregid(struct t_audit_data *tad)
21757c478bd9Sstevel@tonic-gate {
21767c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
21777c478bd9Sstevel@tonic-gate 	uint32_t rgid, egid;
21787c478bd9Sstevel@tonic-gate 
21797c478bd9Sstevel@tonic-gate 	struct a {
21807c478bd9Sstevel@tonic-gate 		long	 rgid;
21817c478bd9Sstevel@tonic-gate 		long	 egid;
21827c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
21837c478bd9Sstevel@tonic-gate 
21847c478bd9Sstevel@tonic-gate 	rgid  = (uint32_t)uap->rgid;
21857c478bd9Sstevel@tonic-gate 	egid  = (uint32_t)uap->egid;
21867c478bd9Sstevel@tonic-gate 
21877c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "rgid", rgid));
21887c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "egid", egid));
21897c478bd9Sstevel@tonic-gate }
21907c478bd9Sstevel@tonic-gate 
21917c478bd9Sstevel@tonic-gate /*ARGSUSED*/
21927c478bd9Sstevel@tonic-gate static void
21937c478bd9Sstevel@tonic-gate aus_setgid(struct t_audit_data *tad)
21947c478bd9Sstevel@tonic-gate {
21957c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
21967c478bd9Sstevel@tonic-gate 	uint32_t gid;
21977c478bd9Sstevel@tonic-gate 
21987c478bd9Sstevel@tonic-gate 	struct a {
21997c478bd9Sstevel@tonic-gate 		long	gid;
22007c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
22017c478bd9Sstevel@tonic-gate 
22027c478bd9Sstevel@tonic-gate 	gid = (uint32_t)uap->gid;
22037c478bd9Sstevel@tonic-gate 
22047c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "gid", gid));
22057c478bd9Sstevel@tonic-gate }
22067c478bd9Sstevel@tonic-gate 
22077c478bd9Sstevel@tonic-gate 
22087c478bd9Sstevel@tonic-gate /*ARGSUSED*/
22097c478bd9Sstevel@tonic-gate static void
22107c478bd9Sstevel@tonic-gate aus_setreuid(struct t_audit_data *tad)
22117c478bd9Sstevel@tonic-gate {
22127c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
22137c478bd9Sstevel@tonic-gate 	uint32_t ruid, euid;
22147c478bd9Sstevel@tonic-gate 
22157c478bd9Sstevel@tonic-gate 	struct a {
22167c478bd9Sstevel@tonic-gate 		long	ruid;
22177c478bd9Sstevel@tonic-gate 		long	euid;
22187c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
22197c478bd9Sstevel@tonic-gate 
22207c478bd9Sstevel@tonic-gate 	ruid = (uint32_t)uap->ruid;
22217c478bd9Sstevel@tonic-gate 	euid  = (uint32_t)uap->euid;
22227c478bd9Sstevel@tonic-gate 
22237c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "ruid", ruid));
22247c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "euid", euid));
22257c478bd9Sstevel@tonic-gate }
22267c478bd9Sstevel@tonic-gate 
22277c478bd9Sstevel@tonic-gate 
22287c478bd9Sstevel@tonic-gate /*ARGSUSED*/
22297c478bd9Sstevel@tonic-gate static void
22307c478bd9Sstevel@tonic-gate aus_setuid(struct t_audit_data *tad)
22317c478bd9Sstevel@tonic-gate {
22327c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
22337c478bd9Sstevel@tonic-gate 	uint32_t uid;
22347c478bd9Sstevel@tonic-gate 
22357c478bd9Sstevel@tonic-gate 	struct a {
22367c478bd9Sstevel@tonic-gate 		long	uid;
22377c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
22387c478bd9Sstevel@tonic-gate 
22397c478bd9Sstevel@tonic-gate 	uid = (uint32_t)uap->uid;
22407c478bd9Sstevel@tonic-gate 
22417c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "uid", uid));
22427c478bd9Sstevel@tonic-gate }
22437c478bd9Sstevel@tonic-gate 
22447c478bd9Sstevel@tonic-gate /*ARGSUSED*/
22457c478bd9Sstevel@tonic-gate static void
22467c478bd9Sstevel@tonic-gate aus_shmsys(struct t_audit_data *tad)
22477c478bd9Sstevel@tonic-gate {
22487c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
22497c478bd9Sstevel@tonic-gate 	uint32_t id, cmd;
22507c478bd9Sstevel@tonic-gate 
22517c478bd9Sstevel@tonic-gate 	struct b {
22527c478bd9Sstevel@tonic-gate 		long	id;
22537c478bd9Sstevel@tonic-gate 		long	cmd;
22547c478bd9Sstevel@tonic-gate 		long	buf;		/* struct shmid_ds * */
22557c478bd9Sstevel@tonic-gate 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
22567c478bd9Sstevel@tonic-gate 
22577c478bd9Sstevel@tonic-gate 	id  = (uint32_t)uap1->id;
22587c478bd9Sstevel@tonic-gate 	cmd = (uint32_t)uap1->cmd;
22597c478bd9Sstevel@tonic-gate 
22607c478bd9Sstevel@tonic-gate 	switch (tad->tad_event) {
22617c478bd9Sstevel@tonic-gate 	case AUE_SHMGET:			/* shmget */
22627c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "shm key", id));
22637c478bd9Sstevel@tonic-gate 		break;
22647c478bd9Sstevel@tonic-gate 	case AUE_SHMCTL:			/* shmctl */
22657c478bd9Sstevel@tonic-gate 	case AUE_SHMCTL_RMID:			/* shmctl */
22667c478bd9Sstevel@tonic-gate 	case AUE_SHMCTL_STAT:			/* shmctl */
22677c478bd9Sstevel@tonic-gate 	case AUE_SHMCTL_SET:			/* shmctl */
22687c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "shm ID", id));
22697c478bd9Sstevel@tonic-gate 		break;
22707c478bd9Sstevel@tonic-gate 	case AUE_SHMDT:				/* shmdt */
22717c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "shm adr", id));
22727c478bd9Sstevel@tonic-gate 		break;
22737c478bd9Sstevel@tonic-gate 	case AUE_SHMAT:				/* shmat */
22747c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "shm ID", id));
22757c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(2, "shm adr", cmd));
22767c478bd9Sstevel@tonic-gate 		break;
22777c478bd9Sstevel@tonic-gate 	}
22787c478bd9Sstevel@tonic-gate }
22797c478bd9Sstevel@tonic-gate 
22807c478bd9Sstevel@tonic-gate /*ARGSUSED*/
22817c478bd9Sstevel@tonic-gate static void
22827c478bd9Sstevel@tonic-gate auf_shmsys(struct t_audit_data *tad, int error, rval_t *rval)
22837c478bd9Sstevel@tonic-gate {
22847c478bd9Sstevel@tonic-gate 	int id;
22857c478bd9Sstevel@tonic-gate 
22867c478bd9Sstevel@tonic-gate 	if (error != 0)
22877c478bd9Sstevel@tonic-gate 		return;
22887c478bd9Sstevel@tonic-gate 	if (tad->tad_event == AUE_SHMGET) {
22897c478bd9Sstevel@tonic-gate 		uint32_t scid;
22907c478bd9Sstevel@tonic-gate 		uint32_t sy_flags;
22917c478bd9Sstevel@tonic-gate 
22927c478bd9Sstevel@tonic-gate 		/* need to determine type of executing binary */
22937c478bd9Sstevel@tonic-gate 		scid = tad->tad_scid;
22947c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32_IMPL
22957c478bd9Sstevel@tonic-gate 		if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE)
22967c478bd9Sstevel@tonic-gate 			sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
22977c478bd9Sstevel@tonic-gate 		else
22987c478bd9Sstevel@tonic-gate 			sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK;
22997c478bd9Sstevel@tonic-gate #else
23007c478bd9Sstevel@tonic-gate 		sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
23017c478bd9Sstevel@tonic-gate #endif
23027c478bd9Sstevel@tonic-gate 		if (sy_flags == SE_32RVAL1)
23037c478bd9Sstevel@tonic-gate 			id = rval->r_val1;
23047c478bd9Sstevel@tonic-gate 		if (sy_flags == (SE_32RVAL2|SE_32RVAL1))
23057c478bd9Sstevel@tonic-gate 			id = rval->r_val1;
23067c478bd9Sstevel@tonic-gate 		if (sy_flags == SE_64RVAL)
23077c478bd9Sstevel@tonic-gate 			id = (int)rval->r_vals;
23087c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_ipc(AT_IPC_SHM, id));
23097c478bd9Sstevel@tonic-gate 	}
23107c478bd9Sstevel@tonic-gate }
23117c478bd9Sstevel@tonic-gate 
23127c478bd9Sstevel@tonic-gate 
23137c478bd9Sstevel@tonic-gate /*ARGSUSED*/
23147c478bd9Sstevel@tonic-gate static void
23157c478bd9Sstevel@tonic-gate aus_ioctl(struct t_audit_data *tad)
23167c478bd9Sstevel@tonic-gate {
23177c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
23187c478bd9Sstevel@tonic-gate 	struct file *fp;
23197c478bd9Sstevel@tonic-gate 	struct vnode *vp;
23207c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
23217c478bd9Sstevel@tonic-gate 	uint32_t fd, cmd;
23227c478bd9Sstevel@tonic-gate 	uintptr_t cmarg;
23237c478bd9Sstevel@tonic-gate 
23247c478bd9Sstevel@tonic-gate 	/* XX64 */
23257c478bd9Sstevel@tonic-gate 	struct a {
23267c478bd9Sstevel@tonic-gate 		long	fd;
23277c478bd9Sstevel@tonic-gate 		long	cmd;
23287c478bd9Sstevel@tonic-gate 		long	cmarg;		/* caddr_t */
23297c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
23307c478bd9Sstevel@tonic-gate 
23317c478bd9Sstevel@tonic-gate 	fd    = (uint32_t)uap->fd;
23327c478bd9Sstevel@tonic-gate 	cmd   = (uint32_t)uap->cmd;
23337c478bd9Sstevel@tonic-gate 	cmarg = (uintptr_t)uap->cmarg;
23347c478bd9Sstevel@tonic-gate 
23357c478bd9Sstevel@tonic-gate 		/*
23367c478bd9Sstevel@tonic-gate 		 * convert file pointer to file descriptor
23377c478bd9Sstevel@tonic-gate 		 *   Note: fd ref count incremented here.
23387c478bd9Sstevel@tonic-gate 		 */
23397c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL) {
23407c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "fd", fd));
23417c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(2, "cmd", cmd));
23427c478bd9Sstevel@tonic-gate #ifndef _LP64
23437c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(3, "arg", (uint32_t)cmarg));
23447c478bd9Sstevel@tonic-gate #else
23457c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg64(3, "arg", (uint64_t)cmarg));
23467c478bd9Sstevel@tonic-gate #endif
23477c478bd9Sstevel@tonic-gate 		return;
23487c478bd9Sstevel@tonic-gate 	}
23497c478bd9Sstevel@tonic-gate 
23507c478bd9Sstevel@tonic-gate 	/* get path from file struct here */
23517c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
23527c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
23537c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
23547c478bd9Sstevel@tonic-gate 	} else {
23557c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
23567c478bd9Sstevel@tonic-gate 	}
23577c478bd9Sstevel@tonic-gate 
23587c478bd9Sstevel@tonic-gate 	vp = fp->f_vnode;
23597c478bd9Sstevel@tonic-gate 	audit_attributes(vp);
23607c478bd9Sstevel@tonic-gate 
23617c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
23627c478bd9Sstevel@tonic-gate 	releasef(fd);
23637c478bd9Sstevel@tonic-gate 
23647c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "cmd", cmd));
23657c478bd9Sstevel@tonic-gate #ifndef _LP64
23667c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "arg", (uint32_t)cmarg));
23677c478bd9Sstevel@tonic-gate #else
23687c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg64(3, "arg", (uint64_t)cmarg));
23697c478bd9Sstevel@tonic-gate #endif
23707c478bd9Sstevel@tonic-gate }
23717c478bd9Sstevel@tonic-gate 
23727c478bd9Sstevel@tonic-gate /*
23737c478bd9Sstevel@tonic-gate  * null function for memcntl for now. We might want to limit memcntl()
23747c478bd9Sstevel@tonic-gate  * auditing to commands: MC_LOCKAS, MC_LOCK, MC_UNLOCKAS, MC_UNLOCK which
23757c478bd9Sstevel@tonic-gate  * require privileges.
23767c478bd9Sstevel@tonic-gate  */
23777c478bd9Sstevel@tonic-gate static au_event_t
23787c478bd9Sstevel@tonic-gate aui_memcntl(au_event_t e)
23797c478bd9Sstevel@tonic-gate {
23807c478bd9Sstevel@tonic-gate 	return (e);
23817c478bd9Sstevel@tonic-gate }
23827c478bd9Sstevel@tonic-gate 
23837c478bd9Sstevel@tonic-gate /*ARGSUSED*/
23847c478bd9Sstevel@tonic-gate static au_event_t
23857c478bd9Sstevel@tonic-gate aui_privsys(au_event_t e)
23867c478bd9Sstevel@tonic-gate {
23877c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
23887c478bd9Sstevel@tonic-gate 
23897c478bd9Sstevel@tonic-gate 	struct a {
23907c478bd9Sstevel@tonic-gate 		long	opcode;
23917c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
23927c478bd9Sstevel@tonic-gate 
23937c478bd9Sstevel@tonic-gate 	switch (uap->opcode) {
23947c478bd9Sstevel@tonic-gate 	case PRIVSYS_SETPPRIV:
23957c478bd9Sstevel@tonic-gate 		return (AUE_SETPPRIV);
23967c478bd9Sstevel@tonic-gate 	default:
23977c478bd9Sstevel@tonic-gate 		return (AUE_NULL);
23987c478bd9Sstevel@tonic-gate 	}
23997c478bd9Sstevel@tonic-gate }
24007c478bd9Sstevel@tonic-gate 
24017c478bd9Sstevel@tonic-gate /*ARGSUSED*/
24027c478bd9Sstevel@tonic-gate static void
24037c478bd9Sstevel@tonic-gate aus_memcntl(struct t_audit_data *tad)
24047c478bd9Sstevel@tonic-gate {
24057c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
24067c478bd9Sstevel@tonic-gate 
24077c478bd9Sstevel@tonic-gate 	struct a {
24087c478bd9Sstevel@tonic-gate 		long	addr;
24097c478bd9Sstevel@tonic-gate 		long	len;
24107c478bd9Sstevel@tonic-gate 		long	cmd;
24117c478bd9Sstevel@tonic-gate 		long	arg;
24127c478bd9Sstevel@tonic-gate 		long	attr;
24137c478bd9Sstevel@tonic-gate 		long	mask;
24147c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
24157c478bd9Sstevel@tonic-gate 
24167c478bd9Sstevel@tonic-gate #ifdef _LP64
24177c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg64(1, "base", (uint64_t)uap->addr));
24187c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len));
24197c478bd9Sstevel@tonic-gate #else
24207c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "base", (uint32_t)uap->addr));
24217c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len));
24227c478bd9Sstevel@tonic-gate #endif
24237c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "cmd", (uint_t)uap->cmd));
24247c478bd9Sstevel@tonic-gate #ifdef _LP64
24257c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg64(4, "arg", (uint64_t)uap->arg));
24267c478bd9Sstevel@tonic-gate #else
24277c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(4, "arg", (uint32_t)uap->arg));
24287c478bd9Sstevel@tonic-gate #endif
24297c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(5, "attr", (uint_t)uap->attr));
24307c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(6, "mask", (uint_t)uap->mask));
24317c478bd9Sstevel@tonic-gate }
24327c478bd9Sstevel@tonic-gate 
24337c478bd9Sstevel@tonic-gate /*ARGSUSED*/
24347c478bd9Sstevel@tonic-gate static void
24357c478bd9Sstevel@tonic-gate aus_mmap(struct t_audit_data *tad)
24367c478bd9Sstevel@tonic-gate {
24377c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
24387c478bd9Sstevel@tonic-gate 	struct file *fp;
24397c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
24407c478bd9Sstevel@tonic-gate 	struct vnode *vp;
24417c478bd9Sstevel@tonic-gate 	uint32_t fd;
24427c478bd9Sstevel@tonic-gate 
24437c478bd9Sstevel@tonic-gate 	struct a {
24447c478bd9Sstevel@tonic-gate 		long	addr;
24457c478bd9Sstevel@tonic-gate 		long	len;
24467c478bd9Sstevel@tonic-gate 		long	prot;
24477c478bd9Sstevel@tonic-gate 		long	flags;
24487c478bd9Sstevel@tonic-gate 		long	fd;
24497c478bd9Sstevel@tonic-gate 		long	pos;
24507c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
24517c478bd9Sstevel@tonic-gate 
24527c478bd9Sstevel@tonic-gate 	fd = (uint32_t)uap->fd;
24537c478bd9Sstevel@tonic-gate 
24547c478bd9Sstevel@tonic-gate #ifdef _LP64
24557c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg64(1, "addr", (uint64_t)uap->addr));
24567c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len));
24577c478bd9Sstevel@tonic-gate #else
24587c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "addr", (uint32_t)uap->addr));
24597c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len));
24607c478bd9Sstevel@tonic-gate #endif
24617c478bd9Sstevel@tonic-gate 
24627c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL) {
24637c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(5, "fd", (uint32_t)uap->fd));
24647c478bd9Sstevel@tonic-gate 		return;
24657c478bd9Sstevel@tonic-gate 	}
24667c478bd9Sstevel@tonic-gate 
24677c478bd9Sstevel@tonic-gate 	/*
24687c478bd9Sstevel@tonic-gate 	 * Mark in the tad if write access is NOT requested... if
24697c478bd9Sstevel@tonic-gate 	 * this is later detected (in audit_attributes) to be a
24707c478bd9Sstevel@tonic-gate 	 * public object, the mmap event may be discarded.
24717c478bd9Sstevel@tonic-gate 	 */
24727c478bd9Sstevel@tonic-gate 	if (((uap->prot) & PROT_WRITE) == 0) {
24734a0fa546SMarek Pospisil 		tad->tad_ctrl |= TAD_PUBLIC_EV;
24747c478bd9Sstevel@tonic-gate 	}
24757c478bd9Sstevel@tonic-gate 
24767c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
24777c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
24787c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
24797c478bd9Sstevel@tonic-gate 	} else {
24807c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
24817c478bd9Sstevel@tonic-gate 	}
24827c478bd9Sstevel@tonic-gate 
24837c478bd9Sstevel@tonic-gate 	vp = (struct vnode *)fp->f_vnode;
24847c478bd9Sstevel@tonic-gate 	audit_attributes(vp);
24857c478bd9Sstevel@tonic-gate 
24867c478bd9Sstevel@tonic-gate 	/* mark READ/WRITE since we can't predict access */
24877c478bd9Sstevel@tonic-gate 	if (uap->prot & PROT_READ)
24887c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_READ;
24897c478bd9Sstevel@tonic-gate 	if (uap->prot & PROT_WRITE)
24907c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_WRITE;
24917c478bd9Sstevel@tonic-gate 
24927c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
24937c478bd9Sstevel@tonic-gate 	releasef(fd);
24947c478bd9Sstevel@tonic-gate 
24957c478bd9Sstevel@tonic-gate }	/* AUS_MMAP */
24967c478bd9Sstevel@tonic-gate 
24977c478bd9Sstevel@tonic-gate 
24987c478bd9Sstevel@tonic-gate 
24997c478bd9Sstevel@tonic-gate 
25007c478bd9Sstevel@tonic-gate /*ARGSUSED*/
25017c478bd9Sstevel@tonic-gate static void
25027c478bd9Sstevel@tonic-gate aus_munmap(struct t_audit_data *tad)
25037c478bd9Sstevel@tonic-gate {
25047c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
25057c478bd9Sstevel@tonic-gate 
25067c478bd9Sstevel@tonic-gate 	struct a {
25077c478bd9Sstevel@tonic-gate 		long	addr;
25087c478bd9Sstevel@tonic-gate 		long	len;
25097c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
25107c478bd9Sstevel@tonic-gate 
25117c478bd9Sstevel@tonic-gate #ifdef _LP64
25127c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg64(1, "addr", (uint64_t)uap->addr));
25137c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len));
25147c478bd9Sstevel@tonic-gate #else
25157c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "addr", (uint32_t)uap->addr));
25167c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len));
25177c478bd9Sstevel@tonic-gate #endif
25187c478bd9Sstevel@tonic-gate 
25197c478bd9Sstevel@tonic-gate }	/* AUS_MUNMAP */
25207c478bd9Sstevel@tonic-gate 
25217c478bd9Sstevel@tonic-gate 
25227c478bd9Sstevel@tonic-gate 
25237c478bd9Sstevel@tonic-gate 
25247c478bd9Sstevel@tonic-gate 
25257c478bd9Sstevel@tonic-gate 
25267c478bd9Sstevel@tonic-gate 
25277c478bd9Sstevel@tonic-gate /*ARGSUSED*/
25287c478bd9Sstevel@tonic-gate static void
25297c478bd9Sstevel@tonic-gate aus_priocntlsys(struct t_audit_data *tad)
25307c478bd9Sstevel@tonic-gate {
25317c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
25327c478bd9Sstevel@tonic-gate 
25337c478bd9Sstevel@tonic-gate 	struct a {
25347c478bd9Sstevel@tonic-gate 		long	pc_version;
25357c478bd9Sstevel@tonic-gate 		long	psp;		/* procset_t */
25367c478bd9Sstevel@tonic-gate 		long	cmd;
25377c478bd9Sstevel@tonic-gate 		long	arg;
25387c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
25397c478bd9Sstevel@tonic-gate 
25407c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "pc_version", (uint32_t)uap->pc_version));
25417c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "cmd", (uint32_t)uap->cmd));
25427c478bd9Sstevel@tonic-gate 
25437c478bd9Sstevel@tonic-gate }	/* AUS_PRIOCNTLSYS */
25447c478bd9Sstevel@tonic-gate 
25457c478bd9Sstevel@tonic-gate 
25467c478bd9Sstevel@tonic-gate /*ARGSUSED*/
25477c478bd9Sstevel@tonic-gate static void
25487c478bd9Sstevel@tonic-gate aus_setegid(struct t_audit_data *tad)
25497c478bd9Sstevel@tonic-gate {
25507c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
25517c478bd9Sstevel@tonic-gate 	uint32_t gid;
25527c478bd9Sstevel@tonic-gate 
25537c478bd9Sstevel@tonic-gate 	struct a {
25547c478bd9Sstevel@tonic-gate 		long	gid;
25557c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
25567c478bd9Sstevel@tonic-gate 
25577c478bd9Sstevel@tonic-gate 	gid = (uint32_t)uap->gid;
25587c478bd9Sstevel@tonic-gate 
25597c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "gid", gid));
25607c478bd9Sstevel@tonic-gate }	/* AUS_SETEGID */
25617c478bd9Sstevel@tonic-gate 
25627c478bd9Sstevel@tonic-gate 
25637c478bd9Sstevel@tonic-gate 
25647c478bd9Sstevel@tonic-gate 
25657c478bd9Sstevel@tonic-gate /*ARGSUSED*/
25667c478bd9Sstevel@tonic-gate static void
25677c478bd9Sstevel@tonic-gate aus_setgroups(struct t_audit_data *tad)
25687c478bd9Sstevel@tonic-gate {
25697c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
25707c478bd9Sstevel@tonic-gate 	int i;
25717c478bd9Sstevel@tonic-gate 	int gidsetsize;
25727c478bd9Sstevel@tonic-gate 	uintptr_t gidset;
25737c478bd9Sstevel@tonic-gate 	gid_t *gidlist;
25747c478bd9Sstevel@tonic-gate 
25757c478bd9Sstevel@tonic-gate 	struct a {
25767c478bd9Sstevel@tonic-gate 		long	gidsetsize;
25777c478bd9Sstevel@tonic-gate 		long	gidset;
25787c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
25797c478bd9Sstevel@tonic-gate 
25807c478bd9Sstevel@tonic-gate 	gidsetsize = (uint_t)uap->gidsetsize;
25817c478bd9Sstevel@tonic-gate 	gidset = (uintptr_t)uap->gidset;
25827c478bd9Sstevel@tonic-gate 
25837c478bd9Sstevel@tonic-gate 	if ((gidsetsize > NGROUPS_MAX_DEFAULT) || (gidsetsize < 0))
25847c478bd9Sstevel@tonic-gate 		return;
25857c478bd9Sstevel@tonic-gate 	if (gidsetsize != 0) {
25867c478bd9Sstevel@tonic-gate 		gidlist = kmem_alloc(gidsetsize * sizeof (gid_t),
2587745b2690Stz 		    KM_SLEEP);
25887c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)gidset, gidlist,
2589745b2690Stz 		    gidsetsize * sizeof (gid_t)) == 0)
25907c478bd9Sstevel@tonic-gate 			for (i = 0; i < gidsetsize; i++)
25917c478bd9Sstevel@tonic-gate 				au_uwrite(au_to_arg32(1, "setgroups",
2592745b2690Stz 				    (uint32_t)gidlist[i]));
25937c478bd9Sstevel@tonic-gate 		kmem_free(gidlist, gidsetsize * sizeof (gid_t));
25947c478bd9Sstevel@tonic-gate 	} else
25957c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "setgroups", (uint32_t)0));
25967c478bd9Sstevel@tonic-gate 
25977c478bd9Sstevel@tonic-gate }	/* AUS_SETGROUPS */
25987c478bd9Sstevel@tonic-gate 
25997c478bd9Sstevel@tonic-gate 
26007c478bd9Sstevel@tonic-gate 
26017c478bd9Sstevel@tonic-gate 
26027c478bd9Sstevel@tonic-gate 
26037c478bd9Sstevel@tonic-gate /*ARGSUSED*/
26047c478bd9Sstevel@tonic-gate static void
26057c478bd9Sstevel@tonic-gate aus_seteuid(struct t_audit_data *tad)
26067c478bd9Sstevel@tonic-gate {
26077c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
26087c478bd9Sstevel@tonic-gate 	uint32_t uid;
26097c478bd9Sstevel@tonic-gate 
26107c478bd9Sstevel@tonic-gate 	struct a {
26117c478bd9Sstevel@tonic-gate 		long	uid;
26127c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
26137c478bd9Sstevel@tonic-gate 
26147c478bd9Sstevel@tonic-gate 	uid = (uint32_t)uap->uid;
26157c478bd9Sstevel@tonic-gate 
26167c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "euid", uid));
26177c478bd9Sstevel@tonic-gate 
26187c478bd9Sstevel@tonic-gate }	/* AUS_SETEUID */
26197c478bd9Sstevel@tonic-gate 
26207c478bd9Sstevel@tonic-gate /*ARGSUSED*/
26217c478bd9Sstevel@tonic-gate static void
26227c478bd9Sstevel@tonic-gate aus_putmsg(struct t_audit_data *tad)
26237c478bd9Sstevel@tonic-gate {
26247c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
26257c478bd9Sstevel@tonic-gate 	uint32_t fd, pri;
26267c478bd9Sstevel@tonic-gate 	struct file *fp;
26277c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
26287c478bd9Sstevel@tonic-gate 
26297c478bd9Sstevel@tonic-gate 	struct a {
26307c478bd9Sstevel@tonic-gate 		long	fdes;
26317c478bd9Sstevel@tonic-gate 		long	ctl;		/* struct strbuf * */
26327c478bd9Sstevel@tonic-gate 		long	data;		/* struct strbuf * */
26337c478bd9Sstevel@tonic-gate 		long	pri;
26347c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
26357c478bd9Sstevel@tonic-gate 
26367c478bd9Sstevel@tonic-gate 	fd  = (uint32_t)uap->fdes;
26377c478bd9Sstevel@tonic-gate 	pri = (uint32_t)uap->pri;
26387c478bd9Sstevel@tonic-gate 
26397c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "fd", fd));
26407c478bd9Sstevel@tonic-gate 
26417c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) != NULL) {
26427c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
26437c478bd9Sstevel@tonic-gate 
26447c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_WRITE;
26457c478bd9Sstevel@tonic-gate 
26467c478bd9Sstevel@tonic-gate 		/* add path name to audit record */
26477c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
26487c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
26497c478bd9Sstevel@tonic-gate 		}
26507c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
26517c478bd9Sstevel@tonic-gate 
26527c478bd9Sstevel@tonic-gate 		releasef(fd);
26537c478bd9Sstevel@tonic-gate 	}
26547c478bd9Sstevel@tonic-gate 
26557c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(4, "pri", pri));
26567c478bd9Sstevel@tonic-gate }
26577c478bd9Sstevel@tonic-gate 
26587c478bd9Sstevel@tonic-gate /*ARGSUSED*/
26597c478bd9Sstevel@tonic-gate static void
26607c478bd9Sstevel@tonic-gate aus_putpmsg(struct t_audit_data *tad)
26617c478bd9Sstevel@tonic-gate {
26627c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
26637c478bd9Sstevel@tonic-gate 	uint32_t fd, pri, flags;
26647c478bd9Sstevel@tonic-gate 	struct file *fp;
26657c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
26667c478bd9Sstevel@tonic-gate 
26677c478bd9Sstevel@tonic-gate 	struct a {
26687c478bd9Sstevel@tonic-gate 		long	fdes;
26697c478bd9Sstevel@tonic-gate 		long	ctl;		/* struct strbuf * */
26707c478bd9Sstevel@tonic-gate 		long	data;		/* struct strbuf * */
26717c478bd9Sstevel@tonic-gate 		long	pri;
26727c478bd9Sstevel@tonic-gate 		long	flags;
26737c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
26747c478bd9Sstevel@tonic-gate 
26757c478bd9Sstevel@tonic-gate 	fd = (uint32_t)uap->fdes;
26767c478bd9Sstevel@tonic-gate 	pri  = (uint32_t)uap->pri;
26777c478bd9Sstevel@tonic-gate 	flags  = (uint32_t)uap->flags;
26787c478bd9Sstevel@tonic-gate 
26797c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "fd", fd));
26807c478bd9Sstevel@tonic-gate 
26817c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) != NULL) {
26827c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
26837c478bd9Sstevel@tonic-gate 
26847c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_WRITE;
26857c478bd9Sstevel@tonic-gate 
26867c478bd9Sstevel@tonic-gate 		/* add path name to audit record */
26877c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
26887c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
26897c478bd9Sstevel@tonic-gate 		}
26907c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
26917c478bd9Sstevel@tonic-gate 
26927c478bd9Sstevel@tonic-gate 		releasef(fd);
26937c478bd9Sstevel@tonic-gate 	}
26947c478bd9Sstevel@tonic-gate 
26957c478bd9Sstevel@tonic-gate 
26967c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(4, "pri", pri));
26977c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(5, "flags", flags));
26987c478bd9Sstevel@tonic-gate }
26997c478bd9Sstevel@tonic-gate 
27007c478bd9Sstevel@tonic-gate /*ARGSUSED*/
27017c478bd9Sstevel@tonic-gate static void
27027c478bd9Sstevel@tonic-gate aus_getmsg(struct t_audit_data *tad)
27037c478bd9Sstevel@tonic-gate {
27047c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
27057c478bd9Sstevel@tonic-gate 	uint32_t fd, pri;
27067c478bd9Sstevel@tonic-gate 	struct file *fp;
27077c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
27087c478bd9Sstevel@tonic-gate 
27097c478bd9Sstevel@tonic-gate 	struct a {
27107c478bd9Sstevel@tonic-gate 		long	fdes;
27117c478bd9Sstevel@tonic-gate 		long	ctl;		/* struct strbuf * */
27127c478bd9Sstevel@tonic-gate 		long	data;		/* struct strbuf * */
27137c478bd9Sstevel@tonic-gate 		long	pri;
27147c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
27157c478bd9Sstevel@tonic-gate 
27167c478bd9Sstevel@tonic-gate 	fd  = (uint32_t)uap->fdes;
27177c478bd9Sstevel@tonic-gate 	pri = (uint32_t)uap->pri;
27187c478bd9Sstevel@tonic-gate 
27197c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "fd", fd));
27207c478bd9Sstevel@tonic-gate 
27217c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) != NULL) {
27227c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
27237c478bd9Sstevel@tonic-gate 
27247c478bd9Sstevel@tonic-gate 		/*
27257c478bd9Sstevel@tonic-gate 		 * read operation on this object
27267c478bd9Sstevel@tonic-gate 		 */
27277c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_READ;
27287c478bd9Sstevel@tonic-gate 
27297c478bd9Sstevel@tonic-gate 		/* add path name to audit record */
27307c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
27317c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
27327c478bd9Sstevel@tonic-gate 		}
27337c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
27347c478bd9Sstevel@tonic-gate 
27357c478bd9Sstevel@tonic-gate 		releasef(fd);
27367c478bd9Sstevel@tonic-gate 	}
27377c478bd9Sstevel@tonic-gate 
27387c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(4, "pri", pri));
27397c478bd9Sstevel@tonic-gate }
27407c478bd9Sstevel@tonic-gate 
27417c478bd9Sstevel@tonic-gate /*ARGSUSED*/
27427c478bd9Sstevel@tonic-gate static void
27437c478bd9Sstevel@tonic-gate aus_getpmsg(struct t_audit_data *tad)
27447c478bd9Sstevel@tonic-gate {
27457c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
27467c478bd9Sstevel@tonic-gate 	uint32_t fd;
27477c478bd9Sstevel@tonic-gate 	struct file *fp;
27487c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
27497c478bd9Sstevel@tonic-gate 
27507c478bd9Sstevel@tonic-gate 	struct a {
27517c478bd9Sstevel@tonic-gate 		long	fdes;
27527c478bd9Sstevel@tonic-gate 		long	ctl;		/* struct strbuf * */
27537c478bd9Sstevel@tonic-gate 		long	data;		/* struct strbuf * */
27547c478bd9Sstevel@tonic-gate 		long	pri;
27557c478bd9Sstevel@tonic-gate 		long	flags;
27567c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
27577c478bd9Sstevel@tonic-gate 
27587c478bd9Sstevel@tonic-gate 	fd = (uint32_t)uap->fdes;
27597c478bd9Sstevel@tonic-gate 
27607c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "fd", fd));
27617c478bd9Sstevel@tonic-gate 
27627c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) != NULL) {
27637c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
27647c478bd9Sstevel@tonic-gate 
27657c478bd9Sstevel@tonic-gate 		/*
27667c478bd9Sstevel@tonic-gate 		 * read operation on this object
27677c478bd9Sstevel@tonic-gate 		 */
27687c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_READ;
27697c478bd9Sstevel@tonic-gate 
27707c478bd9Sstevel@tonic-gate 		/* add path name to audit record */
27717c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
27727c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
27737c478bd9Sstevel@tonic-gate 		}
27747c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
27757c478bd9Sstevel@tonic-gate 
27767c478bd9Sstevel@tonic-gate 		releasef(fd);
27777c478bd9Sstevel@tonic-gate 	}
27787c478bd9Sstevel@tonic-gate }
27797c478bd9Sstevel@tonic-gate 
278061b9bf51Srica static au_event_t
278161b9bf51Srica aui_labelsys(au_event_t e)
278261b9bf51Srica {
278361b9bf51Srica 	klwp_t *clwp = ttolwp(curthread);
278461b9bf51Srica 	uint32_t code;
278561b9bf51Srica 	uint32_t cmd;
278661b9bf51Srica 
278761b9bf51Srica 	struct a {
278861b9bf51Srica 		long	code;
278961b9bf51Srica 		long	cmd;
279061b9bf51Srica 	} *uap = (struct a *)clwp->lwp_ap;
279161b9bf51Srica 
279261b9bf51Srica 	code = (uint32_t)uap->code;
279361b9bf51Srica 	cmd = (uint32_t)uap->cmd;
279461b9bf51Srica 
279561b9bf51Srica 	/* not security relevant if not changing kernel cache */
279661b9bf51Srica 	if (cmd == TNDB_GET)
2797d3e710c8SRic Aleshire 		return (AUE_NULL);
279861b9bf51Srica 
279961b9bf51Srica 	switch (code) {
280061b9bf51Srica 	case TSOL_TNRH:
280161b9bf51Srica 		e = AUE_LABELSYS_TNRH;
280261b9bf51Srica 		break;
280361b9bf51Srica 	case TSOL_TNRHTP:
280461b9bf51Srica 		e = AUE_LABELSYS_TNRHTP;
280561b9bf51Srica 		break;
280661b9bf51Srica 	case TSOL_TNMLP:
280761b9bf51Srica 		e = AUE_LABELSYS_TNMLP;
280861b9bf51Srica 		break;
280961b9bf51Srica 	default:
281061b9bf51Srica 		e = AUE_NULL;
281161b9bf51Srica 		break;
281261b9bf51Srica 	}
281361b9bf51Srica 
281461b9bf51Srica 	return (e);
281561b9bf51Srica 
281661b9bf51Srica }
281761b9bf51Srica 
281861b9bf51Srica static void
281961b9bf51Srica aus_labelsys(struct t_audit_data *tad)
282061b9bf51Srica {
282161b9bf51Srica 	klwp_t *clwp = ttolwp(curthread);
282261b9bf51Srica 	uint32_t cmd;
282361b9bf51Srica 	uintptr_t a2;
282461b9bf51Srica 
282561b9bf51Srica 	struct a {
282661b9bf51Srica 		long	code;
282761b9bf51Srica 		long	cmd;
282861b9bf51Srica 		long	a2;
282961b9bf51Srica 	} *uap = (struct a *)clwp->lwp_ap;
283061b9bf51Srica 
283161b9bf51Srica 	cmd = (uint32_t)uap->cmd;
283261b9bf51Srica 	a2 = (uintptr_t)uap->a2;
283361b9bf51Srica 
283461b9bf51Srica 	switch (tad->tad_event) {
283561b9bf51Srica 	case AUE_LABELSYS_TNRH:
283661b9bf51Srica 	{
283761b9bf51Srica 		tsol_rhent_t	*rhent;
283861b9bf51Srica 		tnaddr_t	*rh_addr;
283961b9bf51Srica 
284061b9bf51Srica 		au_uwrite(au_to_arg32(1, "cmd", cmd));
284161b9bf51Srica 
284261b9bf51Srica 		/* Remaining args don't apply for FLUSH, so skip */
284361b9bf51Srica 		if (cmd == TNDB_FLUSH)
284461b9bf51Srica 			break;
284561b9bf51Srica 
284661b9bf51Srica 		rhent = kmem_alloc(sizeof (tsol_rhent_t), KM_SLEEP);
284761b9bf51Srica 		if (copyin((caddr_t)a2, rhent, sizeof (tsol_rhent_t))) {
284861b9bf51Srica 			kmem_free(rhent, sizeof (tsol_rhent_t));
284961b9bf51Srica 			return;
285061b9bf51Srica 		}
285161b9bf51Srica 
285261b9bf51Srica 		rh_addr = &rhent->rh_address;
285361b9bf51Srica 		if (rh_addr->ta_family == AF_INET) {
285461b9bf51Srica 			struct in_addr	*ipaddr;
285561b9bf51Srica 
285661b9bf51Srica 			ipaddr = &(rh_addr->ta_addr_v4);
285761b9bf51Srica 			au_uwrite(au_to_in_addr(ipaddr));
285861b9bf51Srica 		} else if (rh_addr->ta_family == AF_INET6) {
285961b9bf51Srica 			int32_t		*ipaddr;
286061b9bf51Srica 
286161b9bf51Srica 			ipaddr = (int32_t *)&(rh_addr->ta_addr_v6);
286261b9bf51Srica 			au_uwrite(au_to_in_addr_ex(ipaddr));
286361b9bf51Srica 		}
286461b9bf51Srica 		au_uwrite(au_to_arg32(2, "prefix len", rhent->rh_prefix));
286561b9bf51Srica 
286661b9bf51Srica 		kmem_free(rhent, sizeof (tsol_rhent_t));
286761b9bf51Srica 
286861b9bf51Srica 		break;
286961b9bf51Srica 	}
287061b9bf51Srica 	case AUE_LABELSYS_TNRHTP:
287161b9bf51Srica 	{
287261b9bf51Srica 		tsol_tpent_t	*tpent;
287361b9bf51Srica 
287461b9bf51Srica 		au_uwrite(au_to_arg32(1, "cmd", cmd));
287561b9bf51Srica 
287661b9bf51Srica 		/* Remaining args don't apply for FLUSH, so skip */
287761b9bf51Srica 		if (cmd == TNDB_FLUSH)
287861b9bf51Srica 			break;
287961b9bf51Srica 
288061b9bf51Srica 		tpent = kmem_alloc(sizeof (tsol_tpent_t), KM_SLEEP);
288161b9bf51Srica 		if (copyin((caddr_t)a2, tpent, sizeof (tsol_tpent_t))) {
288261b9bf51Srica 			kmem_free(tpent, sizeof (tsol_tpent_t));
288361b9bf51Srica 			return;
288461b9bf51Srica 		}
288561b9bf51Srica 
2886d3e710c8SRic Aleshire 		/* Make sure that the template name is null-terminated. */
2887d3e710c8SRic Aleshire 		*(tpent->name + TNTNAMSIZ - 1) = '\0';
2888d3e710c8SRic Aleshire 
288961b9bf51Srica 		au_uwrite(au_to_text(tpent->name));
289061b9bf51Srica 		kmem_free(tpent, sizeof (tsol_tpent_t));
289161b9bf51Srica 
289261b9bf51Srica 		break;
289361b9bf51Srica 	}
289461b9bf51Srica 	case AUE_LABELSYS_TNMLP:
289561b9bf51Srica 	{
289661b9bf51Srica 		tsol_mlpent_t	*mlpent;
289761b9bf51Srica 
289861b9bf51Srica 		au_uwrite(au_to_arg32(1, "cmd", cmd));
289961b9bf51Srica 
290061b9bf51Srica 		mlpent = kmem_alloc(sizeof (tsol_mlpent_t), KM_SLEEP);
290161b9bf51Srica 		if (copyin((caddr_t)a2, mlpent, sizeof (tsol_mlpent_t))) {
290261b9bf51Srica 			kmem_free(mlpent, sizeof (tsol_mlpent_t));
290361b9bf51Srica 			return;
290461b9bf51Srica 		}
290561b9bf51Srica 
290661b9bf51Srica 		if (mlpent->tsme_flags & TSOL_MEF_SHARED) {
290761b9bf51Srica 			au_uwrite(au_to_text("shared"));
290861b9bf51Srica 		} else {
290961b9bf51Srica 			zone_t	*zone;
291061b9bf51Srica 
291161b9bf51Srica 			zone = zone_find_by_id(mlpent->tsme_zoneid);
291261b9bf51Srica 			if (zone != NULL) {
291361b9bf51Srica 				au_uwrite(au_to_text(zone->zone_name));
291461b9bf51Srica 				zone_rele(zone);
291561b9bf51Srica 			}
291661b9bf51Srica 		}
291761b9bf51Srica 
291861b9bf51Srica 		/* Remaining args don't apply for FLUSH, so skip */
291961b9bf51Srica 		if (cmd == TNDB_FLUSH) {
292061b9bf51Srica 			kmem_free(mlpent, sizeof (tsol_mlpent_t));
292161b9bf51Srica 			break;
292261b9bf51Srica 		}
292361b9bf51Srica 
292461b9bf51Srica 		au_uwrite(au_to_arg32(2, "proto num",
292561b9bf51Srica 		    (uint32_t)mlpent->tsme_mlp.mlp_ipp));
292661b9bf51Srica 		au_uwrite(au_to_arg32(2, "mlp_port",
292761b9bf51Srica 		    (uint32_t)mlpent->tsme_mlp.mlp_port));
292861b9bf51Srica 
292961b9bf51Srica 		if (mlpent->tsme_mlp.mlp_port_upper != 0)
293061b9bf51Srica 			au_uwrite(au_to_arg32(2, "mlp_port_upper",
293161b9bf51Srica 			    (uint32_t)mlpent->tsme_mlp.mlp_port_upper));
293261b9bf51Srica 
293361b9bf51Srica 		kmem_free(mlpent, sizeof (tsol_mlpent_t));
293461b9bf51Srica 
293561b9bf51Srica 		break;
293661b9bf51Srica 	}
293761b9bf51Srica 	default:
293861b9bf51Srica 		break;
293961b9bf51Srica 	}
294061b9bf51Srica }
294161b9bf51Srica 
294261b9bf51Srica 
29437c478bd9Sstevel@tonic-gate static au_event_t
29447c478bd9Sstevel@tonic-gate aui_auditsys(au_event_t e)
29457c478bd9Sstevel@tonic-gate {
29467c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
29477c478bd9Sstevel@tonic-gate 	uint32_t code;
29487c478bd9Sstevel@tonic-gate 
29497c478bd9Sstevel@tonic-gate 	struct a {
29507c478bd9Sstevel@tonic-gate 		long	code;
29517c478bd9Sstevel@tonic-gate 		long	a1;
29527c478bd9Sstevel@tonic-gate 		long	a2;
29537c478bd9Sstevel@tonic-gate 		long	a3;
29547c478bd9Sstevel@tonic-gate 		long	a4;
29557c478bd9Sstevel@tonic-gate 		long	a5;
29567c478bd9Sstevel@tonic-gate 		long	a6;
29577c478bd9Sstevel@tonic-gate 		long	a7;
29587c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
29597c478bd9Sstevel@tonic-gate 
29607c478bd9Sstevel@tonic-gate 	code = (uint32_t)uap->code;
29617c478bd9Sstevel@tonic-gate 
29627c478bd9Sstevel@tonic-gate 	switch (code) {
29637c478bd9Sstevel@tonic-gate 
29647c478bd9Sstevel@tonic-gate 	case BSM_GETAUID:
29657c478bd9Sstevel@tonic-gate 		e = AUE_GETAUID;
29667c478bd9Sstevel@tonic-gate 		break;
29677c478bd9Sstevel@tonic-gate 	case BSM_SETAUID:
29687c478bd9Sstevel@tonic-gate 		e = AUE_SETAUID;
29697c478bd9Sstevel@tonic-gate 		break;
29707c478bd9Sstevel@tonic-gate 	case BSM_GETAUDIT:
29717c478bd9Sstevel@tonic-gate 		e = AUE_GETAUDIT;
29727c478bd9Sstevel@tonic-gate 		break;
29737c478bd9Sstevel@tonic-gate 	case BSM_GETAUDIT_ADDR:
29747c478bd9Sstevel@tonic-gate 		e = AUE_GETAUDIT_ADDR;
29757c478bd9Sstevel@tonic-gate 		break;
29767c478bd9Sstevel@tonic-gate 	case BSM_SETAUDIT:
29777c478bd9Sstevel@tonic-gate 		e = AUE_SETAUDIT;
29787c478bd9Sstevel@tonic-gate 		break;
29797c478bd9Sstevel@tonic-gate 	case BSM_SETAUDIT_ADDR:
29807c478bd9Sstevel@tonic-gate 		e = AUE_SETAUDIT_ADDR;
29817c478bd9Sstevel@tonic-gate 		break;
29827c478bd9Sstevel@tonic-gate 	case BSM_AUDIT:
29837c478bd9Sstevel@tonic-gate 		e = AUE_AUDIT;
29847c478bd9Sstevel@tonic-gate 		break;
29857c478bd9Sstevel@tonic-gate 	case BSM_AUDITCTL:
29867c478bd9Sstevel@tonic-gate 		switch ((uint_t)uap->a1) {
29877c478bd9Sstevel@tonic-gate 
29887c478bd9Sstevel@tonic-gate 		case A_GETPOLICY:
29897c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_GPOLICY;
29907c478bd9Sstevel@tonic-gate 			break;
29917c478bd9Sstevel@tonic-gate 		case A_SETPOLICY:
29927c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_SPOLICY;
29937c478bd9Sstevel@tonic-gate 			break;
2994f8994074SJan Friedel 		case A_GETAMASK:
2995f8994074SJan Friedel 			e = AUE_AUDITON_GETAMASK;
2996f8994074SJan Friedel 			break;
2997f8994074SJan Friedel 		case A_SETAMASK:
2998f8994074SJan Friedel 			e = AUE_AUDITON_SETAMASK;
2999f8994074SJan Friedel 			break;
30007c478bd9Sstevel@tonic-gate 		case A_GETKMASK:
30017c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_GETKMASK;
30027c478bd9Sstevel@tonic-gate 			break;
30037c478bd9Sstevel@tonic-gate 		case A_SETKMASK:
30047c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_SETKMASK;
30057c478bd9Sstevel@tonic-gate 			break;
30067c478bd9Sstevel@tonic-gate 		case A_GETQCTRL:
30077c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_GQCTRL;
30087c478bd9Sstevel@tonic-gate 			break;
30097c478bd9Sstevel@tonic-gate 		case A_SETQCTRL:
30107c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_SQCTRL;
30117c478bd9Sstevel@tonic-gate 			break;
30127c478bd9Sstevel@tonic-gate 		case A_GETCWD:
30137c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_GETCWD;
30147c478bd9Sstevel@tonic-gate 			break;
30157c478bd9Sstevel@tonic-gate 		case A_GETCAR:
30167c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_GETCAR;
30177c478bd9Sstevel@tonic-gate 			break;
30187c478bd9Sstevel@tonic-gate 		case A_GETSTAT:
30197c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_GETSTAT;
30207c478bd9Sstevel@tonic-gate 			break;
30217c478bd9Sstevel@tonic-gate 		case A_SETSTAT:
30227c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_SETSTAT;
30237c478bd9Sstevel@tonic-gate 			break;
30247c478bd9Sstevel@tonic-gate 		case A_SETUMASK:
30257c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_SETUMASK;
30267c478bd9Sstevel@tonic-gate 			break;
30277c478bd9Sstevel@tonic-gate 		case A_SETSMASK:
30287c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_SETSMASK;
30297c478bd9Sstevel@tonic-gate 			break;
30307c478bd9Sstevel@tonic-gate 		case A_GETCOND:
30317c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_GETCOND;
30327c478bd9Sstevel@tonic-gate 			break;
30337c478bd9Sstevel@tonic-gate 		case A_SETCOND:
30347c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_SETCOND;
30357c478bd9Sstevel@tonic-gate 			break;
30367c478bd9Sstevel@tonic-gate 		case A_GETCLASS:
30377c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_GETCLASS;
30387c478bd9Sstevel@tonic-gate 			break;
30397c478bd9Sstevel@tonic-gate 		case A_SETCLASS:
30407c478bd9Sstevel@tonic-gate 			e = AUE_AUDITON_SETCLASS;
30417c478bd9Sstevel@tonic-gate 			break;
30427c478bd9Sstevel@tonic-gate 		default:
30437c478bd9Sstevel@tonic-gate 			e = AUE_NULL;
30447c478bd9Sstevel@tonic-gate 			break;
30457c478bd9Sstevel@tonic-gate 		}
30467c478bd9Sstevel@tonic-gate 		break;
30477c478bd9Sstevel@tonic-gate 	default:
30487c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
30497c478bd9Sstevel@tonic-gate 		break;
30507c478bd9Sstevel@tonic-gate 	}
30517c478bd9Sstevel@tonic-gate 
30527c478bd9Sstevel@tonic-gate 	return (e);
30537c478bd9Sstevel@tonic-gate 
30547c478bd9Sstevel@tonic-gate }	/* AUI_AUDITSYS */
30557c478bd9Sstevel@tonic-gate 
30567c478bd9Sstevel@tonic-gate 
30577c478bd9Sstevel@tonic-gate static void
30587c478bd9Sstevel@tonic-gate aus_auditsys(struct t_audit_data *tad)
30597c478bd9Sstevel@tonic-gate {
30607c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
30617c478bd9Sstevel@tonic-gate 	uintptr_t a1, a2;
30627c478bd9Sstevel@tonic-gate 	STRUCT_DECL(auditinfo, ainfo);
30637c478bd9Sstevel@tonic-gate 	STRUCT_DECL(auditinfo_addr, ainfo_addr);
30647c478bd9Sstevel@tonic-gate 	au_evclass_map_t event;
30657c478bd9Sstevel@tonic-gate 	au_mask_t mask;
30667c478bd9Sstevel@tonic-gate 	int auditstate, policy;
3067f2fcf18cStz 	au_id_t auid;
30687c478bd9Sstevel@tonic-gate 
30697c478bd9Sstevel@tonic-gate 
30707c478bd9Sstevel@tonic-gate 	struct a {
30717c478bd9Sstevel@tonic-gate 		long	code;
30727c478bd9Sstevel@tonic-gate 		long	a1;
30737c478bd9Sstevel@tonic-gate 		long	a2;
30747c478bd9Sstevel@tonic-gate 		long	a3;
30757c478bd9Sstevel@tonic-gate 		long	a4;
30767c478bd9Sstevel@tonic-gate 		long	a5;
30777c478bd9Sstevel@tonic-gate 		long	a6;
30787c478bd9Sstevel@tonic-gate 		long	a7;
30797c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
30807c478bd9Sstevel@tonic-gate 
30817c478bd9Sstevel@tonic-gate 	a1   = (uintptr_t)uap->a1;
30827c478bd9Sstevel@tonic-gate 	a2   = (uintptr_t)uap->a2;
30837c478bd9Sstevel@tonic-gate 
30847c478bd9Sstevel@tonic-gate 	switch (tad->tad_event) {
30857c478bd9Sstevel@tonic-gate 	case AUE_SETAUID:
3086f2fcf18cStz 		if (copyin((caddr_t)a1, &auid, sizeof (au_id_t)))
3087f2fcf18cStz 				return;
3088f2fcf18cStz 		au_uwrite(au_to_arg32(2, "setauid", auid));
30897c478bd9Sstevel@tonic-gate 		break;
30907c478bd9Sstevel@tonic-gate 	case AUE_SETAUDIT:
30917c478bd9Sstevel@tonic-gate 		STRUCT_INIT(ainfo, get_udatamodel());
30927c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)a1, STRUCT_BUF(ainfo),
3093745b2690Stz 		    STRUCT_SIZE(ainfo))) {
30947c478bd9Sstevel@tonic-gate 				return;
30957c478bd9Sstevel@tonic-gate 		}
30967c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "setaudit:auid",
3097745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_auid)));
30987c478bd9Sstevel@tonic-gate #ifdef _LP64
30997c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg64((char)1, "setaudit:port",
3100745b2690Stz 		    (uint64_t)STRUCT_FGET(ainfo, ai_termid.port)));
31017c478bd9Sstevel@tonic-gate #else
31027c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "setaudit:port",
3103745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_termid.port)));
31047c478bd9Sstevel@tonic-gate #endif
31057c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "setaudit:machine",
3106745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_termid.machine)));
31077c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "setaudit:as_success",
3108745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success)));
31097c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "setaudit:as_failure",
3110745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure)));
31117c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "setaudit:asid",
3112745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_asid)));
31137c478bd9Sstevel@tonic-gate 		break;
31147c478bd9Sstevel@tonic-gate 	case AUE_SETAUDIT_ADDR:
31157c478bd9Sstevel@tonic-gate 		STRUCT_INIT(ainfo_addr, get_udatamodel());
31167c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)a1, STRUCT_BUF(ainfo_addr),
3117745b2690Stz 		    STRUCT_SIZE(ainfo_addr))) {
31187c478bd9Sstevel@tonic-gate 				return;
31197c478bd9Sstevel@tonic-gate 		}
31207c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "auid",
3121745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_auid)));
31227c478bd9Sstevel@tonic-gate #ifdef _LP64
31237c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg64((char)1, "port",
3124745b2690Stz 		    (uint64_t)STRUCT_FGET(ainfo_addr, ai_termid.at_port)));
31257c478bd9Sstevel@tonic-gate #else
31267c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "port",
3127745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_port)));
31287c478bd9Sstevel@tonic-gate #endif
31297c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "type",
3130745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_type)));
31317c478bd9Sstevel@tonic-gate 		if ((uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_type) ==
31327c478bd9Sstevel@tonic-gate 		    AU_IPv4) {
31337c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_in_addr(
3134745b2690Stz 			    (struct in_addr *)STRUCT_FGETP(ainfo_addr,
3135745b2690Stz 			    ai_termid.at_addr)));
31367c478bd9Sstevel@tonic-gate 		} else {
31377c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_in_addr_ex(
3138745b2690Stz 			    (int32_t *)STRUCT_FGETP(ainfo_addr,
3139745b2690Stz 			    ai_termid.at_addr)));
31407c478bd9Sstevel@tonic-gate 		}
31417c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "as_success",
3142745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_mask.as_success)));
31437c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "as_failure",
3144745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_mask.as_failure)));
31457c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32((char)1, "asid",
3146745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_asid)));
31477c478bd9Sstevel@tonic-gate 		break;
3148f8994074SJan Friedel 	case AUE_AUDITON_SETAMASK:
3149f8994074SJan Friedel 		if (copyin((caddr_t)a2, &mask, sizeof (au_mask_t)))
3150f8994074SJan Friedel 				return;
3151f8994074SJan Friedel 		au_uwrite(au_to_arg32(
3152f8994074SJan Friedel 		    2, "setamask:as_success", (uint32_t)mask.as_success));
3153f8994074SJan Friedel 		au_uwrite(au_to_arg32(
3154f8994074SJan Friedel 		    2, "setamask:as_failure", (uint32_t)mask.as_failure));
3155f8994074SJan Friedel 		break;
31567c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_SETKMASK:
31577c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)a2, &mask, sizeof (au_mask_t)))
31587c478bd9Sstevel@tonic-gate 				return;
31597c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(
3160745b2690Stz 		    2, "setkmask:as_success", (uint32_t)mask.as_success));
31617c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(
3162745b2690Stz 		    2, "setkmask:as_failure", (uint32_t)mask.as_failure));
31637c478bd9Sstevel@tonic-gate 		break;
31647c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_SPOLICY:
31657c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)a2, &policy, sizeof (int)))
31667c478bd9Sstevel@tonic-gate 			return;
31677c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "setpolicy", (uint32_t)policy));
31687c478bd9Sstevel@tonic-gate 		break;
31697c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_SQCTRL: {
31707c478bd9Sstevel@tonic-gate 		STRUCT_DECL(au_qctrl, qctrl);
31717c478bd9Sstevel@tonic-gate 		model_t model;
31727c478bd9Sstevel@tonic-gate 
31737c478bd9Sstevel@tonic-gate 		model = get_udatamodel();
31747c478bd9Sstevel@tonic-gate 		STRUCT_INIT(qctrl, model);
31757c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)a2, STRUCT_BUF(qctrl), STRUCT_SIZE(qctrl)))
31767c478bd9Sstevel@tonic-gate 				return;
31777c478bd9Sstevel@tonic-gate 		if (model == DATAMODEL_ILP32) {
31787c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(
3179745b2690Stz 			    3, "setqctrl:aq_hiwater",
3180745b2690Stz 			    (uint32_t)STRUCT_FGET(qctrl, aq_hiwater)));
31817c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(
3182745b2690Stz 			    3, "setqctrl:aq_lowater",
3183745b2690Stz 			    (uint32_t)STRUCT_FGET(qctrl, aq_lowater)));
31847c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(
3185745b2690Stz 			    3, "setqctrl:aq_bufsz",
3186745b2690Stz 			    (uint32_t)STRUCT_FGET(qctrl, aq_bufsz)));
31877c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(
3188745b2690Stz 			    3, "setqctrl:aq_delay",
3189745b2690Stz 			    (uint32_t)STRUCT_FGET(qctrl, aq_delay)));
31907c478bd9Sstevel@tonic-gate 		} else {
31917c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg64(
3192745b2690Stz 			    3, "setqctrl:aq_hiwater",
3193745b2690Stz 			    (uint64_t)STRUCT_FGET(qctrl, aq_hiwater)));
31947c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg64(
3195745b2690Stz 			    3, "setqctrl:aq_lowater",
3196745b2690Stz 			    (uint64_t)STRUCT_FGET(qctrl, aq_lowater)));
31977c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg64(
3198745b2690Stz 			    3, "setqctrl:aq_bufsz",
3199745b2690Stz 			    (uint64_t)STRUCT_FGET(qctrl, aq_bufsz)));
32007c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg64(
3201745b2690Stz 			    3, "setqctrl:aq_delay",
3202745b2690Stz 			    (uint64_t)STRUCT_FGET(qctrl, aq_delay)));
32037c478bd9Sstevel@tonic-gate 		}
32047c478bd9Sstevel@tonic-gate 		break;
32057c478bd9Sstevel@tonic-gate 	}
32067c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_SETUMASK:
32077c478bd9Sstevel@tonic-gate 		STRUCT_INIT(ainfo, get_udatamodel());
32087c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)uap->a2, STRUCT_BUF(ainfo),
3209745b2690Stz 		    STRUCT_SIZE(ainfo))) {
3210745b2690Stz 			return;
32117c478bd9Sstevel@tonic-gate 		}
32127c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "setumask:as_success",
3213745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success)));
32147c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "setumask:as_failure",
3215745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure)));
32167c478bd9Sstevel@tonic-gate 		break;
32177c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_SETSMASK:
32187c478bd9Sstevel@tonic-gate 		STRUCT_INIT(ainfo, get_udatamodel());
32197c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)uap->a2, STRUCT_BUF(ainfo),
3220745b2690Stz 		    STRUCT_SIZE(ainfo))) {
3221745b2690Stz 			return;
32227c478bd9Sstevel@tonic-gate 		}
32237c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "setsmask:as_success",
3224745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success)));
32257c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "setsmask:as_failure",
3226745b2690Stz 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure)));
32277c478bd9Sstevel@tonic-gate 		break;
32287c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_SETCOND:
32297c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)a2, &auditstate, sizeof (int)))
32307c478bd9Sstevel@tonic-gate 			return;
32317c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "setcond", (uint32_t)auditstate));
32327c478bd9Sstevel@tonic-gate 		break;
32337c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_SETCLASS:
32347c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)a2, &event, sizeof (au_evclass_map_t)))
32357c478bd9Sstevel@tonic-gate 			return;
32367c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(
3237745b2690Stz 		    2, "setclass:ec_event", (uint32_t)event.ec_number));
32387c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(
3239745b2690Stz 		    3, "setclass:ec_class", (uint32_t)event.ec_class));
32407c478bd9Sstevel@tonic-gate 		break;
32417c478bd9Sstevel@tonic-gate 	case AUE_GETAUID:
32427c478bd9Sstevel@tonic-gate 	case AUE_GETAUDIT:
32437c478bd9Sstevel@tonic-gate 	case AUE_GETAUDIT_ADDR:
32447c478bd9Sstevel@tonic-gate 	case AUE_AUDIT:
32457c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_GPOLICY:
32467c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_GQCTRL:
3247f8994074SJan Friedel 	case AUE_AUDITON_GETAMASK:
32487c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_GETKMASK:
32497c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_GETCWD:
32507c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_GETCAR:
32517c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_GETSTAT:
32527c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_SETSTAT:
32537c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_GETCOND:
32547c478bd9Sstevel@tonic-gate 	case AUE_AUDITON_GETCLASS:
32557c478bd9Sstevel@tonic-gate 		break;
32567c478bd9Sstevel@tonic-gate 	default:
32577c478bd9Sstevel@tonic-gate 		break;
32587c478bd9Sstevel@tonic-gate 	}
32597c478bd9Sstevel@tonic-gate 
32607c478bd9Sstevel@tonic-gate }	/* AUS_AUDITSYS */
32617c478bd9Sstevel@tonic-gate 
32627c478bd9Sstevel@tonic-gate 
32637c478bd9Sstevel@tonic-gate /* only audit privileged operations for systeminfo(2) system call */
32647c478bd9Sstevel@tonic-gate static au_event_t
32657c478bd9Sstevel@tonic-gate aui_sysinfo(au_event_t e)
32667c478bd9Sstevel@tonic-gate {
32677c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
32687c478bd9Sstevel@tonic-gate 	uint32_t command;
32697c478bd9Sstevel@tonic-gate 
32707c478bd9Sstevel@tonic-gate 	struct a {
32717c478bd9Sstevel@tonic-gate 		long	command;
32727c478bd9Sstevel@tonic-gate 		long	buf;		/* char * */
32737c478bd9Sstevel@tonic-gate 		long	count;
32747c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
32757c478bd9Sstevel@tonic-gate 
32767c478bd9Sstevel@tonic-gate 	command = (uint32_t)uap->command;
32777c478bd9Sstevel@tonic-gate 
32787c478bd9Sstevel@tonic-gate 	switch (command) {
32797c478bd9Sstevel@tonic-gate 	case SI_SET_HOSTNAME:
32807c478bd9Sstevel@tonic-gate 	case SI_SET_SRPC_DOMAIN:
32817c478bd9Sstevel@tonic-gate 		e = (au_event_t)AUE_SYSINFO;
32827c478bd9Sstevel@tonic-gate 		break;
32837c478bd9Sstevel@tonic-gate 	default:
32847c478bd9Sstevel@tonic-gate 		e = (au_event_t)AUE_NULL;
32857c478bd9Sstevel@tonic-gate 		break;
32867c478bd9Sstevel@tonic-gate 	}
32877c478bd9Sstevel@tonic-gate 	return (e);
32887c478bd9Sstevel@tonic-gate }
32897c478bd9Sstevel@tonic-gate 
32907c478bd9Sstevel@tonic-gate /*ARGSUSED*/
32917c478bd9Sstevel@tonic-gate static void
32927c478bd9Sstevel@tonic-gate aus_sysinfo(struct t_audit_data *tad)
32937c478bd9Sstevel@tonic-gate {
32947c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
32957c478bd9Sstevel@tonic-gate 	uint32_t command;
32967c478bd9Sstevel@tonic-gate 	size_t len, maxlen;
32977c478bd9Sstevel@tonic-gate 	char *name;
32987c478bd9Sstevel@tonic-gate 	uintptr_t buf;
32997c478bd9Sstevel@tonic-gate 
33007c478bd9Sstevel@tonic-gate 	struct a {
33017c478bd9Sstevel@tonic-gate 		long	command;
33027c478bd9Sstevel@tonic-gate 		long	buf;		/* char * */
33037c478bd9Sstevel@tonic-gate 		long	count;
33047c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
33057c478bd9Sstevel@tonic-gate 
33067c478bd9Sstevel@tonic-gate 	command = (uint32_t)uap->command;
33077c478bd9Sstevel@tonic-gate 	buf = (uintptr_t)uap->buf;
33087c478bd9Sstevel@tonic-gate 
33097c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "cmd", command));
33107c478bd9Sstevel@tonic-gate 
33117c478bd9Sstevel@tonic-gate 	switch (command) {
33127c478bd9Sstevel@tonic-gate 	case SI_SET_HOSTNAME:
33137c478bd9Sstevel@tonic-gate 	{
33147c478bd9Sstevel@tonic-gate 		if (secpolicy_sys_config(CRED(), B_TRUE) != 0)
33157c478bd9Sstevel@tonic-gate 			return;
33167c478bd9Sstevel@tonic-gate 
33177c478bd9Sstevel@tonic-gate 		maxlen = SYS_NMLN;
33187c478bd9Sstevel@tonic-gate 		name = kmem_alloc(maxlen, KM_SLEEP);
33197c478bd9Sstevel@tonic-gate 		if (copyinstr((caddr_t)buf, name, SYS_NMLN, &len))
33207c478bd9Sstevel@tonic-gate 			break;
33217c478bd9Sstevel@tonic-gate 
33227c478bd9Sstevel@tonic-gate 		/*
33237c478bd9Sstevel@tonic-gate 		 * Must be non-NULL string and string
33247c478bd9Sstevel@tonic-gate 		 * must be less than SYS_NMLN chars.
33257c478bd9Sstevel@tonic-gate 		 */
33267c478bd9Sstevel@tonic-gate 		if (len < 2 || (len == SYS_NMLN && name[SYS_NMLN - 1] != '\0'))
33277c478bd9Sstevel@tonic-gate 			break;
33287c478bd9Sstevel@tonic-gate 
33297c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_text(name));
33307c478bd9Sstevel@tonic-gate 		break;
33317c478bd9Sstevel@tonic-gate 	}
33327c478bd9Sstevel@tonic-gate 
33337c478bd9Sstevel@tonic-gate 	case SI_SET_SRPC_DOMAIN:
33347c478bd9Sstevel@tonic-gate 	{
33357c478bd9Sstevel@tonic-gate 		if (secpolicy_sys_config(CRED(), B_TRUE) != 0)
33367c478bd9Sstevel@tonic-gate 			return;
33377c478bd9Sstevel@tonic-gate 
33387c478bd9Sstevel@tonic-gate 		maxlen = SYS_NMLN;
33397c478bd9Sstevel@tonic-gate 		name = kmem_alloc(maxlen, KM_SLEEP);
33407c478bd9Sstevel@tonic-gate 		if (copyinstr((caddr_t)buf, name, SYS_NMLN, &len))
33417c478bd9Sstevel@tonic-gate 			break;
33427c478bd9Sstevel@tonic-gate 
33437c478bd9Sstevel@tonic-gate 		/*
33447c478bd9Sstevel@tonic-gate 		 * If string passed in is longer than length
33457c478bd9Sstevel@tonic-gate 		 * allowed for domain name, fail.
33467c478bd9Sstevel@tonic-gate 		 */
33477c478bd9Sstevel@tonic-gate 		if (len == SYS_NMLN && name[SYS_NMLN - 1] != '\0')
33487c478bd9Sstevel@tonic-gate 			break;
33497c478bd9Sstevel@tonic-gate 
33507c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_text(name));
33517c478bd9Sstevel@tonic-gate 		break;
33527c478bd9Sstevel@tonic-gate 	}
33537c478bd9Sstevel@tonic-gate 
33547c478bd9Sstevel@tonic-gate 	default:
33557c478bd9Sstevel@tonic-gate 		return;
33567c478bd9Sstevel@tonic-gate 	}
33577c478bd9Sstevel@tonic-gate 
33587c478bd9Sstevel@tonic-gate 	kmem_free(name, maxlen);
33597c478bd9Sstevel@tonic-gate }
33607c478bd9Sstevel@tonic-gate 
33617c478bd9Sstevel@tonic-gate static au_event_t
33627c478bd9Sstevel@tonic-gate aui_modctl(au_event_t e)
33637c478bd9Sstevel@tonic-gate {
33647c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
33657c478bd9Sstevel@tonic-gate 	uint_t cmd;
33667c478bd9Sstevel@tonic-gate 
33677c478bd9Sstevel@tonic-gate 	struct a {
33687c478bd9Sstevel@tonic-gate 		long	cmd;
33697c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)clwp->lwp_ap;
33707c478bd9Sstevel@tonic-gate 
33717c478bd9Sstevel@tonic-gate 	cmd = (uint_t)uap->cmd;
33727c478bd9Sstevel@tonic-gate 
33737c478bd9Sstevel@tonic-gate 	switch (cmd) {
33747c478bd9Sstevel@tonic-gate 	case MODLOAD:
33757c478bd9Sstevel@tonic-gate 		e = AUE_MODLOAD;
33767c478bd9Sstevel@tonic-gate 		break;
33777c478bd9Sstevel@tonic-gate 	case MODUNLOAD:
33787c478bd9Sstevel@tonic-gate 		e = AUE_MODUNLOAD;
33797c478bd9Sstevel@tonic-gate 		break;
33807c478bd9Sstevel@tonic-gate 	case MODADDMAJBIND:
33817c478bd9Sstevel@tonic-gate 		e = AUE_MODADDMAJ;
33827c478bd9Sstevel@tonic-gate 		break;
33837c478bd9Sstevel@tonic-gate 	case MODSETDEVPOLICY:
33847c478bd9Sstevel@tonic-gate 		e = AUE_MODDEVPLCY;
33857c478bd9Sstevel@tonic-gate 		break;
33867c478bd9Sstevel@tonic-gate 	case MODALLOCPRIV:
33877c478bd9Sstevel@tonic-gate 		e = AUE_MODADDPRIV;
33887c478bd9Sstevel@tonic-gate 		break;
33897c478bd9Sstevel@tonic-gate 	default:
33907c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
33917c478bd9Sstevel@tonic-gate 		break;
33927c478bd9Sstevel@tonic-gate 	}
33937c478bd9Sstevel@tonic-gate 	return (e);
33947c478bd9Sstevel@tonic-gate }
33957c478bd9Sstevel@tonic-gate 
33967c478bd9Sstevel@tonic-gate 
33977c478bd9Sstevel@tonic-gate /*ARGSUSED*/
33987c478bd9Sstevel@tonic-gate static void
33997c478bd9Sstevel@tonic-gate aus_modctl(struct t_audit_data *tad)
34007c478bd9Sstevel@tonic-gate {
34017c478bd9Sstevel@tonic-gate 	klwp_t *clwp = ttolwp(curthread);
34027c478bd9Sstevel@tonic-gate 	void *a	= clwp->lwp_ap;
34037c478bd9Sstevel@tonic-gate 	uint_t use_path;
34047c478bd9Sstevel@tonic-gate 
34057c478bd9Sstevel@tonic-gate 	switch (tad->tad_event) {
34067c478bd9Sstevel@tonic-gate 	case AUE_MODLOAD: {
34077c478bd9Sstevel@tonic-gate 		typedef struct {
34087c478bd9Sstevel@tonic-gate 			long	cmd;
34097c478bd9Sstevel@tonic-gate 			long	use_path;
34107c478bd9Sstevel@tonic-gate 			long	filename;		/* char * */
34117c478bd9Sstevel@tonic-gate 		} modloada_t;
34127c478bd9Sstevel@tonic-gate 
34137c478bd9Sstevel@tonic-gate 		char *filenamep;
34147c478bd9Sstevel@tonic-gate 		uintptr_t fname;
34157c478bd9Sstevel@tonic-gate 		extern char *default_path;
34167c478bd9Sstevel@tonic-gate 
34177c478bd9Sstevel@tonic-gate 		fname = (uintptr_t)((modloada_t *)a)->filename;
34187c478bd9Sstevel@tonic-gate 		use_path = (uint_t)((modloada_t *)a)->use_path;
34197c478bd9Sstevel@tonic-gate 
34207c478bd9Sstevel@tonic-gate 			/* space to hold path */
34217c478bd9Sstevel@tonic-gate 		filenamep = kmem_alloc(MOD_MAXPATH, KM_SLEEP);
34227c478bd9Sstevel@tonic-gate 			/* get string */
34237c478bd9Sstevel@tonic-gate 		if (copyinstr((caddr_t)fname, filenamep, MOD_MAXPATH, 0)) {
34247c478bd9Sstevel@tonic-gate 				/* free allocated path */
34257c478bd9Sstevel@tonic-gate 			kmem_free(filenamep, MOD_MAXPATH);
34267c478bd9Sstevel@tonic-gate 			return;
34277c478bd9Sstevel@tonic-gate 		}
34287c478bd9Sstevel@tonic-gate 			/* ensure it's null terminated */
34297c478bd9Sstevel@tonic-gate 		filenamep[MOD_MAXPATH - 1] = 0;
34307c478bd9Sstevel@tonic-gate 
34317c478bd9Sstevel@tonic-gate 		if (use_path)
34327c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_text(default_path));
34337c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_text(filenamep));
34347c478bd9Sstevel@tonic-gate 
34357c478bd9Sstevel@tonic-gate 			/* release temporary memory */
34367c478bd9Sstevel@tonic-gate 		kmem_free(filenamep, MOD_MAXPATH);
34377c478bd9Sstevel@tonic-gate 		break;
34387c478bd9Sstevel@tonic-gate 	}
34397c478bd9Sstevel@tonic-gate 	case AUE_MODUNLOAD: {
34407c478bd9Sstevel@tonic-gate 		typedef struct {
34417c478bd9Sstevel@tonic-gate 			long	cmd;
34427c478bd9Sstevel@tonic-gate 			long	id;
34437c478bd9Sstevel@tonic-gate 		} modunloada_t;
34447c478bd9Sstevel@tonic-gate 
34457c478bd9Sstevel@tonic-gate 		uint32_t id = (uint32_t)((modunloada_t *)a)->id;
34467c478bd9Sstevel@tonic-gate 
34477c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "id", id));
34487c478bd9Sstevel@tonic-gate 		break;
34497c478bd9Sstevel@tonic-gate 	}
34507c478bd9Sstevel@tonic-gate 	case AUE_MODADDMAJ: {
34517c478bd9Sstevel@tonic-gate 		STRUCT_DECL(modconfig, mc);
34527c478bd9Sstevel@tonic-gate 		typedef struct {
34537c478bd9Sstevel@tonic-gate 			long	cmd;
34547c478bd9Sstevel@tonic-gate 			long	subcmd;
34557c478bd9Sstevel@tonic-gate 			long	data;		/* int * */
34567c478bd9Sstevel@tonic-gate 		} modconfiga_t;
34577c478bd9Sstevel@tonic-gate 
34587c478bd9Sstevel@tonic-gate 		STRUCT_DECL(aliases, alias);
34597c478bd9Sstevel@tonic-gate 		caddr_t ap;
34607c478bd9Sstevel@tonic-gate 		int i, num_aliases;
34617c478bd9Sstevel@tonic-gate 		char *drvname, *mc_drvname;
34627c478bd9Sstevel@tonic-gate 		char *name;
34637c478bd9Sstevel@tonic-gate 		extern char *ddi_major_to_name(major_t);
34647c478bd9Sstevel@tonic-gate 		model_t model;
34657c478bd9Sstevel@tonic-gate 
34667c478bd9Sstevel@tonic-gate 		uintptr_t data = (uintptr_t)((modconfiga_t *)a)->data;
34677c478bd9Sstevel@tonic-gate 
34687c478bd9Sstevel@tonic-gate 		model = get_udatamodel();
34697c478bd9Sstevel@tonic-gate 		STRUCT_INIT(mc, model);
34707c478bd9Sstevel@tonic-gate 			/* sanitize buffer */
34717c478bd9Sstevel@tonic-gate 		bzero((caddr_t)STRUCT_BUF(mc), STRUCT_SIZE(mc));
34727c478bd9Sstevel@tonic-gate 			/* get user arguments */
34737c478bd9Sstevel@tonic-gate 		if (copyin((caddr_t)data, (caddr_t)STRUCT_BUF(mc),
3474745b2690Stz 		    STRUCT_SIZE(mc)) != 0)
34757c478bd9Sstevel@tonic-gate 			return;
34767c478bd9Sstevel@tonic-gate 
34777c478bd9Sstevel@tonic-gate 		mc_drvname = STRUCT_FGET(mc, drvname);
34787c478bd9Sstevel@tonic-gate 		if ((drvname = ddi_major_to_name(
3479745b2690Stz 		    (major_t)STRUCT_FGET(mc, major))) != NULL &&
3480745b2690Stz 		    strncmp(drvname, mc_drvname, MAXMODCONFNAME) != 0) {
34817c478bd9Sstevel@tonic-gate 				/* safety */
34827c478bd9Sstevel@tonic-gate 			if (mc_drvname[0] != '\0') {
34837c478bd9Sstevel@tonic-gate 				mc_drvname[MAXMODCONFNAME-1] = '\0';
34847c478bd9Sstevel@tonic-gate 				au_uwrite(au_to_text(mc_drvname));
34857c478bd9Sstevel@tonic-gate 			}
34867c478bd9Sstevel@tonic-gate 				/* drvname != NULL from test above */
34877c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_text(drvname));
34887c478bd9Sstevel@tonic-gate 			return;
34897c478bd9Sstevel@tonic-gate 		}
34907c478bd9Sstevel@tonic-gate 
34917c478bd9Sstevel@tonic-gate 		if (mc_drvname[0] != '\0') {
34927c478bd9Sstevel@tonic-gate 				/* safety */
34937c478bd9Sstevel@tonic-gate 			mc_drvname[MAXMODCONFNAME-1] = '\0';
34947c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_text(mc_drvname));
34957c478bd9Sstevel@tonic-gate 		} else
34967c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_text("no drvname"));
34977c478bd9Sstevel@tonic-gate 
34987c478bd9Sstevel@tonic-gate 		num_aliases = STRUCT_FGET(mc, num_aliases);
34997c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(5, "", (uint32_t)num_aliases));
35007c478bd9Sstevel@tonic-gate 		ap = (caddr_t)STRUCT_FGETP(mc, ap);
35017c478bd9Sstevel@tonic-gate 		name = kmem_alloc(MAXMODCONFNAME, KM_SLEEP);
35027c478bd9Sstevel@tonic-gate 		STRUCT_INIT(alias, model);
35037c478bd9Sstevel@tonic-gate 		for (i = 0; i < num_aliases; i++) {
35047c478bd9Sstevel@tonic-gate 			bzero((caddr_t)STRUCT_BUF(alias),
3505745b2690Stz 			    STRUCT_SIZE(alias));
35067c478bd9Sstevel@tonic-gate 			if (copyin((caddr_t)ap, (caddr_t)STRUCT_BUF(alias),
3507745b2690Stz 			    STRUCT_SIZE(alias)) != 0)
35087c478bd9Sstevel@tonic-gate 				break;
35097c478bd9Sstevel@tonic-gate 			if (copyinstr(STRUCT_FGETP(alias, a_name), name,
35107c478bd9Sstevel@tonic-gate 			    MAXMODCONFNAME, NULL) != 0) {
35117c478bd9Sstevel@tonic-gate 				break;
35127c478bd9Sstevel@tonic-gate 			}
35137c478bd9Sstevel@tonic-gate 
35147c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_text(name));
35157c478bd9Sstevel@tonic-gate 			ap = (caddr_t)STRUCT_FGETP(alias, a_next);
35167c478bd9Sstevel@tonic-gate 		}
35177c478bd9Sstevel@tonic-gate 		kmem_free(name, MAXMODCONFNAME);
35187c478bd9Sstevel@tonic-gate 		break;
35197c478bd9Sstevel@tonic-gate 	}
35207c478bd9Sstevel@tonic-gate 	default:
35217c478bd9Sstevel@tonic-gate 		break;
35227c478bd9Sstevel@tonic-gate 	}
35237c478bd9Sstevel@tonic-gate }
35247c478bd9Sstevel@tonic-gate 
35257c478bd9Sstevel@tonic-gate 
35267c478bd9Sstevel@tonic-gate /*ARGSUSED*/
35277c478bd9Sstevel@tonic-gate static void
35287c478bd9Sstevel@tonic-gate auf_accept(
35297c478bd9Sstevel@tonic-gate 	struct t_audit_data *tad,
35307c478bd9Sstevel@tonic-gate 	int	error,
35317c478bd9Sstevel@tonic-gate 	rval_t	*rval)
35327c478bd9Sstevel@tonic-gate {
35337c478bd9Sstevel@tonic-gate 	uint32_t scid;
35347c478bd9Sstevel@tonic-gate 	uint32_t sy_flags;
35357c478bd9Sstevel@tonic-gate 	int fd;
35367c478bd9Sstevel@tonic-gate 	struct sonode *so;
35377c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
35387c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
35397c478bd9Sstevel@tonic-gate 	int err;
35407c478bd9Sstevel@tonic-gate 	short so_family, so_type;
35417c478bd9Sstevel@tonic-gate 	int add_sock_token = 0;
35427c478bd9Sstevel@tonic-gate 
35437c478bd9Sstevel@tonic-gate 	/* need to determine type of executing binary */
35447c478bd9Sstevel@tonic-gate 	scid = tad->tad_scid;
35457c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32_IMPL
35467c478bd9Sstevel@tonic-gate 	if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE)
35477c478bd9Sstevel@tonic-gate 		sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
35487c478bd9Sstevel@tonic-gate 	else
35497c478bd9Sstevel@tonic-gate 		sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK;
35507c478bd9Sstevel@tonic-gate #else
35517c478bd9Sstevel@tonic-gate 	sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
35527c478bd9Sstevel@tonic-gate #endif
3553aeba2189SMarek Pospisil 	switch (sy_flags) {
3554aeba2189SMarek Pospisil 	case SE_32RVAL1:
3555aeba2189SMarek Pospisil 		/* FALLTHRU */
3556aeba2189SMarek Pospisil 	case SE_32RVAL2|SE_32RVAL1:
35577c478bd9Sstevel@tonic-gate 		fd = rval->r_val1;
3558aeba2189SMarek Pospisil 		break;
3559aeba2189SMarek Pospisil 	case SE_64RVAL:
35607c478bd9Sstevel@tonic-gate 		fd = (int)rval->r_vals;
3561aeba2189SMarek Pospisil 		break;
3562aeba2189SMarek Pospisil 	default:
3563aeba2189SMarek Pospisil 		/*
3564aeba2189SMarek Pospisil 		 * should never happen, seems to be an internal error
3565aeba2189SMarek Pospisil 		 * in sysent => no fd, nothing to audit here, returning
3566aeba2189SMarek Pospisil 		 */
3567aeba2189SMarek Pospisil 		return;
3568aeba2189SMarek Pospisil 	}
35697c478bd9Sstevel@tonic-gate 
35707c478bd9Sstevel@tonic-gate 	if (error) {
35717c478bd9Sstevel@tonic-gate 		/* can't trust socket contents. Just return */
35727c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
35737c478bd9Sstevel@tonic-gate 		return;
35747c478bd9Sstevel@tonic-gate 	}
35757c478bd9Sstevel@tonic-gate 
3576745b2690Stz 	if ((so = getsonode(fd, &err, NULL)) == NULL) {
35777c478bd9Sstevel@tonic-gate 		/*
35787c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a accept from non socket
35797c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
35807c478bd9Sstevel@tonic-gate 		 * generation here.
35817c478bd9Sstevel@tonic-gate 		 */
35827c478bd9Sstevel@tonic-gate 		return;
35837c478bd9Sstevel@tonic-gate 	}
35847c478bd9Sstevel@tonic-gate 
35857c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
35867c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
35877c478bd9Sstevel@tonic-gate 
35887c478bd9Sstevel@tonic-gate 	switch (so_family) {
35897c478bd9Sstevel@tonic-gate 	case AF_INET:
35907c478bd9Sstevel@tonic-gate 	case AF_INET6:
35917c478bd9Sstevel@tonic-gate 		/*
35927c478bd9Sstevel@tonic-gate 		 * XXX - what about other socket types for AF_INET (e.g. DGRAM)
35937c478bd9Sstevel@tonic-gate 		 */
35947c478bd9Sstevel@tonic-gate 		if (so->so_type == SOCK_STREAM) {
35950f1702c5SYu Xiangning 			socklen_t len;
35967c478bd9Sstevel@tonic-gate 
35977c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
35987c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
35997c478bd9Sstevel@tonic-gate 
36000f1702c5SYu Xiangning 			len = sizeof (so_laddr);
36010f1702c5SYu Xiangning 			(void) socket_getsockname(so,
36020f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
36030f1702c5SYu Xiangning 			len = sizeof (so_faddr);
36040f1702c5SYu Xiangning 			(void) socket_getpeername(so,
36050f1702c5SYu Xiangning 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
36067c478bd9Sstevel@tonic-gate 
36077c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
36087c478bd9Sstevel@tonic-gate 		}
36097c478bd9Sstevel@tonic-gate 		break;
36107c478bd9Sstevel@tonic-gate 
36117c478bd9Sstevel@tonic-gate 	default:
36127c478bd9Sstevel@tonic-gate 		/* AF_UNIX, AF_ROUTE, AF_KEY do not support accept */
36137c478bd9Sstevel@tonic-gate 		break;
36147c478bd9Sstevel@tonic-gate 	}
36157c478bd9Sstevel@tonic-gate 
36167c478bd9Sstevel@tonic-gate 	releasef(fd);
36177c478bd9Sstevel@tonic-gate 
36187c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
36197c478bd9Sstevel@tonic-gate 
36207c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
36217c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(0, "family", (uint32_t)(so_family)));
36227c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(0, "type", (uint32_t)(so_type)));
36237c478bd9Sstevel@tonic-gate 		return;
36247c478bd9Sstevel@tonic-gate 	}
36257c478bd9Sstevel@tonic-gate 
36267c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
36277c478bd9Sstevel@tonic-gate 
36287c478bd9Sstevel@tonic-gate }
36297c478bd9Sstevel@tonic-gate 
36307c478bd9Sstevel@tonic-gate /*ARGSUSED*/
36317c478bd9Sstevel@tonic-gate static void
36327c478bd9Sstevel@tonic-gate auf_bind(struct t_audit_data *tad, int error, rval_t *rvp)
36337c478bd9Sstevel@tonic-gate {
36347c478bd9Sstevel@tonic-gate 	struct a {
36357c478bd9Sstevel@tonic-gate 		long	fd;
36367c478bd9Sstevel@tonic-gate 		long	addr;
36377c478bd9Sstevel@tonic-gate 		long	len;
36387c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
36397c478bd9Sstevel@tonic-gate 
36407c478bd9Sstevel@tonic-gate 	struct sonode *so;
36417c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
36427c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
36437c478bd9Sstevel@tonic-gate 	int err, fd;
36440f1702c5SYu Xiangning 	socklen_t len;
36457c478bd9Sstevel@tonic-gate 	short so_family, so_type;
36467c478bd9Sstevel@tonic-gate 	int add_sock_token = 0;
36477c478bd9Sstevel@tonic-gate 
36487c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
36497c478bd9Sstevel@tonic-gate 
36507c478bd9Sstevel@tonic-gate 	/*
36517c478bd9Sstevel@tonic-gate 	 * bind failed, then nothing extra to add to audit record.
36527c478bd9Sstevel@tonic-gate 	 */
36537c478bd9Sstevel@tonic-gate 	if (error) {
36547c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
36557c478bd9Sstevel@tonic-gate 		/* XXX may want to add failed address some day */
36567c478bd9Sstevel@tonic-gate 		return;
36577c478bd9Sstevel@tonic-gate 	}
36587c478bd9Sstevel@tonic-gate 
3659745b2690Stz 	if ((so = getsonode(fd, &err, NULL)) == NULL) {
36607c478bd9Sstevel@tonic-gate 		/*
36617c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a bind from non socket
36627c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
36637c478bd9Sstevel@tonic-gate 		 * generation here.
36647c478bd9Sstevel@tonic-gate 		 */
36657c478bd9Sstevel@tonic-gate 		return;
36667c478bd9Sstevel@tonic-gate 	}
36677c478bd9Sstevel@tonic-gate 
36687c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
36697c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
36707c478bd9Sstevel@tonic-gate 
36717c478bd9Sstevel@tonic-gate 	switch (so_family) {
36727c478bd9Sstevel@tonic-gate 	case AF_INET:
36737c478bd9Sstevel@tonic-gate 	case AF_INET6:
36747c478bd9Sstevel@tonic-gate 
36757c478bd9Sstevel@tonic-gate 		bzero(so_faddr, sizeof (so_faddr));
36760f1702c5SYu Xiangning 		len = sizeof (so_faddr);
36777c478bd9Sstevel@tonic-gate 
36780f1702c5SYu Xiangning 		(void) socket_getpeername(so,
36790f1702c5SYu Xiangning 		    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
36807c478bd9Sstevel@tonic-gate 		add_sock_token = 1;
36817c478bd9Sstevel@tonic-gate 
36827c478bd9Sstevel@tonic-gate 		break;
36837c478bd9Sstevel@tonic-gate 
36847c478bd9Sstevel@tonic-gate 	case AF_UNIX:
36857c478bd9Sstevel@tonic-gate 		/* token added by lookup */
36867c478bd9Sstevel@tonic-gate 		break;
36877c478bd9Sstevel@tonic-gate 	default:
36887c478bd9Sstevel@tonic-gate 		/* AF_ROUTE, AF_KEY do not support accept */
36897c478bd9Sstevel@tonic-gate 		break;
36907c478bd9Sstevel@tonic-gate 	}
36917c478bd9Sstevel@tonic-gate 
36927c478bd9Sstevel@tonic-gate 	releasef(fd);
36937c478bd9Sstevel@tonic-gate 
36947c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
36957c478bd9Sstevel@tonic-gate 
36967c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
36977c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family)));
36987c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type)));
36997c478bd9Sstevel@tonic-gate 		return;
37007c478bd9Sstevel@tonic-gate 	}
37017c478bd9Sstevel@tonic-gate 
37027c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
37037c478bd9Sstevel@tonic-gate 
37047c478bd9Sstevel@tonic-gate }
37057c478bd9Sstevel@tonic-gate 
37067c478bd9Sstevel@tonic-gate /*ARGSUSED*/
37077c478bd9Sstevel@tonic-gate static void
37087c478bd9Sstevel@tonic-gate auf_connect(struct t_audit_data *tad, int error, rval_t *rval)
37097c478bd9Sstevel@tonic-gate {
37107c478bd9Sstevel@tonic-gate 	struct a {
37117c478bd9Sstevel@tonic-gate 		long	fd;
37127c478bd9Sstevel@tonic-gate 		long	addr;
37137c478bd9Sstevel@tonic-gate 		long	len;
37147c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
37157c478bd9Sstevel@tonic-gate 
37167c478bd9Sstevel@tonic-gate 	struct sonode *so;
37177c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
37187c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
37197c478bd9Sstevel@tonic-gate 	int err, fd;
37200f1702c5SYu Xiangning 	socklen_t len;
37217c478bd9Sstevel@tonic-gate 	short so_family, so_type;
37227c478bd9Sstevel@tonic-gate 	int add_sock_token = 0;
37237c478bd9Sstevel@tonic-gate 
37247c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
37257c478bd9Sstevel@tonic-gate 
37267c478bd9Sstevel@tonic-gate 
3727745b2690Stz 	if ((so = getsonode(fd, &err, NULL)) == NULL) {
37287c478bd9Sstevel@tonic-gate 		/*
37297c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a connect from non socket
37307c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
37317c478bd9Sstevel@tonic-gate 		 * generation here.
37327c478bd9Sstevel@tonic-gate 		 */
37337c478bd9Sstevel@tonic-gate 		return;
37347c478bd9Sstevel@tonic-gate 	}
37357c478bd9Sstevel@tonic-gate 
37367c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
37377c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
37387c478bd9Sstevel@tonic-gate 
37397c478bd9Sstevel@tonic-gate 	switch (so_family) {
37407c478bd9Sstevel@tonic-gate 	case AF_INET:
37417c478bd9Sstevel@tonic-gate 	case AF_INET6:
37427c478bd9Sstevel@tonic-gate 
37437c478bd9Sstevel@tonic-gate 		bzero(so_laddr, sizeof (so_laddr));
37447c478bd9Sstevel@tonic-gate 		bzero(so_faddr, sizeof (so_faddr));
37457c478bd9Sstevel@tonic-gate 
37460f1702c5SYu Xiangning 		len = sizeof (so_laddr);
37470f1702c5SYu Xiangning 		(void) socket_getsockname(so, (struct sockaddr *)so_laddr,
37480f1702c5SYu Xiangning 		    &len, CRED());
37497c478bd9Sstevel@tonic-gate 		if (error) {
37507c478bd9Sstevel@tonic-gate 			if (uap->addr == NULL)
37517c478bd9Sstevel@tonic-gate 				break;
37527c478bd9Sstevel@tonic-gate 			if (uap->len <= 0)
37537c478bd9Sstevel@tonic-gate 				break;
37547c478bd9Sstevel@tonic-gate 			len = min(uap->len, sizeof (so_faddr));
37557c478bd9Sstevel@tonic-gate 			if (copyin((caddr_t)(uap->addr), so_faddr, len) != 0)
37567c478bd9Sstevel@tonic-gate 				break;
37577c478bd9Sstevel@tonic-gate #ifdef NOTYET
37587c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_data(AUP_HEX, AUR_CHAR, len, so_faddr));
37597c478bd9Sstevel@tonic-gate #endif
37607c478bd9Sstevel@tonic-gate 		} else {
37617c478bd9Sstevel@tonic-gate 			/* sanity check on length */
37620f1702c5SYu Xiangning 			len = sizeof (so_faddr);
37630f1702c5SYu Xiangning 			(void) socket_getpeername(so,
37640f1702c5SYu Xiangning 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
37657c478bd9Sstevel@tonic-gate 		}
37667c478bd9Sstevel@tonic-gate 
37677c478bd9Sstevel@tonic-gate 		add_sock_token = 1;
37687c478bd9Sstevel@tonic-gate 
37697c478bd9Sstevel@tonic-gate 		break;
37707c478bd9Sstevel@tonic-gate 
37717c478bd9Sstevel@tonic-gate 	case AF_UNIX:
37727c478bd9Sstevel@tonic-gate 		/* does a lookup on name */
37737c478bd9Sstevel@tonic-gate 		break;
37747c478bd9Sstevel@tonic-gate 
37757c478bd9Sstevel@tonic-gate 	default:
37767c478bd9Sstevel@tonic-gate 		/* AF_ROUTE, AF_KEY do not support accept */
37777c478bd9Sstevel@tonic-gate 		break;
37787c478bd9Sstevel@tonic-gate 	}
37797c478bd9Sstevel@tonic-gate 
37807c478bd9Sstevel@tonic-gate 	releasef(fd);
37817c478bd9Sstevel@tonic-gate 
37827c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
37837c478bd9Sstevel@tonic-gate 
37847c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
37857c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family)));
37867c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type)));
37877c478bd9Sstevel@tonic-gate 		return;
37887c478bd9Sstevel@tonic-gate 	}
37897c478bd9Sstevel@tonic-gate 
37907c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
37917c478bd9Sstevel@tonic-gate 
37927c478bd9Sstevel@tonic-gate }
37937c478bd9Sstevel@tonic-gate 
37947c478bd9Sstevel@tonic-gate /*ARGSUSED*/
37957c478bd9Sstevel@tonic-gate static void
37967c478bd9Sstevel@tonic-gate aus_shutdown(struct t_audit_data *tad)
37977c478bd9Sstevel@tonic-gate {
37987c478bd9Sstevel@tonic-gate 	struct a {
37997c478bd9Sstevel@tonic-gate 		long	fd;
38007c478bd9Sstevel@tonic-gate 		long	how;
38017c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
38027c478bd9Sstevel@tonic-gate 
38037c478bd9Sstevel@tonic-gate 	struct sonode *so;
38047c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
38057c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
38067c478bd9Sstevel@tonic-gate 	int err, fd;
38070f1702c5SYu Xiangning 	socklen_t len;
38087c478bd9Sstevel@tonic-gate 	short so_family, so_type;
38097c478bd9Sstevel@tonic-gate 	int add_sock_token = 0;
38107c478bd9Sstevel@tonic-gate 	file_t *fp;				/* unix domain sockets */
38117c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;		/* unix domain sockets */
38127c478bd9Sstevel@tonic-gate 
38137c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
38147c478bd9Sstevel@tonic-gate 
3815745b2690Stz 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
38167c478bd9Sstevel@tonic-gate 		/*
38177c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a shutdown using non socket
38187c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
38197c478bd9Sstevel@tonic-gate 		 * generation here.
38207c478bd9Sstevel@tonic-gate 		 */
38217c478bd9Sstevel@tonic-gate 		return;
38227c478bd9Sstevel@tonic-gate 	}
38237c478bd9Sstevel@tonic-gate 
38247c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
38257c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
38267c478bd9Sstevel@tonic-gate 
38277c478bd9Sstevel@tonic-gate 	switch (so_family) {
38287c478bd9Sstevel@tonic-gate 	case AF_INET:
38297c478bd9Sstevel@tonic-gate 	case AF_INET6:
38307c478bd9Sstevel@tonic-gate 
38317c478bd9Sstevel@tonic-gate 		bzero(so_laddr, sizeof (so_laddr));
38327c478bd9Sstevel@tonic-gate 		bzero(so_faddr, sizeof (so_faddr));
38337c478bd9Sstevel@tonic-gate 
38340f1702c5SYu Xiangning 		len = sizeof (so_laddr);
38350f1702c5SYu Xiangning 		(void) socket_getsockname(so,
38360f1702c5SYu Xiangning 		    (struct sockaddr *)so_laddr, &len, CRED());
38370f1702c5SYu Xiangning 		len = sizeof (so_faddr);
38380f1702c5SYu Xiangning 		(void) socket_getpeername(so,
38390f1702c5SYu Xiangning 		    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
38407c478bd9Sstevel@tonic-gate 
38417c478bd9Sstevel@tonic-gate 		add_sock_token = 1;
38427c478bd9Sstevel@tonic-gate 
38437c478bd9Sstevel@tonic-gate 		break;
38447c478bd9Sstevel@tonic-gate 
38457c478bd9Sstevel@tonic-gate 	case AF_UNIX:
38467c478bd9Sstevel@tonic-gate 
38477c478bd9Sstevel@tonic-gate 		/* get path from file struct here */
38487c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
38497c478bd9Sstevel@tonic-gate 		ASSERT(fad);
38507c478bd9Sstevel@tonic-gate 
38517c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
38527c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
38537c478bd9Sstevel@tonic-gate 		} else {
38547c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
38557c478bd9Sstevel@tonic-gate 		}
38567c478bd9Sstevel@tonic-gate 
38577c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
38587c478bd9Sstevel@tonic-gate 
38597c478bd9Sstevel@tonic-gate 		break;
38607c478bd9Sstevel@tonic-gate 
38617c478bd9Sstevel@tonic-gate 	default:
38627c478bd9Sstevel@tonic-gate 		/*
38637c478bd9Sstevel@tonic-gate 		 * AF_KEY and AF_ROUTE support shutdown. No socket token
38647c478bd9Sstevel@tonic-gate 		 * added.
38657c478bd9Sstevel@tonic-gate 		 */
38667c478bd9Sstevel@tonic-gate 		break;
38677c478bd9Sstevel@tonic-gate 	}
38687c478bd9Sstevel@tonic-gate 
38697c478bd9Sstevel@tonic-gate 	releasef(fd);
38707c478bd9Sstevel@tonic-gate 
38717c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
38727c478bd9Sstevel@tonic-gate 
38737c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
38747c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family)));
38757c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type)));
38767c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(2, "how", (uint32_t)(uap->how)));
38777c478bd9Sstevel@tonic-gate 		return;
38787c478bd9Sstevel@tonic-gate 	}
38797c478bd9Sstevel@tonic-gate 
38807c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "how", (uint32_t)(uap->how)));
38817c478bd9Sstevel@tonic-gate 
38827c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
38837c478bd9Sstevel@tonic-gate 
38847c478bd9Sstevel@tonic-gate }
38857c478bd9Sstevel@tonic-gate 
38867c478bd9Sstevel@tonic-gate /*ARGSUSED*/
38877c478bd9Sstevel@tonic-gate static void
38887c478bd9Sstevel@tonic-gate auf_setsockopt(struct t_audit_data *tad, int error, rval_t *rval)
38897c478bd9Sstevel@tonic-gate {
38907c478bd9Sstevel@tonic-gate 	struct a {
38917c478bd9Sstevel@tonic-gate 		long	fd;
38927c478bd9Sstevel@tonic-gate 		long	level;
38937c478bd9Sstevel@tonic-gate 		long	optname;
38947c478bd9Sstevel@tonic-gate 		long	*optval;
38957c478bd9Sstevel@tonic-gate 		long	optlen;
38967c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
38977c478bd9Sstevel@tonic-gate 
38987c478bd9Sstevel@tonic-gate 	struct sonode	*so;
38997c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
39007c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
39017c478bd9Sstevel@tonic-gate 	char		val[AU_BUFSIZE];
39027c478bd9Sstevel@tonic-gate 	int		err, fd;
39030f1702c5SYu Xiangning 	socklen_t	len;
39047c478bd9Sstevel@tonic-gate 	short so_family, so_type;
39057c478bd9Sstevel@tonic-gate 	int		add_sock_token = 0;
39067c478bd9Sstevel@tonic-gate 	file_t *fp;				/* unix domain sockets */
39077c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;		/* unix domain sockets */
39087c478bd9Sstevel@tonic-gate 
39097c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
39107c478bd9Sstevel@tonic-gate 
39117c478bd9Sstevel@tonic-gate 	if (error) {
39127c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
39137c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(2, "level", (uint32_t)uap->level));
39147c478bd9Sstevel@tonic-gate 		/* XXX may want to include other arguments */
39157c478bd9Sstevel@tonic-gate 		return;
39167c478bd9Sstevel@tonic-gate 	}
39177c478bd9Sstevel@tonic-gate 
3918745b2690Stz 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
39197c478bd9Sstevel@tonic-gate 		/*
39207c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a setsockopt from non socket
39217c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
39227c478bd9Sstevel@tonic-gate 		 * generation here.
39237c478bd9Sstevel@tonic-gate 		 */
39247c478bd9Sstevel@tonic-gate 		return;
39257c478bd9Sstevel@tonic-gate 	}
39267c478bd9Sstevel@tonic-gate 
39277c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
39287c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
39297c478bd9Sstevel@tonic-gate 
39307c478bd9Sstevel@tonic-gate 	switch (so_family) {
39317c478bd9Sstevel@tonic-gate 	case AF_INET:
39327c478bd9Sstevel@tonic-gate 	case AF_INET6:
39337c478bd9Sstevel@tonic-gate 		bzero((void *)so_laddr, sizeof (so_laddr));
39347c478bd9Sstevel@tonic-gate 		bzero((void *)so_faddr, sizeof (so_faddr));
39357c478bd9Sstevel@tonic-gate 
39367c478bd9Sstevel@tonic-gate 		/* get local and foreign addresses */
39370f1702c5SYu Xiangning 		len = sizeof (so_laddr);
39380f1702c5SYu Xiangning 		(void) socket_getsockname(so, (struct sockaddr *)so_laddr,
39390f1702c5SYu Xiangning 		    &len, CRED());
39400f1702c5SYu Xiangning 		len = sizeof (so_faddr);
39410f1702c5SYu Xiangning 		(void) socket_getpeername(so, (struct sockaddr *)so_faddr,
39420f1702c5SYu Xiangning 		    &len, B_FALSE, CRED());
39437c478bd9Sstevel@tonic-gate 
39447c478bd9Sstevel@tonic-gate 		add_sock_token = 1;
39457c478bd9Sstevel@tonic-gate 
39467c478bd9Sstevel@tonic-gate 		break;
39477c478bd9Sstevel@tonic-gate 
39487c478bd9Sstevel@tonic-gate 	case AF_UNIX:
39497c478bd9Sstevel@tonic-gate 
39507c478bd9Sstevel@tonic-gate 		/* get path from file struct here */
39517c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
39527c478bd9Sstevel@tonic-gate 		ASSERT(fad);
39537c478bd9Sstevel@tonic-gate 
39547c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
39557c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
39567c478bd9Sstevel@tonic-gate 		} else {
39577c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
39587c478bd9Sstevel@tonic-gate 		}
39597c478bd9Sstevel@tonic-gate 
39607c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
39617c478bd9Sstevel@tonic-gate 
39627c478bd9Sstevel@tonic-gate 		break;
39637c478bd9Sstevel@tonic-gate 
39647c478bd9Sstevel@tonic-gate 	default:
39657c478bd9Sstevel@tonic-gate 		/*
39667c478bd9Sstevel@tonic-gate 		 * AF_KEY and AF_ROUTE support setsockopt. No socket token
39677c478bd9Sstevel@tonic-gate 		 * added.
39687c478bd9Sstevel@tonic-gate 		 */
39697c478bd9Sstevel@tonic-gate 		break;
39707c478bd9Sstevel@tonic-gate 	}
39717c478bd9Sstevel@tonic-gate 
39727c478bd9Sstevel@tonic-gate 	releasef(fd);
39737c478bd9Sstevel@tonic-gate 
39747c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
39757c478bd9Sstevel@tonic-gate 
39767c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
39777c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family)));
39787c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type)));
39797c478bd9Sstevel@tonic-gate 	}
39807c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "level", (uint32_t)(uap->level)));
39817c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "optname", (uint32_t)(uap->optname)));
39827c478bd9Sstevel@tonic-gate 
39837c478bd9Sstevel@tonic-gate 	bzero(val, sizeof (val));
39847c478bd9Sstevel@tonic-gate 	len = min(uap->optlen, sizeof (val));
39857c478bd9Sstevel@tonic-gate 	if ((len > 0) &&
39867c478bd9Sstevel@tonic-gate 	    (copyin((caddr_t)(uap->optval), (caddr_t)val, len) == 0)) {
39877c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(5, "optlen", (uint32_t)(uap->optlen)));
39887c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_data(AUP_HEX, AUR_BYTE, len, val));
39897c478bd9Sstevel@tonic-gate 	}
39907c478bd9Sstevel@tonic-gate 
39917c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0)
39927c478bd9Sstevel@tonic-gate 		return;
39937c478bd9Sstevel@tonic-gate 
39947c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
39957c478bd9Sstevel@tonic-gate 
39967c478bd9Sstevel@tonic-gate }
39977c478bd9Sstevel@tonic-gate 
39987c478bd9Sstevel@tonic-gate /*ARGSUSED*/
39997c478bd9Sstevel@tonic-gate static void
40007c478bd9Sstevel@tonic-gate aus_sockconfig(tad)
40017c478bd9Sstevel@tonic-gate 	struct t_audit_data *tad;
40027c478bd9Sstevel@tonic-gate {
40037c478bd9Sstevel@tonic-gate 	struct a {
40043e95bd4aSAnders Persson 		long	cmd;
40053e95bd4aSAnders Persson 		long	arg1;
40063e95bd4aSAnders Persson 		long	arg2;
40073e95bd4aSAnders Persson 		long	arg3;
40083e95bd4aSAnders Persson 		long	arg4;
40097c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
40107c478bd9Sstevel@tonic-gate 
40113e95bd4aSAnders Persson 	char	*buf;
40123e95bd4aSAnders Persson 	int	buflen;
40137c478bd9Sstevel@tonic-gate 	size_t	size;
40147c478bd9Sstevel@tonic-gate 
40153e95bd4aSAnders Persson 	au_uwrite(au_to_arg32(1, "cmd", (uint_t)uap->cmd));
40163e95bd4aSAnders Persson 	switch (uap->cmd) {
40173e95bd4aSAnders Persson 	case SOCKCONFIG_ADD_SOCK:
40183e95bd4aSAnders Persson 	case SOCKCONFIG_REMOVE_SOCK:
40193e95bd4aSAnders Persson 		au_uwrite(au_to_arg32(2, "domain", (uint32_t)uap->arg1));
40203e95bd4aSAnders Persson 		au_uwrite(au_to_arg32(3, "type", (uint32_t)uap->arg2));
40213e95bd4aSAnders Persson 		au_uwrite(au_to_arg32(4, "protocol", (uint32_t)uap->arg3));
40227c478bd9Sstevel@tonic-gate 
40233e95bd4aSAnders Persson 		if (uap->arg4 == 0) {
40243e95bd4aSAnders Persson 			au_uwrite(au_to_arg32(5, "devpath", (uint32_t)0));
40253e95bd4aSAnders Persson 		} else {
40263e95bd4aSAnders Persson 			buflen = MAXPATHLEN + 1;
40273e95bd4aSAnders Persson 			buf = kmem_alloc(buflen, KM_SLEEP);
40283e95bd4aSAnders Persson 			if (copyinstr((caddr_t)uap->arg4, buf, buflen,
40293e95bd4aSAnders Persson 			    &size)) {
40303e95bd4aSAnders Persson 				kmem_free(buf, buflen);
40313e95bd4aSAnders Persson 				return;
40323e95bd4aSAnders Persson 			}
40337c478bd9Sstevel@tonic-gate 
40343e95bd4aSAnders Persson 			if (size > MAXPATHLEN) {
40353e95bd4aSAnders Persson 				kmem_free(buf, buflen);
40363e95bd4aSAnders Persson 				return;
40373e95bd4aSAnders Persson 			}
40383e95bd4aSAnders Persson 
40393e95bd4aSAnders Persson 			au_uwrite(au_to_text(buf));
40403e95bd4aSAnders Persson 			kmem_free(buf, buflen);
40417c478bd9Sstevel@tonic-gate 		}
40423e95bd4aSAnders Persson 		break;
40433e95bd4aSAnders Persson 	case SOCKCONFIG_ADD_FILTER:
40443e95bd4aSAnders Persson 	case SOCKCONFIG_REMOVE_FILTER:
40453e95bd4aSAnders Persson 		buflen = FILNAME_MAX;
40463e95bd4aSAnders Persson 		buf = kmem_alloc(buflen, KM_SLEEP);
40477c478bd9Sstevel@tonic-gate 
40483e95bd4aSAnders Persson 		if (copyinstr((caddr_t)uap->arg1, buf, buflen, &size)) {
40493e95bd4aSAnders Persson 			kmem_free(buf, buflen);
40507c478bd9Sstevel@tonic-gate 			return;
40517c478bd9Sstevel@tonic-gate 		}
40527c478bd9Sstevel@tonic-gate 
40533e95bd4aSAnders Persson 		au_uwrite(au_to_text(buf));
40543e95bd4aSAnders Persson 		kmem_free(buf, buflen);
40553e95bd4aSAnders Persson 		break;
40563e95bd4aSAnders Persson 	default:
40573e95bd4aSAnders Persson 		break;
40587c478bd9Sstevel@tonic-gate 	}
40597c478bd9Sstevel@tonic-gate }
40607c478bd9Sstevel@tonic-gate 
40617c478bd9Sstevel@tonic-gate /*
40627c478bd9Sstevel@tonic-gate  * only audit recvmsg when the system call represents the creation of a new
40637c478bd9Sstevel@tonic-gate  * circuit. This effectively occurs for all UDP packets and may occur for
40647c478bd9Sstevel@tonic-gate  * special TCP situations where the local host has not set a local address
40657c478bd9Sstevel@tonic-gate  * in the socket structure.
40667c478bd9Sstevel@tonic-gate  */
40677c478bd9Sstevel@tonic-gate /*ARGSUSED*/
40687c478bd9Sstevel@tonic-gate static void
40697c478bd9Sstevel@tonic-gate auf_recvmsg(
40707c478bd9Sstevel@tonic-gate 	struct t_audit_data *tad,
40717c478bd9Sstevel@tonic-gate 	int error,
40727c478bd9Sstevel@tonic-gate 	rval_t *rvp)
40737c478bd9Sstevel@tonic-gate {
40747c478bd9Sstevel@tonic-gate 	struct a {
40757c478bd9Sstevel@tonic-gate 		long	fd;
40767c478bd9Sstevel@tonic-gate 		long	msg;	/* struct msghdr */
40777c478bd9Sstevel@tonic-gate 		long	flags;
40787c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
40797c478bd9Sstevel@tonic-gate 
40807c478bd9Sstevel@tonic-gate 	struct sonode	*so;
40817c478bd9Sstevel@tonic-gate 	STRUCT_DECL(msghdr, msg);
40827c478bd9Sstevel@tonic-gate 	caddr_t msg_name;
40837c478bd9Sstevel@tonic-gate 	socklen_t msg_namelen;
40847c478bd9Sstevel@tonic-gate 	int fd;
40857c478bd9Sstevel@tonic-gate 	int err;
40867c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
40877c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
40880f1702c5SYu Xiangning 	socklen_t len;
40897c478bd9Sstevel@tonic-gate 	file_t *fp;				/* unix domain sockets */
40907c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;		/* unix domain sockets */
40917c478bd9Sstevel@tonic-gate 	short so_family, so_type;
40927c478bd9Sstevel@tonic-gate 	int add_sock_token = 0;
40939e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
40947c478bd9Sstevel@tonic-gate 
40957c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
40967c478bd9Sstevel@tonic-gate 
40977c478bd9Sstevel@tonic-gate 	/* bail if an error */
40987c478bd9Sstevel@tonic-gate 	if (error) {
40997c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
41007c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
41017c478bd9Sstevel@tonic-gate 		return;
41027c478bd9Sstevel@tonic-gate 	}
41037c478bd9Sstevel@tonic-gate 
4104745b2690Stz 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
41057c478bd9Sstevel@tonic-gate 		/*
41067c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a recvmsg from non socket
41077c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
41087c478bd9Sstevel@tonic-gate 		 * generation here.
41097c478bd9Sstevel@tonic-gate 		 */
41107c478bd9Sstevel@tonic-gate 		return;
41117c478bd9Sstevel@tonic-gate 	}
41127c478bd9Sstevel@tonic-gate 
41137c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
41147c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
41157c478bd9Sstevel@tonic-gate 
41167c478bd9Sstevel@tonic-gate 	/*
41177c478bd9Sstevel@tonic-gate 	 * only putout SOCKET_EX token if INET/INET6 family.
41187c478bd9Sstevel@tonic-gate 	 * XXX - what do we do about other families?
41197c478bd9Sstevel@tonic-gate 	 */
41207c478bd9Sstevel@tonic-gate 
41217c478bd9Sstevel@tonic-gate 	switch (so_family) {
41227c478bd9Sstevel@tonic-gate 	case AF_INET:
41237c478bd9Sstevel@tonic-gate 	case AF_INET6:
41247c478bd9Sstevel@tonic-gate 
41257c478bd9Sstevel@tonic-gate 		/*
41267c478bd9Sstevel@tonic-gate 		 * if datagram type socket, then just use what is in
41277c478bd9Sstevel@tonic-gate 		 * socket structure for local address.
41287c478bd9Sstevel@tonic-gate 		 * XXX - what do we do for other types?
41297c478bd9Sstevel@tonic-gate 		 */
41307c478bd9Sstevel@tonic-gate 		if ((so->so_type == SOCK_DGRAM) ||
41317c478bd9Sstevel@tonic-gate 		    (so->so_type == SOCK_RAW)) {
41327c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
41337c478bd9Sstevel@tonic-gate 
41347c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
41357c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
41367c478bd9Sstevel@tonic-gate 
41377c478bd9Sstevel@tonic-gate 			/* get local address */
41380f1702c5SYu Xiangning 			len = sizeof (so_laddr);
41390f1702c5SYu Xiangning 			(void) socket_getsockname(so,
41400f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
41417c478bd9Sstevel@tonic-gate 
41427c478bd9Sstevel@tonic-gate 			/* get peer address */
41437c478bd9Sstevel@tonic-gate 			STRUCT_INIT(msg, get_udatamodel());
41447c478bd9Sstevel@tonic-gate 
41457c478bd9Sstevel@tonic-gate 			if (copyin((caddr_t)(uap->msg),
41467c478bd9Sstevel@tonic-gate 			    (caddr_t)STRUCT_BUF(msg), STRUCT_SIZE(msg)) != 0) {
41477c478bd9Sstevel@tonic-gate 				break;
41487c478bd9Sstevel@tonic-gate 			}
41497c478bd9Sstevel@tonic-gate 			msg_name = (caddr_t)STRUCT_FGETP(msg, msg_name);
41507c478bd9Sstevel@tonic-gate 			if (msg_name == NULL) {
41517c478bd9Sstevel@tonic-gate 				break;
41527c478bd9Sstevel@tonic-gate 			}
41537c478bd9Sstevel@tonic-gate 
41547c478bd9Sstevel@tonic-gate 			/* length is value from recvmsg - sanity check */
41557c478bd9Sstevel@tonic-gate 			msg_namelen = (socklen_t)STRUCT_FGET(msg, msg_namelen);
41567c478bd9Sstevel@tonic-gate 			if (msg_namelen == 0) {
41577c478bd9Sstevel@tonic-gate 				break;
41587c478bd9Sstevel@tonic-gate 			}
41597c478bd9Sstevel@tonic-gate 			if (copyin(msg_name, so_faddr,
41607c478bd9Sstevel@tonic-gate 			    sizeof (so_faddr)) != 0) {
41617c478bd9Sstevel@tonic-gate 				break;
41627c478bd9Sstevel@tonic-gate 			}
41637c478bd9Sstevel@tonic-gate 
41647c478bd9Sstevel@tonic-gate 		} else if (so->so_type == SOCK_STREAM) {
41657c478bd9Sstevel@tonic-gate 
41667c478bd9Sstevel@tonic-gate 			/* get path from file struct here */
41677c478bd9Sstevel@tonic-gate 			fad = F2A(fp);
41687c478bd9Sstevel@tonic-gate 			ASSERT(fad);
41697c478bd9Sstevel@tonic-gate 
41707c478bd9Sstevel@tonic-gate 			/*
41717c478bd9Sstevel@tonic-gate 			 * already processed this file for read attempt
41727c478bd9Sstevel@tonic-gate 			 */
41737c478bd9Sstevel@tonic-gate 			if (fad->fad_flags & FAD_READ) {
41747c478bd9Sstevel@tonic-gate 				/* don't want to audit every recvmsg attempt */
41757c478bd9Sstevel@tonic-gate 				tad->tad_flag = 0;
41767c478bd9Sstevel@tonic-gate 				/* free any residual audit data */
4177005d3febSMarek Pospisil 				au_close(kctx, &(u_ad), 0, 0, 0, NULL);
41787c478bd9Sstevel@tonic-gate 				releasef(fd);
41797c478bd9Sstevel@tonic-gate 				return;
41807c478bd9Sstevel@tonic-gate 			}
41817c478bd9Sstevel@tonic-gate 			/*
41827c478bd9Sstevel@tonic-gate 			 * mark things so we know what happened and don't
41837c478bd9Sstevel@tonic-gate 			 * repeat things
41847c478bd9Sstevel@tonic-gate 			 */
41857c478bd9Sstevel@tonic-gate 			fad->fad_flags |= FAD_READ;
41867c478bd9Sstevel@tonic-gate 
41877c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
41887c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
41897c478bd9Sstevel@tonic-gate 
41900f1702c5SYu Xiangning 			/* get local and foreign addresses */
41910f1702c5SYu Xiangning 			len = sizeof (so_laddr);
41920f1702c5SYu Xiangning 			(void) socket_getsockname(so,
41930f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
41940f1702c5SYu Xiangning 			len = sizeof (so_faddr);
41950f1702c5SYu Xiangning 			(void) socket_getpeername(so,
41960f1702c5SYu Xiangning 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
41977c478bd9Sstevel@tonic-gate 
41987c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
41997c478bd9Sstevel@tonic-gate 		}
42007c478bd9Sstevel@tonic-gate 
42017c478bd9Sstevel@tonic-gate 		/* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */
42027c478bd9Sstevel@tonic-gate 
42037c478bd9Sstevel@tonic-gate 		break;
42047c478bd9Sstevel@tonic-gate 
42057c478bd9Sstevel@tonic-gate 	case AF_UNIX:
42067c478bd9Sstevel@tonic-gate 		/*
42077c478bd9Sstevel@tonic-gate 		 * first check if this is first time through. Too much
42087c478bd9Sstevel@tonic-gate 		 * duplicate code to put this in an aui_ routine.
42097c478bd9Sstevel@tonic-gate 		 */
42107c478bd9Sstevel@tonic-gate 
42117c478bd9Sstevel@tonic-gate 		/* get path from file struct here */
42127c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
42137c478bd9Sstevel@tonic-gate 		ASSERT(fad);
42147c478bd9Sstevel@tonic-gate 
42157c478bd9Sstevel@tonic-gate 		/*
42167c478bd9Sstevel@tonic-gate 		 * already processed this file for read attempt
42177c478bd9Sstevel@tonic-gate 		 */
42187c478bd9Sstevel@tonic-gate 		if (fad->fad_flags & FAD_READ) {
42197c478bd9Sstevel@tonic-gate 			releasef(fd);
42207c478bd9Sstevel@tonic-gate 			/* don't want to audit every recvmsg attempt */
42217c478bd9Sstevel@tonic-gate 			tad->tad_flag = 0;
42227c478bd9Sstevel@tonic-gate 			/* free any residual audit data */
4223005d3febSMarek Pospisil 			au_close(kctx, &(u_ad), 0, 0, 0, NULL);
42247c478bd9Sstevel@tonic-gate 			return;
42257c478bd9Sstevel@tonic-gate 		}
42267c478bd9Sstevel@tonic-gate 		/*
42277c478bd9Sstevel@tonic-gate 		 * mark things so we know what happened and don't
42287c478bd9Sstevel@tonic-gate 		 * repeat things
42297c478bd9Sstevel@tonic-gate 		 */
42307c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_READ;
42317c478bd9Sstevel@tonic-gate 
42327c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
42337c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
42347c478bd9Sstevel@tonic-gate 		} else {
42357c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
42367c478bd9Sstevel@tonic-gate 		}
42377c478bd9Sstevel@tonic-gate 
42387c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
42397c478bd9Sstevel@tonic-gate 
42407c478bd9Sstevel@tonic-gate 		releasef(fd);
42417c478bd9Sstevel@tonic-gate 
42427c478bd9Sstevel@tonic-gate 		return;
42437c478bd9Sstevel@tonic-gate 
42447c478bd9Sstevel@tonic-gate 	default:
42457c478bd9Sstevel@tonic-gate 		break;
42467c478bd9Sstevel@tonic-gate 
42477c478bd9Sstevel@tonic-gate 	}
42487c478bd9Sstevel@tonic-gate 
42497c478bd9Sstevel@tonic-gate 	releasef(fd);
42507c478bd9Sstevel@tonic-gate 
42517c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
42527c478bd9Sstevel@tonic-gate 
42537c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
42547c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
42557c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
42567c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
42577c478bd9Sstevel@tonic-gate 		return;
42587c478bd9Sstevel@tonic-gate 	}
42597c478bd9Sstevel@tonic-gate 
42607c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
42617c478bd9Sstevel@tonic-gate 
42627c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
42637c478bd9Sstevel@tonic-gate 
42647c478bd9Sstevel@tonic-gate }
42657c478bd9Sstevel@tonic-gate 
42667c478bd9Sstevel@tonic-gate /*ARGSUSED*/
42677c478bd9Sstevel@tonic-gate static void
42687c478bd9Sstevel@tonic-gate auf_recvfrom(
42697c478bd9Sstevel@tonic-gate 	struct t_audit_data *tad,
42707c478bd9Sstevel@tonic-gate 	int error,
42717c478bd9Sstevel@tonic-gate 	rval_t *rvp)
42727c478bd9Sstevel@tonic-gate {
42737c478bd9Sstevel@tonic-gate 
42747c478bd9Sstevel@tonic-gate 	struct a {
42757c478bd9Sstevel@tonic-gate 		long	fd;
42767c478bd9Sstevel@tonic-gate 		long	msg;	/* char */
42777c478bd9Sstevel@tonic-gate 		long	len;
42787c478bd9Sstevel@tonic-gate 		long	flags;
42797c478bd9Sstevel@tonic-gate 		long	from;	/* struct sockaddr */
42807c478bd9Sstevel@tonic-gate 		long	fromlen;
42817c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
42827c478bd9Sstevel@tonic-gate 
42837c478bd9Sstevel@tonic-gate 	socklen_t	fromlen;
42847c478bd9Sstevel@tonic-gate 	struct sonode	*so;
42857c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
42867c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
42877c478bd9Sstevel@tonic-gate 	int		fd;
42887c478bd9Sstevel@tonic-gate 	short so_family, so_type;
42897c478bd9Sstevel@tonic-gate 	int add_sock_token = 0;
42900f1702c5SYu Xiangning 	socklen_t len;
42917c478bd9Sstevel@tonic-gate 	int err;
42927c478bd9Sstevel@tonic-gate 	struct file *fp;
42937c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;		/* unix domain sockets */
42949e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
42957c478bd9Sstevel@tonic-gate 
42967c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
42977c478bd9Sstevel@tonic-gate 
42987c478bd9Sstevel@tonic-gate 	/* bail if an error */
42997c478bd9Sstevel@tonic-gate 	if (error) {
43007c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
43017c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
43027c478bd9Sstevel@tonic-gate 		return;
43037c478bd9Sstevel@tonic-gate 	}
43047c478bd9Sstevel@tonic-gate 
4305745b2690Stz 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
43067c478bd9Sstevel@tonic-gate 		/*
43077c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a recvmsg from non socket
43087c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
43097c478bd9Sstevel@tonic-gate 		 * generation here.
43107c478bd9Sstevel@tonic-gate 		 */
43117c478bd9Sstevel@tonic-gate 		return;
43127c478bd9Sstevel@tonic-gate 	}
43137c478bd9Sstevel@tonic-gate 
43147c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
43157c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
43167c478bd9Sstevel@tonic-gate 
43177c478bd9Sstevel@tonic-gate 	/*
43187c478bd9Sstevel@tonic-gate 	 * only putout SOCKET_EX token if INET/INET6 family.
43197c478bd9Sstevel@tonic-gate 	 * XXX - what do we do about other families?
43207c478bd9Sstevel@tonic-gate 	 */
43217c478bd9Sstevel@tonic-gate 
43227c478bd9Sstevel@tonic-gate 	switch (so_family) {
43237c478bd9Sstevel@tonic-gate 	case AF_INET:
43247c478bd9Sstevel@tonic-gate 	case AF_INET6:
43257c478bd9Sstevel@tonic-gate 
43267c478bd9Sstevel@tonic-gate 		/*
43277c478bd9Sstevel@tonic-gate 		 * if datagram type socket, then just use what is in
43287c478bd9Sstevel@tonic-gate 		 * socket structure for local address.
43297c478bd9Sstevel@tonic-gate 		 * XXX - what do we do for other types?
43307c478bd9Sstevel@tonic-gate 		 */
43317c478bd9Sstevel@tonic-gate 		if ((so->so_type == SOCK_DGRAM) ||
43327c478bd9Sstevel@tonic-gate 		    (so->so_type == SOCK_RAW)) {
43337c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
43347c478bd9Sstevel@tonic-gate 
43357c478bd9Sstevel@tonic-gate 			/* get local address */
43360f1702c5SYu Xiangning 			len = sizeof (so_laddr);
43370f1702c5SYu Xiangning 			(void) socket_getsockname(so,
43380f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
43397c478bd9Sstevel@tonic-gate 
43407c478bd9Sstevel@tonic-gate 			/* get peer address */
43417c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
43427c478bd9Sstevel@tonic-gate 
43437c478bd9Sstevel@tonic-gate 			/* sanity check */
43447c478bd9Sstevel@tonic-gate 			if (uap->from == NULL)
43457c478bd9Sstevel@tonic-gate 				break;
43467c478bd9Sstevel@tonic-gate 
43477c478bd9Sstevel@tonic-gate 			/* sanity checks */
43487c478bd9Sstevel@tonic-gate 			if (uap->fromlen == 0)
43497c478bd9Sstevel@tonic-gate 				break;
43507c478bd9Sstevel@tonic-gate 
43517c478bd9Sstevel@tonic-gate 			if (copyin((caddr_t)(uap->fromlen), (caddr_t)&fromlen,
43527c478bd9Sstevel@tonic-gate 			    sizeof (fromlen)) != 0)
43537c478bd9Sstevel@tonic-gate 				break;
43547c478bd9Sstevel@tonic-gate 
43557c478bd9Sstevel@tonic-gate 			if (fromlen == 0)
43567c478bd9Sstevel@tonic-gate 				break;
43577c478bd9Sstevel@tonic-gate 
43587c478bd9Sstevel@tonic-gate 			/* enforce maximum size */
43597c478bd9Sstevel@tonic-gate 			if (fromlen > sizeof (so_faddr))
43607c478bd9Sstevel@tonic-gate 				fromlen = sizeof (so_faddr);
43617c478bd9Sstevel@tonic-gate 
43627c478bd9Sstevel@tonic-gate 			if (copyin((caddr_t)(uap->from), so_faddr,
43637c478bd9Sstevel@tonic-gate 			    fromlen) != 0)
43647c478bd9Sstevel@tonic-gate 				break;
43657c478bd9Sstevel@tonic-gate 
43667c478bd9Sstevel@tonic-gate 		} else if (so->so_type == SOCK_STREAM) {
43677c478bd9Sstevel@tonic-gate 
43687c478bd9Sstevel@tonic-gate 			/* get path from file struct here */
43697c478bd9Sstevel@tonic-gate 			fad = F2A(fp);
43707c478bd9Sstevel@tonic-gate 			ASSERT(fad);
43717c478bd9Sstevel@tonic-gate 
43727c478bd9Sstevel@tonic-gate 			/*
43737c478bd9Sstevel@tonic-gate 			 * already processed this file for read attempt
43747c478bd9Sstevel@tonic-gate 			 */
43757c478bd9Sstevel@tonic-gate 			if (fad->fad_flags & FAD_READ) {
43767c478bd9Sstevel@tonic-gate 				/* don't want to audit every recvfrom attempt */
43777c478bd9Sstevel@tonic-gate 				tad->tad_flag = 0;
43787c478bd9Sstevel@tonic-gate 				/* free any residual audit data */
4379005d3febSMarek Pospisil 				au_close(kctx, &(u_ad), 0, 0, 0, NULL);
43807c478bd9Sstevel@tonic-gate 				releasef(fd);
43817c478bd9Sstevel@tonic-gate 				return;
43827c478bd9Sstevel@tonic-gate 			}
43837c478bd9Sstevel@tonic-gate 			/*
43847c478bd9Sstevel@tonic-gate 			 * mark things so we know what happened and don't
43857c478bd9Sstevel@tonic-gate 			 * repeat things
43867c478bd9Sstevel@tonic-gate 			 */
43877c478bd9Sstevel@tonic-gate 			fad->fad_flags |= FAD_READ;
43887c478bd9Sstevel@tonic-gate 
43897c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
43907c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
43917c478bd9Sstevel@tonic-gate 
43920f1702c5SYu Xiangning 			/* get local and foreign addresses */
43930f1702c5SYu Xiangning 			len = sizeof (so_laddr);
43940f1702c5SYu Xiangning 			(void) socket_getsockname(so,
43950f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
43960f1702c5SYu Xiangning 			len = sizeof (so_faddr);
43970f1702c5SYu Xiangning 			(void) socket_getpeername(so,
43980f1702c5SYu Xiangning 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
43997c478bd9Sstevel@tonic-gate 
44007c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
44017c478bd9Sstevel@tonic-gate 		}
44027c478bd9Sstevel@tonic-gate 
44037c478bd9Sstevel@tonic-gate 		/* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */
44047c478bd9Sstevel@tonic-gate 
44057c478bd9Sstevel@tonic-gate 		break;
44067c478bd9Sstevel@tonic-gate 
44077c478bd9Sstevel@tonic-gate 	case AF_UNIX:
44087c478bd9Sstevel@tonic-gate 		/*
44097c478bd9Sstevel@tonic-gate 		 * first check if this is first time through. Too much
44107c478bd9Sstevel@tonic-gate 		 * duplicate code to put this in an aui_ routine.
44117c478bd9Sstevel@tonic-gate 		 */
44127c478bd9Sstevel@tonic-gate 
44137c478bd9Sstevel@tonic-gate 		/* get path from file struct here */
44147c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
44157c478bd9Sstevel@tonic-gate 		ASSERT(fad);
44167c478bd9Sstevel@tonic-gate 
44177c478bd9Sstevel@tonic-gate 		/*
44187c478bd9Sstevel@tonic-gate 		 * already processed this file for read attempt
44197c478bd9Sstevel@tonic-gate 		 */
44207c478bd9Sstevel@tonic-gate 		if (fad->fad_flags & FAD_READ) {
44217c478bd9Sstevel@tonic-gate 			/* don't want to audit every recvfrom attempt */
44227c478bd9Sstevel@tonic-gate 			tad->tad_flag = 0;
44237c478bd9Sstevel@tonic-gate 			/* free any residual audit data */
4424005d3febSMarek Pospisil 			au_close(kctx, &(u_ad), 0, 0, 0, NULL);
44257c478bd9Sstevel@tonic-gate 			releasef(fd);
44267c478bd9Sstevel@tonic-gate 			return;
44277c478bd9Sstevel@tonic-gate 		}
44287c478bd9Sstevel@tonic-gate 		/*
44297c478bd9Sstevel@tonic-gate 		 * mark things so we know what happened and don't
44307c478bd9Sstevel@tonic-gate 		 * repeat things
44317c478bd9Sstevel@tonic-gate 		 */
44327c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_READ;
44337c478bd9Sstevel@tonic-gate 
44347c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
44357c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
44367c478bd9Sstevel@tonic-gate 		} else {
44377c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
44387c478bd9Sstevel@tonic-gate 		}
44397c478bd9Sstevel@tonic-gate 
44407c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
44417c478bd9Sstevel@tonic-gate 
44427c478bd9Sstevel@tonic-gate 		releasef(fd);
44437c478bd9Sstevel@tonic-gate 
44447c478bd9Sstevel@tonic-gate 		return;
44457c478bd9Sstevel@tonic-gate 
44467c478bd9Sstevel@tonic-gate 	default:
44477c478bd9Sstevel@tonic-gate 		break;
44487c478bd9Sstevel@tonic-gate 
44497c478bd9Sstevel@tonic-gate 	}
44507c478bd9Sstevel@tonic-gate 
44517c478bd9Sstevel@tonic-gate 	releasef(fd);
44527c478bd9Sstevel@tonic-gate 
44537c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
44547c478bd9Sstevel@tonic-gate 
44557c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
44567c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
44577c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
44587c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
44597c478bd9Sstevel@tonic-gate 		return;
44607c478bd9Sstevel@tonic-gate 	}
44617c478bd9Sstevel@tonic-gate 
44627c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
44637c478bd9Sstevel@tonic-gate 
44647c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
44657c478bd9Sstevel@tonic-gate }
44667c478bd9Sstevel@tonic-gate 
44677c478bd9Sstevel@tonic-gate /*ARGSUSED*/
44687c478bd9Sstevel@tonic-gate static void
44697c478bd9Sstevel@tonic-gate auf_sendmsg(struct t_audit_data *tad, int error, rval_t *rval)
44707c478bd9Sstevel@tonic-gate {
44717c478bd9Sstevel@tonic-gate 	struct a {
44727c478bd9Sstevel@tonic-gate 		long	fd;
44737c478bd9Sstevel@tonic-gate 		long	msg;	/* struct msghdr */
44747c478bd9Sstevel@tonic-gate 		long	flags;
44757c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
44767c478bd9Sstevel@tonic-gate 
44777c478bd9Sstevel@tonic-gate 	struct sonode	*so;
44787c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
44797c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
44807c478bd9Sstevel@tonic-gate 	int		err;
44817c478bd9Sstevel@tonic-gate 	int		fd;
44827c478bd9Sstevel@tonic-gate 	short so_family, so_type;
44837c478bd9Sstevel@tonic-gate 	int		add_sock_token = 0;
44840f1702c5SYu Xiangning 	socklen_t	len;
44857c478bd9Sstevel@tonic-gate 	struct file	*fp;
44867c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
44877c478bd9Sstevel@tonic-gate 	caddr_t		msg_name;
44887c478bd9Sstevel@tonic-gate 	socklen_t	msg_namelen;
44897c478bd9Sstevel@tonic-gate 	STRUCT_DECL(msghdr, msg);
44909e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
44917c478bd9Sstevel@tonic-gate 
44927c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
44937c478bd9Sstevel@tonic-gate 
44947c478bd9Sstevel@tonic-gate 	/* bail if an error */
44957c478bd9Sstevel@tonic-gate 	if (error) {
44967c478bd9Sstevel@tonic-gate 		/* XXX include destination address from system call arguments */
44977c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
44987c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
44997c478bd9Sstevel@tonic-gate 		return;
45007c478bd9Sstevel@tonic-gate 	}
45017c478bd9Sstevel@tonic-gate 
4502745b2690Stz 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
45037c478bd9Sstevel@tonic-gate 		/*
45047c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a sendmsg from non socket
45057c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
45067c478bd9Sstevel@tonic-gate 		 * generation here.
45077c478bd9Sstevel@tonic-gate 		 */
45087c478bd9Sstevel@tonic-gate 		return;
45097c478bd9Sstevel@tonic-gate 	}
45107c478bd9Sstevel@tonic-gate 
45117c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
45127c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
45137c478bd9Sstevel@tonic-gate 
45147c478bd9Sstevel@tonic-gate 	switch (so_family) {
45157c478bd9Sstevel@tonic-gate 	case AF_INET:
45167c478bd9Sstevel@tonic-gate 	case AF_INET6:
45177c478bd9Sstevel@tonic-gate 		/*
45187c478bd9Sstevel@tonic-gate 		 * if datagram type socket, then just use what is in
45197c478bd9Sstevel@tonic-gate 		 * socket structure for local address.
45207c478bd9Sstevel@tonic-gate 		 * XXX - what do we do for other types?
45217c478bd9Sstevel@tonic-gate 		 */
45227c478bd9Sstevel@tonic-gate 		if ((so->so_type == SOCK_DGRAM) ||
45237c478bd9Sstevel@tonic-gate 		    (so->so_type == SOCK_RAW)) {
45247c478bd9Sstevel@tonic-gate 
45257c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
45267c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
45277c478bd9Sstevel@tonic-gate 
45287c478bd9Sstevel@tonic-gate 			/* get local address */
45290f1702c5SYu Xiangning 			len = sizeof (so_laddr);
45300f1702c5SYu Xiangning 			(void) socket_getsockname(so,
45310f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
45327c478bd9Sstevel@tonic-gate 
45337c478bd9Sstevel@tonic-gate 			/* get peer address */
45347c478bd9Sstevel@tonic-gate 			STRUCT_INIT(msg, get_udatamodel());
45357c478bd9Sstevel@tonic-gate 
45367c478bd9Sstevel@tonic-gate 			if (copyin((caddr_t)(uap->msg),
45377c478bd9Sstevel@tonic-gate 			    (caddr_t)STRUCT_BUF(msg), STRUCT_SIZE(msg)) != 0) {
45387c478bd9Sstevel@tonic-gate 				break;
45397c478bd9Sstevel@tonic-gate 			}
45407c478bd9Sstevel@tonic-gate 			msg_name = (caddr_t)STRUCT_FGETP(msg, msg_name);
45417c478bd9Sstevel@tonic-gate 			if (msg_name == NULL)
45427c478bd9Sstevel@tonic-gate 				break;
45437c478bd9Sstevel@tonic-gate 
45447c478bd9Sstevel@tonic-gate 			msg_namelen = (socklen_t)STRUCT_FGET(msg, msg_namelen);
45457c478bd9Sstevel@tonic-gate 			/* length is value from recvmsg - sanity check */
45467c478bd9Sstevel@tonic-gate 			if (msg_namelen == 0)
45477c478bd9Sstevel@tonic-gate 				break;
45487c478bd9Sstevel@tonic-gate 
45497c478bd9Sstevel@tonic-gate 			if (copyin(msg_name, so_faddr,
45507c478bd9Sstevel@tonic-gate 			    sizeof (so_faddr)) != 0)
45517c478bd9Sstevel@tonic-gate 				break;
45527c478bd9Sstevel@tonic-gate 
45537c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
45547c478bd9Sstevel@tonic-gate 
45557c478bd9Sstevel@tonic-gate 		} else if (so->so_type == SOCK_STREAM) {
45567c478bd9Sstevel@tonic-gate 
45577c478bd9Sstevel@tonic-gate 			/* get path from file struct here */
45587c478bd9Sstevel@tonic-gate 			fad = F2A(fp);
45597c478bd9Sstevel@tonic-gate 			ASSERT(fad);
45607c478bd9Sstevel@tonic-gate 
45617c478bd9Sstevel@tonic-gate 			/*
45627c478bd9Sstevel@tonic-gate 			 * already processed this file for write attempt
45637c478bd9Sstevel@tonic-gate 			 */
45647c478bd9Sstevel@tonic-gate 			if (fad->fad_flags & FAD_WRITE) {
45657c478bd9Sstevel@tonic-gate 				releasef(fd);
45667c478bd9Sstevel@tonic-gate 				/* don't want to audit every sendmsg attempt */
45677c478bd9Sstevel@tonic-gate 				tad->tad_flag = 0;
45687c478bd9Sstevel@tonic-gate 				/* free any residual audit data */
4569005d3febSMarek Pospisil 				au_close(kctx, &(u_ad), 0, 0, 0, NULL);
45707c478bd9Sstevel@tonic-gate 				return;
45717c478bd9Sstevel@tonic-gate 			}
45727c478bd9Sstevel@tonic-gate 
45737c478bd9Sstevel@tonic-gate 			/*
45747c478bd9Sstevel@tonic-gate 			 * mark things so we know what happened and don't
45757c478bd9Sstevel@tonic-gate 			 * repeat things
45767c478bd9Sstevel@tonic-gate 			 */
45777c478bd9Sstevel@tonic-gate 			fad->fad_flags |= FAD_WRITE;
45787c478bd9Sstevel@tonic-gate 
45797c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
45807c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
45817c478bd9Sstevel@tonic-gate 
45820f1702c5SYu Xiangning 			/* get local and foreign addresses */
45830f1702c5SYu Xiangning 			len = sizeof (so_laddr);
45840f1702c5SYu Xiangning 			(void) socket_getsockname(so,
45850f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
45860f1702c5SYu Xiangning 			len = sizeof (so_faddr);
45870f1702c5SYu Xiangning 			(void) socket_getpeername(so,
45880f1702c5SYu Xiangning 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
45897c478bd9Sstevel@tonic-gate 
45907c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
45917c478bd9Sstevel@tonic-gate 		}
45927c478bd9Sstevel@tonic-gate 
45937c478bd9Sstevel@tonic-gate 		/* XXX - what about SOCK_RAW/SOCK_RDM/SOCK_SEQPACKET ??? */
45947c478bd9Sstevel@tonic-gate 
45957c478bd9Sstevel@tonic-gate 		break;
45967c478bd9Sstevel@tonic-gate 
45977c478bd9Sstevel@tonic-gate 	case AF_UNIX:
45987c478bd9Sstevel@tonic-gate 		/*
45997c478bd9Sstevel@tonic-gate 		 * first check if this is first time through. Too much
46007c478bd9Sstevel@tonic-gate 		 * duplicate code to put this in an aui_ routine.
46017c478bd9Sstevel@tonic-gate 		 */
46027c478bd9Sstevel@tonic-gate 
46037c478bd9Sstevel@tonic-gate 		/* get path from file struct here */
46047c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
46057c478bd9Sstevel@tonic-gate 		ASSERT(fad);
46067c478bd9Sstevel@tonic-gate 
46077c478bd9Sstevel@tonic-gate 		/*
46087c478bd9Sstevel@tonic-gate 		 * already processed this file for write attempt
46097c478bd9Sstevel@tonic-gate 		 */
46107c478bd9Sstevel@tonic-gate 		if (fad->fad_flags & FAD_WRITE) {
46117c478bd9Sstevel@tonic-gate 			releasef(fd);
46127c478bd9Sstevel@tonic-gate 			/* don't want to audit every sendmsg attempt */
46137c478bd9Sstevel@tonic-gate 			tad->tad_flag = 0;
46147c478bd9Sstevel@tonic-gate 			/* free any residual audit data */
4615005d3febSMarek Pospisil 			au_close(kctx, &(u_ad), 0, 0, 0, NULL);
46167c478bd9Sstevel@tonic-gate 			return;
46177c478bd9Sstevel@tonic-gate 		}
46187c478bd9Sstevel@tonic-gate 		/*
46197c478bd9Sstevel@tonic-gate 		 * mark things so we know what happened and don't
46207c478bd9Sstevel@tonic-gate 		 * repeat things
46217c478bd9Sstevel@tonic-gate 		 */
46227c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_WRITE;
46237c478bd9Sstevel@tonic-gate 
46247c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
46257c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
46267c478bd9Sstevel@tonic-gate 		} else {
46277c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
46287c478bd9Sstevel@tonic-gate 		}
46297c478bd9Sstevel@tonic-gate 
46307c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
46317c478bd9Sstevel@tonic-gate 
46327c478bd9Sstevel@tonic-gate 		releasef(fd);
46337c478bd9Sstevel@tonic-gate 
46347c478bd9Sstevel@tonic-gate 		return;
46357c478bd9Sstevel@tonic-gate 
46367c478bd9Sstevel@tonic-gate 	default:
46377c478bd9Sstevel@tonic-gate 		break;
46387c478bd9Sstevel@tonic-gate 	}
46397c478bd9Sstevel@tonic-gate 
46407c478bd9Sstevel@tonic-gate 	releasef(fd);
46417c478bd9Sstevel@tonic-gate 
46427c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
46437c478bd9Sstevel@tonic-gate 
46447c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
46457c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
46467c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
46477c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
46487c478bd9Sstevel@tonic-gate 		return;
46497c478bd9Sstevel@tonic-gate 	}
46507c478bd9Sstevel@tonic-gate 
46517c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
46527c478bd9Sstevel@tonic-gate 
46537c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
46547c478bd9Sstevel@tonic-gate }
46557c478bd9Sstevel@tonic-gate 
46567c478bd9Sstevel@tonic-gate /*ARGSUSED*/
46577c478bd9Sstevel@tonic-gate static void
46587c478bd9Sstevel@tonic-gate auf_sendto(struct t_audit_data *tad, int error, rval_t *rval)
46597c478bd9Sstevel@tonic-gate {
46607c478bd9Sstevel@tonic-gate 	struct a {
46617c478bd9Sstevel@tonic-gate 		long	fd;
46627c478bd9Sstevel@tonic-gate 		long	msg;	/* char */
46637c478bd9Sstevel@tonic-gate 		long	len;
46647c478bd9Sstevel@tonic-gate 		long	flags;
46657c478bd9Sstevel@tonic-gate 		long	to;	/* struct sockaddr */
46667c478bd9Sstevel@tonic-gate 		long	tolen;
46677c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
46687c478bd9Sstevel@tonic-gate 
46697c478bd9Sstevel@tonic-gate 	struct sonode	*so;
46707c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
46717c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
46727c478bd9Sstevel@tonic-gate 	socklen_t	tolen;
46737c478bd9Sstevel@tonic-gate 	int		err;
46747c478bd9Sstevel@tonic-gate 	int		fd;
46750f1702c5SYu Xiangning 	socklen_t	len;
46767c478bd9Sstevel@tonic-gate 	short so_family, so_type;
46777c478bd9Sstevel@tonic-gate 	int		add_sock_token = 0;
46787c478bd9Sstevel@tonic-gate 	struct file	*fp;
46797c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
46809e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
46817c478bd9Sstevel@tonic-gate 
46827c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
46837c478bd9Sstevel@tonic-gate 
46847c478bd9Sstevel@tonic-gate 	/* bail if an error */
46857c478bd9Sstevel@tonic-gate 	if (error) {
46867c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
46877c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
46887c478bd9Sstevel@tonic-gate 		/* XXX include destination address from system call arguments */
46897c478bd9Sstevel@tonic-gate 		return;
46907c478bd9Sstevel@tonic-gate 	}
46917c478bd9Sstevel@tonic-gate 
4692745b2690Stz 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
46937c478bd9Sstevel@tonic-gate 		/*
46947c478bd9Sstevel@tonic-gate 		 * not security relevant if doing a sendto using non socket
46957c478bd9Sstevel@tonic-gate 		 * so no extra tokens. Should probably turn off audit record
46967c478bd9Sstevel@tonic-gate 		 * generation here.
46977c478bd9Sstevel@tonic-gate 		 */
46987c478bd9Sstevel@tonic-gate 		return;
46997c478bd9Sstevel@tonic-gate 	}
47007c478bd9Sstevel@tonic-gate 
47017c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
47027c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
47037c478bd9Sstevel@tonic-gate 
47047c478bd9Sstevel@tonic-gate 	/*
47057c478bd9Sstevel@tonic-gate 	 * only putout SOCKET_EX token if INET/INET6 family.
47067c478bd9Sstevel@tonic-gate 	 * XXX - what do we do about other families?
47077c478bd9Sstevel@tonic-gate 	 */
47087c478bd9Sstevel@tonic-gate 
47097c478bd9Sstevel@tonic-gate 	switch (so_family) {
47107c478bd9Sstevel@tonic-gate 	case AF_INET:
47117c478bd9Sstevel@tonic-gate 	case AF_INET6:
47127c478bd9Sstevel@tonic-gate 
47137c478bd9Sstevel@tonic-gate 		/*
47147c478bd9Sstevel@tonic-gate 		 * if datagram type socket, then just use what is in
47157c478bd9Sstevel@tonic-gate 		 * socket structure for local address.
47167c478bd9Sstevel@tonic-gate 		 * XXX - what do we do for other types?
47177c478bd9Sstevel@tonic-gate 		 */
47187c478bd9Sstevel@tonic-gate 		if ((so->so_type == SOCK_DGRAM) ||
47197c478bd9Sstevel@tonic-gate 		    (so->so_type == SOCK_RAW)) {
47207c478bd9Sstevel@tonic-gate 
47217c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
47227c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
47237c478bd9Sstevel@tonic-gate 
47247c478bd9Sstevel@tonic-gate 			/* get local address */
47250f1702c5SYu Xiangning 			len = sizeof (so_laddr);
47260f1702c5SYu Xiangning 			(void) socket_getsockname(so,
47270f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
47287c478bd9Sstevel@tonic-gate 
47297c478bd9Sstevel@tonic-gate 			/* get peer address */
47307c478bd9Sstevel@tonic-gate 
47317c478bd9Sstevel@tonic-gate 			/* sanity check */
47327c478bd9Sstevel@tonic-gate 			if (uap->to == NULL)
47337c478bd9Sstevel@tonic-gate 				break;
47347c478bd9Sstevel@tonic-gate 
47357c478bd9Sstevel@tonic-gate 			/* sanity checks */
47367c478bd9Sstevel@tonic-gate 			if (uap->tolen == 0)
47377c478bd9Sstevel@tonic-gate 				break;
47387c478bd9Sstevel@tonic-gate 
47397c478bd9Sstevel@tonic-gate 			tolen = (socklen_t)uap->tolen;
47407c478bd9Sstevel@tonic-gate 
47417c478bd9Sstevel@tonic-gate 			/* enforce maximum size */
47427c478bd9Sstevel@tonic-gate 			if (tolen > sizeof (so_faddr))
47437c478bd9Sstevel@tonic-gate 				tolen = sizeof (so_faddr);
47447c478bd9Sstevel@tonic-gate 
47457c478bd9Sstevel@tonic-gate 			if (copyin((caddr_t)(uap->to), so_faddr, tolen) != 0)
47467c478bd9Sstevel@tonic-gate 				break;
47477c478bd9Sstevel@tonic-gate 
47487c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
47497c478bd9Sstevel@tonic-gate 		} else {
47507c478bd9Sstevel@tonic-gate 			/*
47517c478bd9Sstevel@tonic-gate 			 * check if this is first time through.
47527c478bd9Sstevel@tonic-gate 			 */
47537c478bd9Sstevel@tonic-gate 
47547c478bd9Sstevel@tonic-gate 			/* get path from file struct here */
47557c478bd9Sstevel@tonic-gate 			fad = F2A(fp);
47567c478bd9Sstevel@tonic-gate 			ASSERT(fad);
47577c478bd9Sstevel@tonic-gate 
47587c478bd9Sstevel@tonic-gate 			/*
47597c478bd9Sstevel@tonic-gate 			 * already processed this file for write attempt
47607c478bd9Sstevel@tonic-gate 			 */
47617c478bd9Sstevel@tonic-gate 			if (fad->fad_flags & FAD_WRITE) {
47627c478bd9Sstevel@tonic-gate 				/* don't want to audit every sendto attempt */
47637c478bd9Sstevel@tonic-gate 				tad->tad_flag = 0;
47647c478bd9Sstevel@tonic-gate 				/* free any residual audit data */
4765005d3febSMarek Pospisil 				au_close(kctx, &(u_ad), 0, 0, 0, NULL);
47667c478bd9Sstevel@tonic-gate 				releasef(fd);
47677c478bd9Sstevel@tonic-gate 				return;
47687c478bd9Sstevel@tonic-gate 			}
47697c478bd9Sstevel@tonic-gate 			/*
47707c478bd9Sstevel@tonic-gate 			 * mark things so we know what happened and don't
47717c478bd9Sstevel@tonic-gate 			 * repeat things
47727c478bd9Sstevel@tonic-gate 			 */
47737c478bd9Sstevel@tonic-gate 			fad->fad_flags |= FAD_WRITE;
47747c478bd9Sstevel@tonic-gate 
47757c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
47767c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
47777c478bd9Sstevel@tonic-gate 
47780f1702c5SYu Xiangning 			/* get local and foreign addresses */
47790f1702c5SYu Xiangning 			len = sizeof (so_laddr);
47800f1702c5SYu Xiangning 			(void) socket_getsockname(so,
47810f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
47820f1702c5SYu Xiangning 			len = sizeof (so_faddr);
47830f1702c5SYu Xiangning 			(void) socket_getpeername(so,
47840f1702c5SYu Xiangning 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
47857c478bd9Sstevel@tonic-gate 
47867c478bd9Sstevel@tonic-gate 			add_sock_token = 1;
47877c478bd9Sstevel@tonic-gate 		}
47887c478bd9Sstevel@tonic-gate 
47897c478bd9Sstevel@tonic-gate 		/* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */
47907c478bd9Sstevel@tonic-gate 
47917c478bd9Sstevel@tonic-gate 		break;
47927c478bd9Sstevel@tonic-gate 
47937c478bd9Sstevel@tonic-gate 	case AF_UNIX:
47947c478bd9Sstevel@tonic-gate 		/*
47957c478bd9Sstevel@tonic-gate 		 * first check if this is first time through. Too much
47967c478bd9Sstevel@tonic-gate 		 * duplicate code to put this in an aui_ routine.
47977c478bd9Sstevel@tonic-gate 		 */
47987c478bd9Sstevel@tonic-gate 
47997c478bd9Sstevel@tonic-gate 		/* get path from file struct here */
48007c478bd9Sstevel@tonic-gate 		fad = F2A(fp);
48017c478bd9Sstevel@tonic-gate 		ASSERT(fad);
48027c478bd9Sstevel@tonic-gate 
48037c478bd9Sstevel@tonic-gate 		/*
48047c478bd9Sstevel@tonic-gate 		 * already processed this file for write attempt
48057c478bd9Sstevel@tonic-gate 		 */
48067c478bd9Sstevel@tonic-gate 		if (fad->fad_flags & FAD_WRITE) {
48077c478bd9Sstevel@tonic-gate 			/* don't want to audit every sendto attempt */
48087c478bd9Sstevel@tonic-gate 			tad->tad_flag = 0;
48097c478bd9Sstevel@tonic-gate 			/* free any residual audit data */
4810005d3febSMarek Pospisil 			au_close(kctx, &(u_ad), 0, 0, 0, NULL);
48117c478bd9Sstevel@tonic-gate 			releasef(fd);
48127c478bd9Sstevel@tonic-gate 			return;
48137c478bd9Sstevel@tonic-gate 		}
48147c478bd9Sstevel@tonic-gate 		/*
48157c478bd9Sstevel@tonic-gate 		 * mark things so we know what happened and don't
48167c478bd9Sstevel@tonic-gate 		 * repeat things
48177c478bd9Sstevel@tonic-gate 		 */
48187c478bd9Sstevel@tonic-gate 		fad->fad_flags |= FAD_WRITE;
48197c478bd9Sstevel@tonic-gate 
48207c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
48217c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
48227c478bd9Sstevel@tonic-gate 		} else {
48237c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
48247c478bd9Sstevel@tonic-gate 		}
48257c478bd9Sstevel@tonic-gate 
48267c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
48277c478bd9Sstevel@tonic-gate 
48287c478bd9Sstevel@tonic-gate 		releasef(fd);
48297c478bd9Sstevel@tonic-gate 
48307c478bd9Sstevel@tonic-gate 		return;
48317c478bd9Sstevel@tonic-gate 
48327c478bd9Sstevel@tonic-gate 	default:
48337c478bd9Sstevel@tonic-gate 		break;
48347c478bd9Sstevel@tonic-gate 
48357c478bd9Sstevel@tonic-gate 	}
48367c478bd9Sstevel@tonic-gate 
48377c478bd9Sstevel@tonic-gate 	releasef(fd);
48387c478bd9Sstevel@tonic-gate 
48397c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
48407c478bd9Sstevel@tonic-gate 
48417c478bd9Sstevel@tonic-gate 	if (add_sock_token == 0) {
48427c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
48437c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
48447c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
48457c478bd9Sstevel@tonic-gate 		return;
48467c478bd9Sstevel@tonic-gate 	}
48477c478bd9Sstevel@tonic-gate 
48487c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
48497c478bd9Sstevel@tonic-gate 
48507c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
48517c478bd9Sstevel@tonic-gate 
48527c478bd9Sstevel@tonic-gate }
48537c478bd9Sstevel@tonic-gate 
48547c478bd9Sstevel@tonic-gate /*
4855da6c28aaSamw  * XXX socket(2) may be equivalent to open(2) on a unix domain
48567c478bd9Sstevel@tonic-gate  * socket. This needs investigation.
48577c478bd9Sstevel@tonic-gate  */
48587c478bd9Sstevel@tonic-gate 
48597c478bd9Sstevel@tonic-gate /*ARGSUSED*/
48607c478bd9Sstevel@tonic-gate static void
48617c478bd9Sstevel@tonic-gate aus_socket(struct t_audit_data *tad)
48627c478bd9Sstevel@tonic-gate {
48637c478bd9Sstevel@tonic-gate 	struct a {
48647c478bd9Sstevel@tonic-gate 		long	domain;
48657c478bd9Sstevel@tonic-gate 		long	type;
48667c478bd9Sstevel@tonic-gate 		long	protocol;
48677c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
48687c478bd9Sstevel@tonic-gate 
48697c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "domain", (uint32_t)uap->domain));
48707c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "type", (uint32_t)uap->type));
48717c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "protocol", (uint32_t)uap->protocol));
48727c478bd9Sstevel@tonic-gate }
48737c478bd9Sstevel@tonic-gate 
48747c478bd9Sstevel@tonic-gate /*ARGSUSED*/
48757c478bd9Sstevel@tonic-gate static void
48767c478bd9Sstevel@tonic-gate aus_sigqueue(struct t_audit_data *tad)
48777c478bd9Sstevel@tonic-gate {
48787c478bd9Sstevel@tonic-gate 	struct a {
48797c478bd9Sstevel@tonic-gate 		long	pid;
48807c478bd9Sstevel@tonic-gate 		long	signo;
48817c478bd9Sstevel@tonic-gate 		long	*val;
48827c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
48837c478bd9Sstevel@tonic-gate 	struct proc *p;
48847c478bd9Sstevel@tonic-gate 	uid_t uid, ruid;
48857c478bd9Sstevel@tonic-gate 	gid_t gid, rgid;
48867c478bd9Sstevel@tonic-gate 	pid_t pid;
48877c478bd9Sstevel@tonic-gate 	const auditinfo_addr_t *ainfo;
48887c478bd9Sstevel@tonic-gate 	cred_t *cr;
48897c478bd9Sstevel@tonic-gate 
48907c478bd9Sstevel@tonic-gate 	pid = (pid_t)uap->pid;
48917c478bd9Sstevel@tonic-gate 
48927c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "signal", (uint32_t)uap->signo));
48937c478bd9Sstevel@tonic-gate 	if (pid > 0) {
48947c478bd9Sstevel@tonic-gate 		mutex_enter(&pidlock);
48957c478bd9Sstevel@tonic-gate 		if ((p = prfind(pid)) == (struct proc *)0) {
48967c478bd9Sstevel@tonic-gate 			mutex_exit(&pidlock);
48977c478bd9Sstevel@tonic-gate 			return;
48987c478bd9Sstevel@tonic-gate 		}
48997c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_lock); /* so process doesn't go away */
49007c478bd9Sstevel@tonic-gate 		mutex_exit(&pidlock);
49017c478bd9Sstevel@tonic-gate 
49027c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_crlock);
49037c478bd9Sstevel@tonic-gate 		crhold(cr = p->p_cred);
49047c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_crlock);
49057c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_lock);
49067c478bd9Sstevel@tonic-gate 
49077c478bd9Sstevel@tonic-gate 		ainfo = crgetauinfo(cr);
49087c478bd9Sstevel@tonic-gate 		if (ainfo == NULL) {
49097c478bd9Sstevel@tonic-gate 			crfree(cr);
49107c478bd9Sstevel@tonic-gate 			return;
49117c478bd9Sstevel@tonic-gate 		}
49127c478bd9Sstevel@tonic-gate 
49137c478bd9Sstevel@tonic-gate 		uid  = crgetuid(cr);
49147c478bd9Sstevel@tonic-gate 		gid  = crgetgid(cr);
49157c478bd9Sstevel@tonic-gate 		ruid = crgetruid(cr);
49167c478bd9Sstevel@tonic-gate 		rgid = crgetrgid(cr);
49177c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
49187c478bd9Sstevel@tonic-gate 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
49197c478bd9Sstevel@tonic-gate 		crfree(cr);
49207c478bd9Sstevel@tonic-gate 	}
49217c478bd9Sstevel@tonic-gate 	else
49227c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "process ID", (uint32_t)pid));
49237c478bd9Sstevel@tonic-gate }
49247c478bd9Sstevel@tonic-gate 
49257c478bd9Sstevel@tonic-gate /*ARGSUSED*/
49267c478bd9Sstevel@tonic-gate static void
49277c478bd9Sstevel@tonic-gate aus_inst_sync(struct t_audit_data *tad)
49287c478bd9Sstevel@tonic-gate {
49297c478bd9Sstevel@tonic-gate 	struct a {
49307c478bd9Sstevel@tonic-gate 		long	name;	/* char */
49317c478bd9Sstevel@tonic-gate 		long	flags;
49327c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
49337c478bd9Sstevel@tonic-gate 
49347c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "flags", (uint32_t)uap->flags));
49357c478bd9Sstevel@tonic-gate }
49367c478bd9Sstevel@tonic-gate 
49379acbbeafSnn /*ARGSUSED*/
49389acbbeafSnn static void
49399acbbeafSnn aus_brandsys(struct t_audit_data *tad)
49409acbbeafSnn {
49419acbbeafSnn 	klwp_t *clwp = ttolwp(curthread);
49429acbbeafSnn 
49439acbbeafSnn 	struct a {
49449acbbeafSnn 		long	cmd;
49459acbbeafSnn 		long	arg1;
49469acbbeafSnn 		long	arg2;
49479acbbeafSnn 		long	arg3;
49489acbbeafSnn 		long	arg4;
49499acbbeafSnn 		long	arg5;
49509acbbeafSnn 		long	arg6;
49519acbbeafSnn 	} *uap = (struct a *)clwp->lwp_ap;
49529acbbeafSnn 
49539acbbeafSnn 	au_uwrite(au_to_arg32(1, "cmd", (uint_t)uap->cmd));
49549acbbeafSnn #ifdef _LP64
49559acbbeafSnn 	au_uwrite(au_to_arg64(2, "arg1", (uint64_t)uap->arg1));
49569acbbeafSnn 	au_uwrite(au_to_arg64(3, "arg2", (uint64_t)uap->arg2));
49579acbbeafSnn 	au_uwrite(au_to_arg64(4, "arg3", (uint64_t)uap->arg3));
49589acbbeafSnn 	au_uwrite(au_to_arg64(5, "arg4", (uint64_t)uap->arg4));
49599acbbeafSnn 	au_uwrite(au_to_arg64(6, "arg5", (uint64_t)uap->arg5));
49609acbbeafSnn 	au_uwrite(au_to_arg64(7, "arg6", (uint64_t)uap->arg6));
49619acbbeafSnn #else
49629acbbeafSnn 	au_uwrite(au_to_arg32(2, "arg1", (uint32_t)uap->arg1));
49639acbbeafSnn 	au_uwrite(au_to_arg32(3, "arg2", (uint32_t)uap->arg2));
49649acbbeafSnn 	au_uwrite(au_to_arg32(4, "arg3", (uint32_t)uap->arg3));
49659acbbeafSnn 	au_uwrite(au_to_arg32(5, "arg4", (uint32_t)uap->arg4));
49669acbbeafSnn 	au_uwrite(au_to_arg32(6, "arg5", (uint32_t)uap->arg5));
49679acbbeafSnn 	au_uwrite(au_to_arg32(7, "arg6", (uint32_t)uap->arg6));
49689acbbeafSnn #endif
49699acbbeafSnn }
49709acbbeafSnn 
49717c478bd9Sstevel@tonic-gate /*ARGSUSED*/
49727c478bd9Sstevel@tonic-gate static void
49737c478bd9Sstevel@tonic-gate aus_p_online(struct t_audit_data *tad)
49747c478bd9Sstevel@tonic-gate {
49757c478bd9Sstevel@tonic-gate 	struct a {
49767c478bd9Sstevel@tonic-gate 		long	processor_id;
49777c478bd9Sstevel@tonic-gate 		long	flag;
49787c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
49797c478bd9Sstevel@tonic-gate 
49807c478bd9Sstevel@tonic-gate 	struct flags {
49817c478bd9Sstevel@tonic-gate 			int	flag;
49827c478bd9Sstevel@tonic-gate 			char	*cflag;
49837c478bd9Sstevel@tonic-gate 	} aflags[6] = {
49847c478bd9Sstevel@tonic-gate 			{ P_ONLINE, "P_ONLINE"},
49857c478bd9Sstevel@tonic-gate 			{ P_OFFLINE, "P_OFFLINE"},
49867c478bd9Sstevel@tonic-gate 			{ P_NOINTR, "P_NOINTR"},
49877c478bd9Sstevel@tonic-gate 			{ P_SPARE, "P_SPARE"},
49887c478bd9Sstevel@tonic-gate 			{ P_FAULTED, "P_FAULTED"},
49897c478bd9Sstevel@tonic-gate 			{ P_STATUS, "P_STATUS"}
49907c478bd9Sstevel@tonic-gate 	};
49917c478bd9Sstevel@tonic-gate 	int i;
49927c478bd9Sstevel@tonic-gate 	char *cflag;
49937c478bd9Sstevel@tonic-gate 
49947c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "processor ID", (uint32_t)uap->processor_id));
49957c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "flag", (uint32_t)uap->flag));
49967c478bd9Sstevel@tonic-gate 
49977c478bd9Sstevel@tonic-gate 	for (i = 0; i < 6; i++) {
49987c478bd9Sstevel@tonic-gate 		if (aflags[i].flag == uap->flag)
49997c478bd9Sstevel@tonic-gate 			break;
50007c478bd9Sstevel@tonic-gate 	}
50017c478bd9Sstevel@tonic-gate 	cflag = (i == 6) ? "bad flag":aflags[i].cflag;
50027c478bd9Sstevel@tonic-gate 
50037c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_text(cflag));
50047c478bd9Sstevel@tonic-gate }
50057c478bd9Sstevel@tonic-gate 
50067c478bd9Sstevel@tonic-gate /*ARGSUSED*/
50077c478bd9Sstevel@tonic-gate static void
50087c478bd9Sstevel@tonic-gate aus_processor_bind(struct t_audit_data *tad)
50097c478bd9Sstevel@tonic-gate {
50107c478bd9Sstevel@tonic-gate 	struct a {
50117c478bd9Sstevel@tonic-gate 		long	id_type;
50127c478bd9Sstevel@tonic-gate 		long	id;
50137c478bd9Sstevel@tonic-gate 		long	processor_id;
50147c478bd9Sstevel@tonic-gate 		long	obind;
50157c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
50167c478bd9Sstevel@tonic-gate 
50177c478bd9Sstevel@tonic-gate 	struct proc *p;
50187c478bd9Sstevel@tonic-gate 	int lwpcnt;
50197c478bd9Sstevel@tonic-gate 	uid_t uid, ruid;
50207c478bd9Sstevel@tonic-gate 	gid_t gid, rgid;
50217c478bd9Sstevel@tonic-gate 	pid_t pid;
50227c478bd9Sstevel@tonic-gate 	const auditinfo_addr_t *ainfo;
50237c478bd9Sstevel@tonic-gate 	cred_t *cr;
50247c478bd9Sstevel@tonic-gate 
50257c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "ID type", (uint32_t)uap->id_type));
50267c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "ID", (uint32_t)uap->id));
50277c478bd9Sstevel@tonic-gate 	if (uap->processor_id == PBIND_NONE)
50287c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_text("PBIND_NONE"));
50297c478bd9Sstevel@tonic-gate 	else
50307c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "processor_id",
5031745b2690Stz 		    (uint32_t)uap->processor_id));
50327c478bd9Sstevel@tonic-gate 
50337c478bd9Sstevel@tonic-gate 	switch (uap->id_type) {
50347c478bd9Sstevel@tonic-gate 	case P_MYID:
50357c478bd9Sstevel@tonic-gate 	case P_LWPID:
50367c478bd9Sstevel@tonic-gate 		mutex_enter(&pidlock);
50377c478bd9Sstevel@tonic-gate 		p = ttoproc(curthread);
50387c478bd9Sstevel@tonic-gate 		if (p == NULL || p->p_as == &kas) {
50397c478bd9Sstevel@tonic-gate 			mutex_exit(&pidlock);
50407c478bd9Sstevel@tonic-gate 			return;
50417c478bd9Sstevel@tonic-gate 		}
50427c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_lock);
50437c478bd9Sstevel@tonic-gate 		mutex_exit(&pidlock);
50447c478bd9Sstevel@tonic-gate 		lwpcnt = p->p_lwpcnt;
50457c478bd9Sstevel@tonic-gate 		pid  = p->p_pid;
50467c478bd9Sstevel@tonic-gate 
50477c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_crlock);
50487c478bd9Sstevel@tonic-gate 		crhold(cr = p->p_cred);
50497c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_crlock);
50507c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_lock);
50517c478bd9Sstevel@tonic-gate 
50527c478bd9Sstevel@tonic-gate 		ainfo = crgetauinfo(cr);
50537c478bd9Sstevel@tonic-gate 		if (ainfo == NULL) {
50547c478bd9Sstevel@tonic-gate 			crfree(cr);
50557c478bd9Sstevel@tonic-gate 			return;
50567c478bd9Sstevel@tonic-gate 		}
50577c478bd9Sstevel@tonic-gate 
50587c478bd9Sstevel@tonic-gate 		uid  = crgetuid(cr);
50597c478bd9Sstevel@tonic-gate 		gid  = crgetgid(cr);
50607c478bd9Sstevel@tonic-gate 		ruid = crgetruid(cr);
50617c478bd9Sstevel@tonic-gate 		rgid = crgetrgid(cr);
50627c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
50637c478bd9Sstevel@tonic-gate 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
50647c478bd9Sstevel@tonic-gate 		crfree(cr);
50657c478bd9Sstevel@tonic-gate 		break;
50667c478bd9Sstevel@tonic-gate 	case P_PID:
50677c478bd9Sstevel@tonic-gate 		mutex_enter(&pidlock);
50687c478bd9Sstevel@tonic-gate 		p = prfind(uap->id);
50697c478bd9Sstevel@tonic-gate 		if (p == NULL || p->p_as == &kas) {
50707c478bd9Sstevel@tonic-gate 			mutex_exit(&pidlock);
50717c478bd9Sstevel@tonic-gate 			return;
50727c478bd9Sstevel@tonic-gate 		}
50737c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_lock);
50747c478bd9Sstevel@tonic-gate 		mutex_exit(&pidlock);
50757c478bd9Sstevel@tonic-gate 		lwpcnt = p->p_lwpcnt;
50767c478bd9Sstevel@tonic-gate 		pid  = p->p_pid;
50777c478bd9Sstevel@tonic-gate 
50787c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_crlock);
50797c478bd9Sstevel@tonic-gate 		crhold(cr = p->p_cred);
50807c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_crlock);
50817c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_lock);
50827c478bd9Sstevel@tonic-gate 
50837c478bd9Sstevel@tonic-gate 		ainfo = crgetauinfo(cr);
50847c478bd9Sstevel@tonic-gate 		if (ainfo == NULL) {
50857c478bd9Sstevel@tonic-gate 			crfree(cr);
50867c478bd9Sstevel@tonic-gate 			return;
50877c478bd9Sstevel@tonic-gate 		}
50887c478bd9Sstevel@tonic-gate 
50897c478bd9Sstevel@tonic-gate 		uid  = crgetuid(cr);
50907c478bd9Sstevel@tonic-gate 		gid  = crgetgid(cr);
50917c478bd9Sstevel@tonic-gate 		ruid = crgetruid(cr);
50927c478bd9Sstevel@tonic-gate 		rgid = crgetrgid(cr);
50937c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
50947c478bd9Sstevel@tonic-gate 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
50957c478bd9Sstevel@tonic-gate 		crfree(cr);
50967c478bd9Sstevel@tonic-gate 
50977c478bd9Sstevel@tonic-gate 		break;
50987c478bd9Sstevel@tonic-gate 	default:
50997c478bd9Sstevel@tonic-gate 		return;
51007c478bd9Sstevel@tonic-gate 	}
51017c478bd9Sstevel@tonic-gate 
51027c478bd9Sstevel@tonic-gate 	if (uap->processor_id == PBIND_NONE &&
51037c478bd9Sstevel@tonic-gate 	    (!(uap->id_type == P_LWPID && lwpcnt > 1)))
51047c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_text("PBIND_NONE for process"));
51057c478bd9Sstevel@tonic-gate 	else
51067c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "processor_id",
5107745b2690Stz 		    (uint32_t)uap->processor_id));
51087c478bd9Sstevel@tonic-gate }
51097c478bd9Sstevel@tonic-gate 
51107c478bd9Sstevel@tonic-gate /*ARGSUSED*/
51117c478bd9Sstevel@tonic-gate static au_event_t
51127c478bd9Sstevel@tonic-gate aui_doorfs(au_event_t e)
51137c478bd9Sstevel@tonic-gate {
51147c478bd9Sstevel@tonic-gate 	uint32_t code;
51157c478bd9Sstevel@tonic-gate 
51167c478bd9Sstevel@tonic-gate 	struct a {		/* doorfs */
51177c478bd9Sstevel@tonic-gate 		long	a1;
51187c478bd9Sstevel@tonic-gate 		long	a2;
51197c478bd9Sstevel@tonic-gate 		long	a3;
51207c478bd9Sstevel@tonic-gate 		long	a4;
51217c478bd9Sstevel@tonic-gate 		long	a5;
51227c478bd9Sstevel@tonic-gate 		long	code;
51237c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
51247c478bd9Sstevel@tonic-gate 
51257c478bd9Sstevel@tonic-gate 	/*
51267c478bd9Sstevel@tonic-gate 	 *	audit formats for several of the
51277c478bd9Sstevel@tonic-gate 	 *	door calls have not yet been determined
51287c478bd9Sstevel@tonic-gate 	 */
51297c478bd9Sstevel@tonic-gate 	code = (uint32_t)uap->code;
51307c478bd9Sstevel@tonic-gate 	switch (code) {
51317c478bd9Sstevel@tonic-gate 	case DOOR_CALL:
51327c478bd9Sstevel@tonic-gate 		e = AUE_DOORFS_DOOR_CALL;
51337c478bd9Sstevel@tonic-gate 		break;
51347c478bd9Sstevel@tonic-gate 	case DOOR_RETURN:
51357c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
51367c478bd9Sstevel@tonic-gate 		break;
51377c478bd9Sstevel@tonic-gate 	case DOOR_CREATE:
51387c478bd9Sstevel@tonic-gate 		e = AUE_DOORFS_DOOR_CREATE;
51397c478bd9Sstevel@tonic-gate 		break;
51407c478bd9Sstevel@tonic-gate 	case DOOR_REVOKE:
51417c478bd9Sstevel@tonic-gate 		e = AUE_DOORFS_DOOR_REVOKE;
51427c478bd9Sstevel@tonic-gate 		break;
51437c478bd9Sstevel@tonic-gate 	case DOOR_INFO:
51447c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
51457c478bd9Sstevel@tonic-gate 		break;
51467c478bd9Sstevel@tonic-gate 	case DOOR_UCRED:
51477c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
51487c478bd9Sstevel@tonic-gate 		break;
51497c478bd9Sstevel@tonic-gate 	case DOOR_BIND:
51507c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
51517c478bd9Sstevel@tonic-gate 		break;
51527c478bd9Sstevel@tonic-gate 	case DOOR_UNBIND:
51537c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
51547c478bd9Sstevel@tonic-gate 		break;
51557c478bd9Sstevel@tonic-gate 	case DOOR_GETPARAM:
51567c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
51577c478bd9Sstevel@tonic-gate 		break;
51587c478bd9Sstevel@tonic-gate 	case DOOR_SETPARAM:
51597c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
51607c478bd9Sstevel@tonic-gate 		break;
51617c478bd9Sstevel@tonic-gate 	default:	/* illegal system call */
51627c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
51637c478bd9Sstevel@tonic-gate 		break;
51647c478bd9Sstevel@tonic-gate 	}
51657c478bd9Sstevel@tonic-gate 
51667c478bd9Sstevel@tonic-gate 	return (e);
51677c478bd9Sstevel@tonic-gate }
51687c478bd9Sstevel@tonic-gate 
51697c478bd9Sstevel@tonic-gate static door_node_t *
51707c478bd9Sstevel@tonic-gate au_door_lookup(int did)
51717c478bd9Sstevel@tonic-gate {
51727c478bd9Sstevel@tonic-gate 	vnode_t	*vp;
51737c478bd9Sstevel@tonic-gate 	file_t *fp;
51747c478bd9Sstevel@tonic-gate 
51757c478bd9Sstevel@tonic-gate 	if ((fp = getf(did)) == NULL)
51767c478bd9Sstevel@tonic-gate 		return (NULL);
51777c478bd9Sstevel@tonic-gate 	/*
51787c478bd9Sstevel@tonic-gate 	 * Use the underlying vnode (we may be namefs mounted)
51797c478bd9Sstevel@tonic-gate 	 */
5180da6c28aaSamw 	if (VOP_REALVP(fp->f_vnode, &vp, NULL))
51817c478bd9Sstevel@tonic-gate 		vp = fp->f_vnode;
51827c478bd9Sstevel@tonic-gate 
51837c478bd9Sstevel@tonic-gate 	if (vp == NULL || vp->v_type != VDOOR) {
51847c478bd9Sstevel@tonic-gate 		releasef(did);
51857c478bd9Sstevel@tonic-gate 		return (NULL);
51867c478bd9Sstevel@tonic-gate 	}
51877c478bd9Sstevel@tonic-gate 
51887c478bd9Sstevel@tonic-gate 	return (VTOD(vp));
51897c478bd9Sstevel@tonic-gate }
51907c478bd9Sstevel@tonic-gate 
51917c478bd9Sstevel@tonic-gate /*ARGSUSED*/
51927c478bd9Sstevel@tonic-gate static void
51937c478bd9Sstevel@tonic-gate aus_doorfs(struct t_audit_data *tad)
51947c478bd9Sstevel@tonic-gate {
51957c478bd9Sstevel@tonic-gate 
51967c478bd9Sstevel@tonic-gate 	struct a {		/* doorfs */
51977c478bd9Sstevel@tonic-gate 		long	a1;
51987c478bd9Sstevel@tonic-gate 		long	a2;
51997c478bd9Sstevel@tonic-gate 		long	a3;
52007c478bd9Sstevel@tonic-gate 		long	a4;
52017c478bd9Sstevel@tonic-gate 		long	a5;
52027c478bd9Sstevel@tonic-gate 		long	code;
52037c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
52047c478bd9Sstevel@tonic-gate 
52057c478bd9Sstevel@tonic-gate 	door_node_t	*dp;
52067c478bd9Sstevel@tonic-gate 	struct proc	*p;
52077c478bd9Sstevel@tonic-gate 	uint32_t	did;
52087c478bd9Sstevel@tonic-gate 	uid_t uid, ruid;
52097c478bd9Sstevel@tonic-gate 	gid_t gid, rgid;
52107c478bd9Sstevel@tonic-gate 	pid_t pid;
52117c478bd9Sstevel@tonic-gate 	const auditinfo_addr_t *ainfo;
52127c478bd9Sstevel@tonic-gate 	cred_t *cr;
52137c478bd9Sstevel@tonic-gate 
52147c478bd9Sstevel@tonic-gate 	did = (uint32_t)uap->a1;
52157c478bd9Sstevel@tonic-gate 
52167c478bd9Sstevel@tonic-gate 	switch (tad->tad_event) {
52177c478bd9Sstevel@tonic-gate 	case AUE_DOORFS_DOOR_CALL:
52187c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "door ID", (uint32_t)did));
52197c478bd9Sstevel@tonic-gate 		if ((dp = au_door_lookup(did)) == NULL)
52207c478bd9Sstevel@tonic-gate 			break;
52217c478bd9Sstevel@tonic-gate 
52227c478bd9Sstevel@tonic-gate 		if (DOOR_INVALID(dp)) {
52237c478bd9Sstevel@tonic-gate 			releasef(did);
52247c478bd9Sstevel@tonic-gate 			break;
52257c478bd9Sstevel@tonic-gate 		}
52267c478bd9Sstevel@tonic-gate 
52277c478bd9Sstevel@tonic-gate 		if ((p = dp->door_target) == NULL) {
52287c478bd9Sstevel@tonic-gate 			releasef(did);
52297c478bd9Sstevel@tonic-gate 			break;
52307c478bd9Sstevel@tonic-gate 		}
52317c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_lock);
52327c478bd9Sstevel@tonic-gate 		releasef(did);
52337c478bd9Sstevel@tonic-gate 
52347c478bd9Sstevel@tonic-gate 		pid  = p->p_pid;
52357c478bd9Sstevel@tonic-gate 
52367c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_crlock);
52377c478bd9Sstevel@tonic-gate 		crhold(cr = p->p_cred);
52387c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_crlock);
52397c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_lock);
52407c478bd9Sstevel@tonic-gate 
52417c478bd9Sstevel@tonic-gate 		ainfo = crgetauinfo(cr);
52427c478bd9Sstevel@tonic-gate 		if (ainfo == NULL) {
52437c478bd9Sstevel@tonic-gate 			crfree(cr);
52447c478bd9Sstevel@tonic-gate 			return;
52457c478bd9Sstevel@tonic-gate 		}
52467c478bd9Sstevel@tonic-gate 		uid  = crgetuid(cr);
52477c478bd9Sstevel@tonic-gate 		gid  = crgetgid(cr);
52487c478bd9Sstevel@tonic-gate 		ruid = crgetruid(cr);
52497c478bd9Sstevel@tonic-gate 		rgid = crgetrgid(cr);
52507c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
52517c478bd9Sstevel@tonic-gate 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
52527c478bd9Sstevel@tonic-gate 		crfree(cr);
52537c478bd9Sstevel@tonic-gate 		break;
52547c478bd9Sstevel@tonic-gate 	case AUE_DOORFS_DOOR_RETURN:
52557c478bd9Sstevel@tonic-gate 		/*
52567c478bd9Sstevel@tonic-gate 		 * We may want to write information about
52577c478bd9Sstevel@tonic-gate 		 * all doors (if any) which will be copied
52587c478bd9Sstevel@tonic-gate 		 * by this call to the user space
52597c478bd9Sstevel@tonic-gate 		 */
52607c478bd9Sstevel@tonic-gate 		break;
52617c478bd9Sstevel@tonic-gate 	case AUE_DOORFS_DOOR_CREATE:
52627c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(3, "door attr", (uint32_t)uap->a3));
52637c478bd9Sstevel@tonic-gate 		break;
52647c478bd9Sstevel@tonic-gate 	case AUE_DOORFS_DOOR_REVOKE:
52657c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "door ID", (uint32_t)did));
52667c478bd9Sstevel@tonic-gate 		break;
52677c478bd9Sstevel@tonic-gate 	case AUE_DOORFS_DOOR_INFO:
52687c478bd9Sstevel@tonic-gate 		break;
52697c478bd9Sstevel@tonic-gate 	case AUE_DOORFS_DOOR_CRED:
52707c478bd9Sstevel@tonic-gate 		break;
52717c478bd9Sstevel@tonic-gate 	case AUE_DOORFS_DOOR_BIND:
52727c478bd9Sstevel@tonic-gate 		break;
52737c478bd9Sstevel@tonic-gate 	case AUE_DOORFS_DOOR_UNBIND: {
52747c478bd9Sstevel@tonic-gate 		break;
52757c478bd9Sstevel@tonic-gate 	}
52767c478bd9Sstevel@tonic-gate 	default:	/* illegal system call */
52777c478bd9Sstevel@tonic-gate 		break;
52787c478bd9Sstevel@tonic-gate 	}
52797c478bd9Sstevel@tonic-gate }
52807c478bd9Sstevel@tonic-gate 
52817c478bd9Sstevel@tonic-gate /*ARGSUSED*/
52827c478bd9Sstevel@tonic-gate static au_event_t
52837c478bd9Sstevel@tonic-gate aui_acl(au_event_t e)
52847c478bd9Sstevel@tonic-gate {
52857c478bd9Sstevel@tonic-gate 	struct a {
52867c478bd9Sstevel@tonic-gate 		union {
52877c478bd9Sstevel@tonic-gate 			long	name;	/* char */
52887c478bd9Sstevel@tonic-gate 			long	fd;
52897c478bd9Sstevel@tonic-gate 		}		obj;
52907c478bd9Sstevel@tonic-gate 
52917c478bd9Sstevel@tonic-gate 		long		cmd;
52927c478bd9Sstevel@tonic-gate 		long		nentries;
52937c478bd9Sstevel@tonic-gate 		long		arg;	/* aclent_t */
52947c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
52957c478bd9Sstevel@tonic-gate 
52967c478bd9Sstevel@tonic-gate 	switch (uap->cmd) {
52977c478bd9Sstevel@tonic-gate 	case SETACL:
5298a7746f66Stz 	case ACE_SETACL:
5299a7746f66Stz 		/*
5300a7746f66Stz 		 * acl(SETACL/ACE_SETACL, ...) and facl(SETACL/ACE_SETACL, ...)
5301a7746f66Stz 		 * are expected.
5302a7746f66Stz 		 */
53037c478bd9Sstevel@tonic-gate 		break;
53047c478bd9Sstevel@tonic-gate 	case GETACL:
53057c478bd9Sstevel@tonic-gate 	case GETACLCNT:
5306ebbb0311SJan Friedel 	case ACE_GETACL:
5307a7746f66Stz 	case ACE_GETACLCNT:
5308ebbb0311SJan Friedel 		/* do nothing for these four values. */
53097c478bd9Sstevel@tonic-gate 		e = AUE_NULL;
53107c478bd9Sstevel@tonic-gate 		break;
53117c478bd9Sstevel@tonic-gate 	default:
53127c478bd9Sstevel@tonic-gate 		/* illegal system call */
53137c478bd9Sstevel@tonic-gate 		break;
53147c478bd9Sstevel@tonic-gate 	}
53157c478bd9Sstevel@tonic-gate 
53167c478bd9Sstevel@tonic-gate 	return (e);
53177c478bd9Sstevel@tonic-gate }
53187c478bd9Sstevel@tonic-gate 
53197c478bd9Sstevel@tonic-gate static void
5320a7746f66Stz au_acl(int cmd, int nentries, caddr_t bufp)
53217c478bd9Sstevel@tonic-gate {
5322a7746f66Stz 	size_t		a_size;
5323a7746f66Stz 	aclent_t	*aclbufp;
5324a7746f66Stz 	ace_t		*acebufp;
5325a7746f66Stz 	int		i;
53267c478bd9Sstevel@tonic-gate 
5327a7746f66Stz 	switch (cmd) {
53287c478bd9Sstevel@tonic-gate 	case GETACL:
53297c478bd9Sstevel@tonic-gate 	case GETACLCNT:
53307c478bd9Sstevel@tonic-gate 		break;
53317c478bd9Sstevel@tonic-gate 	case SETACL:
5332a7746f66Stz 		if (nentries < 3)
5333745b2690Stz 			break;
53347c478bd9Sstevel@tonic-gate 
5335a7746f66Stz 		a_size = nentries * sizeof (aclent_t);
5336a7746f66Stz 
5337a7746f66Stz 		if ((aclbufp = kmem_alloc(a_size, KM_SLEEP)) == NULL)
5338a7746f66Stz 			break;
5339a7746f66Stz 		if (copyin(bufp, aclbufp, a_size)) {
53407c478bd9Sstevel@tonic-gate 			kmem_free(aclbufp, a_size);
53417c478bd9Sstevel@tonic-gate 			break;
53427c478bd9Sstevel@tonic-gate 		}
5343a7746f66Stz 		for (i = 0; i < nentries; i++) {
5344a7746f66Stz 			au_uwrite(au_to_acl(aclbufp + i));
5345a7746f66Stz 		}
5346a7746f66Stz 		kmem_free(aclbufp, a_size);
5347a7746f66Stz 		break;
5348a7746f66Stz 
5349a7746f66Stz 	case ACE_SETACL:
5350a7746f66Stz 		if (nentries < 1 || nentries > MAX_ACL_ENTRIES)
5351a7746f66Stz 			break;
5352a7746f66Stz 
5353a7746f66Stz 		a_size = nentries * sizeof (ace_t);
5354a7746f66Stz 		if ((acebufp = kmem_alloc(a_size, KM_SLEEP)) == NULL)
5355a7746f66Stz 			break;
5356a7746f66Stz 		if (copyin(bufp, acebufp, a_size)) {
5357a7746f66Stz 			kmem_free(acebufp, a_size);
5358a7746f66Stz 			break;
5359a7746f66Stz 		}
5360a7746f66Stz 		for (i = 0; i < nentries; i++) {
5361a7746f66Stz 			au_uwrite(au_to_ace(acebufp + i));
5362a7746f66Stz 		}
5363a7746f66Stz 		kmem_free(acebufp, a_size);
5364a7746f66Stz 		break;
53657c478bd9Sstevel@tonic-gate 	default:
53667c478bd9Sstevel@tonic-gate 		break;
53677c478bd9Sstevel@tonic-gate 	}
53687c478bd9Sstevel@tonic-gate }
53697c478bd9Sstevel@tonic-gate 
5370a7746f66Stz /*ARGSUSED*/
5371a7746f66Stz static void
5372a7746f66Stz aus_acl(struct t_audit_data *tad)
5373a7746f66Stz {
5374a7746f66Stz 	struct a {
5375a7746f66Stz 		long	fname;
5376a7746f66Stz 		long	cmd;
5377a7746f66Stz 		long	nentries;
5378a7746f66Stz 		long	aclbufp;
5379a7746f66Stz 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5380a7746f66Stz 
5381a7746f66Stz 	au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd));
5382a7746f66Stz 	au_uwrite(au_to_arg32(3, "nentries", (uint32_t)uap->nentries));
5383a7746f66Stz 
5384a7746f66Stz 	au_acl(uap->cmd, uap->nentries, (caddr_t)uap->aclbufp);
5385a7746f66Stz }
5386a7746f66Stz 
53877c478bd9Sstevel@tonic-gate /*ARGSUSED*/
53887c478bd9Sstevel@tonic-gate static void
53897c478bd9Sstevel@tonic-gate aus_facl(struct t_audit_data *tad)
53907c478bd9Sstevel@tonic-gate {
53917c478bd9Sstevel@tonic-gate 	struct a {
53927c478bd9Sstevel@tonic-gate 		long	fd;
53937c478bd9Sstevel@tonic-gate 		long	cmd;
53947c478bd9Sstevel@tonic-gate 		long	nentries;
53957c478bd9Sstevel@tonic-gate 		long	aclbufp;
53967c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
53977c478bd9Sstevel@tonic-gate 	struct file  *fp;
53987c478bd9Sstevel@tonic-gate 	struct vnode *vp;
53997c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
54007c478bd9Sstevel@tonic-gate 	int fd;
54017c478bd9Sstevel@tonic-gate 
54027c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd));
54037c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(3, "nentries", (uint32_t)uap->nentries));
54047c478bd9Sstevel@tonic-gate 
54057c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
54067c478bd9Sstevel@tonic-gate 
54077c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL)
54087c478bd9Sstevel@tonic-gate 		return;
54097c478bd9Sstevel@tonic-gate 
54107c478bd9Sstevel@tonic-gate 	/* get path from file struct here */
54117c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
54127c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
54137c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
54147c478bd9Sstevel@tonic-gate 	} else {
54157c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd));
54167c478bd9Sstevel@tonic-gate 	}
54177c478bd9Sstevel@tonic-gate 
54187c478bd9Sstevel@tonic-gate 	vp = fp->f_vnode;
54197c478bd9Sstevel@tonic-gate 	audit_attributes(vp);
54207c478bd9Sstevel@tonic-gate 
54217c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
54227c478bd9Sstevel@tonic-gate 	releasef(fd);
54237c478bd9Sstevel@tonic-gate 
5424a7746f66Stz 	au_acl(uap->cmd, uap->nentries, (caddr_t)uap->aclbufp);
54257c478bd9Sstevel@tonic-gate }
54267c478bd9Sstevel@tonic-gate 
54277c478bd9Sstevel@tonic-gate /*ARGSUSED*/
54287c478bd9Sstevel@tonic-gate static void
54297c478bd9Sstevel@tonic-gate auf_read(tad, error, rval)
54307c478bd9Sstevel@tonic-gate 	struct t_audit_data *tad;
54317c478bd9Sstevel@tonic-gate 	int error;
54327c478bd9Sstevel@tonic-gate 	rval_t *rval;
54337c478bd9Sstevel@tonic-gate {
54347c478bd9Sstevel@tonic-gate 	struct file *fp;
54357c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
54367c478bd9Sstevel@tonic-gate 	int fd;
54377c478bd9Sstevel@tonic-gate 	register struct a {
54387c478bd9Sstevel@tonic-gate 		long	fd;
54397c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
54409e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
54417c478bd9Sstevel@tonic-gate 
54427c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
54437c478bd9Sstevel@tonic-gate 
54447c478bd9Sstevel@tonic-gate 	/*
54457c478bd9Sstevel@tonic-gate 	 * convert file pointer to file descriptor
54467c478bd9Sstevel@tonic-gate 	 *   Note: fd ref count incremented here.
54477c478bd9Sstevel@tonic-gate 	 */
54487c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL)
54497c478bd9Sstevel@tonic-gate 		return;
54507c478bd9Sstevel@tonic-gate 
54517c478bd9Sstevel@tonic-gate 	/* get path from file struct here */
54527c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
54537c478bd9Sstevel@tonic-gate 	ASSERT(fad);
54547c478bd9Sstevel@tonic-gate 
54557c478bd9Sstevel@tonic-gate 	/*
54567c478bd9Sstevel@tonic-gate 	 * already processed this file for read attempt
54577c478bd9Sstevel@tonic-gate 	 *
54587c478bd9Sstevel@tonic-gate 	 * XXX might be better to turn off auditing in a aui_read() routine.
54597c478bd9Sstevel@tonic-gate 	 */
54607c478bd9Sstevel@tonic-gate 	if (fad->fad_flags & FAD_READ) {
54617c478bd9Sstevel@tonic-gate 		/* don't really want to audit every read attempt */
54627c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
54637c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5464005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
54657c478bd9Sstevel@tonic-gate 		releasef(fd);
54667c478bd9Sstevel@tonic-gate 		return;
54677c478bd9Sstevel@tonic-gate 	}
54687c478bd9Sstevel@tonic-gate 	/* mark things so we know what happened and don't repeat things */
54697c478bd9Sstevel@tonic-gate 	fad->fad_flags |= FAD_READ;
54707c478bd9Sstevel@tonic-gate 
54717c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
54727c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
54737c478bd9Sstevel@tonic-gate 	} else {
54747c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd));
54757c478bd9Sstevel@tonic-gate 	}
54767c478bd9Sstevel@tonic-gate 
54777c478bd9Sstevel@tonic-gate 	/* include attributes */
54787c478bd9Sstevel@tonic-gate 	audit_attributes(fp->f_vnode);
54797c478bd9Sstevel@tonic-gate 
54807c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
54817c478bd9Sstevel@tonic-gate 	releasef(fd);
54827c478bd9Sstevel@tonic-gate }
54837c478bd9Sstevel@tonic-gate 
54847c478bd9Sstevel@tonic-gate /*ARGSUSED*/
54857c478bd9Sstevel@tonic-gate static void
54867c478bd9Sstevel@tonic-gate auf_write(tad, error, rval)
54877c478bd9Sstevel@tonic-gate 	struct t_audit_data *tad;
54887c478bd9Sstevel@tonic-gate 	int error;
54897c478bd9Sstevel@tonic-gate 	rval_t *rval;
54907c478bd9Sstevel@tonic-gate {
54917c478bd9Sstevel@tonic-gate 	struct file *fp;
54927c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
54937c478bd9Sstevel@tonic-gate 	int fd;
54947c478bd9Sstevel@tonic-gate 	register struct a {
54957c478bd9Sstevel@tonic-gate 		long	fd;
54967c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
54979e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
54987c478bd9Sstevel@tonic-gate 
54997c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
55007c478bd9Sstevel@tonic-gate 
55017c478bd9Sstevel@tonic-gate 	/*
55027c478bd9Sstevel@tonic-gate 	 * convert file pointer to file descriptor
55037c478bd9Sstevel@tonic-gate 	 *   Note: fd ref count incremented here.
55047c478bd9Sstevel@tonic-gate 	 */
55057c478bd9Sstevel@tonic-gate 	if ((fp = getf(fd)) == NULL)
55067c478bd9Sstevel@tonic-gate 		return;
55077c478bd9Sstevel@tonic-gate 
55087c478bd9Sstevel@tonic-gate 	/* get path from file struct here */
55097c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
55107c478bd9Sstevel@tonic-gate 	ASSERT(fad);
55117c478bd9Sstevel@tonic-gate 
55127c478bd9Sstevel@tonic-gate 	/*
55137c478bd9Sstevel@tonic-gate 	 * already processed this file for write attempt
55147c478bd9Sstevel@tonic-gate 	 *
55157c478bd9Sstevel@tonic-gate 	 * XXX might be better to turn off auditing in a aus_write() routine.
55167c478bd9Sstevel@tonic-gate 	 */
55177c478bd9Sstevel@tonic-gate 	if (fad->fad_flags & FAD_WRITE) {
55187c478bd9Sstevel@tonic-gate 		/* don't really want to audit every write attempt */
55197c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
55207c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5521005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
55227c478bd9Sstevel@tonic-gate 		releasef(fd);
55237c478bd9Sstevel@tonic-gate 		return;
55247c478bd9Sstevel@tonic-gate 	}
55257c478bd9Sstevel@tonic-gate 	/* mark things so we know what happened and don't repeat things */
55267c478bd9Sstevel@tonic-gate 	fad->fad_flags |= FAD_WRITE;
55277c478bd9Sstevel@tonic-gate 
55287c478bd9Sstevel@tonic-gate 	if (fad->fad_aupath != NULL) {
55297c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_path(fad->fad_aupath));
55307c478bd9Sstevel@tonic-gate 	} else {
55317c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd));
55327c478bd9Sstevel@tonic-gate 	}
55337c478bd9Sstevel@tonic-gate 
55347c478bd9Sstevel@tonic-gate 	/* include attributes */
55357c478bd9Sstevel@tonic-gate 	audit_attributes(fp->f_vnode);
55367c478bd9Sstevel@tonic-gate 
55377c478bd9Sstevel@tonic-gate 	/* decrement file descriptor reference count */
55387c478bd9Sstevel@tonic-gate 	releasef(fd);
55397c478bd9Sstevel@tonic-gate }
55407c478bd9Sstevel@tonic-gate 
55417c478bd9Sstevel@tonic-gate /*ARGSUSED*/
55427c478bd9Sstevel@tonic-gate static void
55437c478bd9Sstevel@tonic-gate auf_recv(tad, error, rval)
55447c478bd9Sstevel@tonic-gate 	struct t_audit_data *tad;
55457c478bd9Sstevel@tonic-gate 	int error;
55467c478bd9Sstevel@tonic-gate 	rval_t *rval;
55477c478bd9Sstevel@tonic-gate {
55487c478bd9Sstevel@tonic-gate 	struct sonode *so;
55497c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
55507c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
55517c478bd9Sstevel@tonic-gate 	struct file *fp;
55527c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
55537c478bd9Sstevel@tonic-gate 	int fd;
55547c478bd9Sstevel@tonic-gate 	int err;
55550f1702c5SYu Xiangning 	socklen_t len;
55567c478bd9Sstevel@tonic-gate 	short so_family, so_type;
55577c478bd9Sstevel@tonic-gate 	register struct a {
55587c478bd9Sstevel@tonic-gate 		long	fd;
55597c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
55609e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
55617c478bd9Sstevel@tonic-gate 
55627c478bd9Sstevel@tonic-gate 	/*
55637c478bd9Sstevel@tonic-gate 	 * If there was an error, then nothing to do. Only generate
55647c478bd9Sstevel@tonic-gate 	 * audit record on first successful recv.
55657c478bd9Sstevel@tonic-gate 	 */
55667c478bd9Sstevel@tonic-gate 	if (error) {
55677c478bd9Sstevel@tonic-gate 		/* Turn off audit record generation here. */
55687c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
55697c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5570005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
55717c478bd9Sstevel@tonic-gate 		return;
55727c478bd9Sstevel@tonic-gate 	}
55737c478bd9Sstevel@tonic-gate 
55747c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
55757c478bd9Sstevel@tonic-gate 
5576745b2690Stz 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
55777c478bd9Sstevel@tonic-gate 		/* Turn off audit record generation here. */
55787c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
55797c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5580005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
55817c478bd9Sstevel@tonic-gate 		return;
55827c478bd9Sstevel@tonic-gate 	}
55837c478bd9Sstevel@tonic-gate 
55847c478bd9Sstevel@tonic-gate 	/* get path from file struct here */
55857c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
55867c478bd9Sstevel@tonic-gate 	ASSERT(fad);
55877c478bd9Sstevel@tonic-gate 
55887c478bd9Sstevel@tonic-gate 	/*
55897c478bd9Sstevel@tonic-gate 	 * already processed this file for read attempt
55907c478bd9Sstevel@tonic-gate 	 */
55917c478bd9Sstevel@tonic-gate 	if (fad->fad_flags & FAD_READ) {
55927c478bd9Sstevel@tonic-gate 		releasef(fd);
55937c478bd9Sstevel@tonic-gate 		/* don't really want to audit every recv call */
55947c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
55957c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5596005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
55977c478bd9Sstevel@tonic-gate 		return;
55987c478bd9Sstevel@tonic-gate 	}
55997c478bd9Sstevel@tonic-gate 
56007c478bd9Sstevel@tonic-gate 	/* mark things so we know what happened and don't repeat things */
56017c478bd9Sstevel@tonic-gate 	fad->fad_flags |= FAD_READ;
56027c478bd9Sstevel@tonic-gate 
56037c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
56047c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
56057c478bd9Sstevel@tonic-gate 
56067c478bd9Sstevel@tonic-gate 	switch (so_family) {
56077c478bd9Sstevel@tonic-gate 	case AF_INET:
56087c478bd9Sstevel@tonic-gate 	case AF_INET6:
56097c478bd9Sstevel@tonic-gate 		/*
56107c478bd9Sstevel@tonic-gate 		 * Only for connections.
56117c478bd9Sstevel@tonic-gate 		 * XXX - do we need to worry about SOCK_DGRAM or other types???
56127c478bd9Sstevel@tonic-gate 		 */
56137c478bd9Sstevel@tonic-gate 		if (so->so_state & SS_ISBOUND) {
56147c478bd9Sstevel@tonic-gate 
56157c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
56167c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
56177c478bd9Sstevel@tonic-gate 
56187c478bd9Sstevel@tonic-gate 			/* get local and foreign addresses */
56190f1702c5SYu Xiangning 			len = sizeof (so_laddr);
56200f1702c5SYu Xiangning 			(void) socket_getsockname(so,
56210f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
56220f1702c5SYu Xiangning 			len = sizeof (so_faddr);
56230f1702c5SYu Xiangning 			(void) socket_getpeername(so,
56240f1702c5SYu Xiangning 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
56257c478bd9Sstevel@tonic-gate 
56267c478bd9Sstevel@tonic-gate 			/*
56277c478bd9Sstevel@tonic-gate 			 * only way to drop out of switch. Note that we
56287c478bd9Sstevel@tonic-gate 			 * we release fd below.
56297c478bd9Sstevel@tonic-gate 			 */
56307c478bd9Sstevel@tonic-gate 
56317c478bd9Sstevel@tonic-gate 			break;
56327c478bd9Sstevel@tonic-gate 		}
56337c478bd9Sstevel@tonic-gate 
56347c478bd9Sstevel@tonic-gate 		releasef(fd);
56357c478bd9Sstevel@tonic-gate 
56367c478bd9Sstevel@tonic-gate 		/* don't really want to audit every recv call */
56377c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
56387c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5639005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
56407c478bd9Sstevel@tonic-gate 
56417c478bd9Sstevel@tonic-gate 		return;
56427c478bd9Sstevel@tonic-gate 
56437c478bd9Sstevel@tonic-gate 	case AF_UNIX:
56447c478bd9Sstevel@tonic-gate 
56457c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
56467c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
56477c478bd9Sstevel@tonic-gate 		} else {
56487c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
56497c478bd9Sstevel@tonic-gate 		}
56507c478bd9Sstevel@tonic-gate 
56517c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
56527c478bd9Sstevel@tonic-gate 
56537c478bd9Sstevel@tonic-gate 		releasef(fd);
56547c478bd9Sstevel@tonic-gate 
56557c478bd9Sstevel@tonic-gate 		return;
56567c478bd9Sstevel@tonic-gate 
56577c478bd9Sstevel@tonic-gate 	default:
56587c478bd9Sstevel@tonic-gate 		releasef(fd);
56597c478bd9Sstevel@tonic-gate 
56607c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
56617c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
56627c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
56637c478bd9Sstevel@tonic-gate 
56647c478bd9Sstevel@tonic-gate 		return;
56657c478bd9Sstevel@tonic-gate 	}
56667c478bd9Sstevel@tonic-gate 
56677c478bd9Sstevel@tonic-gate 	releasef(fd);
56687c478bd9Sstevel@tonic-gate 
56697c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
56707c478bd9Sstevel@tonic-gate 
56717c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
56727c478bd9Sstevel@tonic-gate 
56737c478bd9Sstevel@tonic-gate }
56747c478bd9Sstevel@tonic-gate 
56757c478bd9Sstevel@tonic-gate /*ARGSUSED*/
56767c478bd9Sstevel@tonic-gate static void
56777c478bd9Sstevel@tonic-gate auf_send(tad, error, rval)
56787c478bd9Sstevel@tonic-gate 	struct t_audit_data *tad;
56797c478bd9Sstevel@tonic-gate 	int error;
56807c478bd9Sstevel@tonic-gate 	rval_t *rval;
56817c478bd9Sstevel@tonic-gate {
56827c478bd9Sstevel@tonic-gate 	struct sonode *so;
56837c478bd9Sstevel@tonic-gate 	char so_laddr[sizeof (struct sockaddr_in6)];
56847c478bd9Sstevel@tonic-gate 	char so_faddr[sizeof (struct sockaddr_in6)];
56857c478bd9Sstevel@tonic-gate 	struct file *fp;
56867c478bd9Sstevel@tonic-gate 	struct f_audit_data *fad;
56877c478bd9Sstevel@tonic-gate 	int fd;
56887c478bd9Sstevel@tonic-gate 	int err;
56890f1702c5SYu Xiangning 	socklen_t len;
56907c478bd9Sstevel@tonic-gate 	short so_family, so_type;
56917c478bd9Sstevel@tonic-gate 	register struct a {
56927c478bd9Sstevel@tonic-gate 		long	fd;
56937c478bd9Sstevel@tonic-gate 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
56949e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
56957c478bd9Sstevel@tonic-gate 
56967c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
56977c478bd9Sstevel@tonic-gate 
56987c478bd9Sstevel@tonic-gate 	/*
56997c478bd9Sstevel@tonic-gate 	 * If there was an error, then nothing to do. Only generate
57007c478bd9Sstevel@tonic-gate 	 * audit record on first successful send.
57017c478bd9Sstevel@tonic-gate 	 */
57027c478bd9Sstevel@tonic-gate 	if (error != 0) {
57037c478bd9Sstevel@tonic-gate 		/* Turn off audit record generation here. */
57047c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
57057c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5706005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
57077c478bd9Sstevel@tonic-gate 		return;
57087c478bd9Sstevel@tonic-gate 	}
57097c478bd9Sstevel@tonic-gate 
57107c478bd9Sstevel@tonic-gate 	fd = (int)uap->fd;
57117c478bd9Sstevel@tonic-gate 
5712745b2690Stz 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
57137c478bd9Sstevel@tonic-gate 		/* Turn off audit record generation here. */
57147c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
57157c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5716005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
57177c478bd9Sstevel@tonic-gate 		return;
57187c478bd9Sstevel@tonic-gate 	}
57197c478bd9Sstevel@tonic-gate 
57207c478bd9Sstevel@tonic-gate 	/* get path from file struct here */
57217c478bd9Sstevel@tonic-gate 	fad = F2A(fp);
57227c478bd9Sstevel@tonic-gate 	ASSERT(fad);
57237c478bd9Sstevel@tonic-gate 
57247c478bd9Sstevel@tonic-gate 	/*
57257c478bd9Sstevel@tonic-gate 	 * already processed this file for write attempt
57267c478bd9Sstevel@tonic-gate 	 */
57277c478bd9Sstevel@tonic-gate 	if (fad->fad_flags & FAD_WRITE) {
57287c478bd9Sstevel@tonic-gate 		releasef(fd);
57297c478bd9Sstevel@tonic-gate 		/* don't really want to audit every send call */
57307c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
57317c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5732005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
57337c478bd9Sstevel@tonic-gate 		return;
57347c478bd9Sstevel@tonic-gate 	}
57357c478bd9Sstevel@tonic-gate 
57367c478bd9Sstevel@tonic-gate 	/* mark things so we know what happened and don't repeat things */
57377c478bd9Sstevel@tonic-gate 	fad->fad_flags |= FAD_WRITE;
57387c478bd9Sstevel@tonic-gate 
57397c478bd9Sstevel@tonic-gate 	so_family = so->so_family;
57407c478bd9Sstevel@tonic-gate 	so_type   = so->so_type;
57417c478bd9Sstevel@tonic-gate 
57427c478bd9Sstevel@tonic-gate 	switch (so_family) {
57437c478bd9Sstevel@tonic-gate 	case AF_INET:
57447c478bd9Sstevel@tonic-gate 	case AF_INET6:
57457c478bd9Sstevel@tonic-gate 		/*
57467c478bd9Sstevel@tonic-gate 		 * Only for connections.
57477c478bd9Sstevel@tonic-gate 		 * XXX - do we need to worry about SOCK_DGRAM or other types???
57487c478bd9Sstevel@tonic-gate 		 */
57497c478bd9Sstevel@tonic-gate 		if (so->so_state & SS_ISBOUND) {
57507c478bd9Sstevel@tonic-gate 
57517c478bd9Sstevel@tonic-gate 			bzero((void *)so_laddr, sizeof (so_laddr));
57527c478bd9Sstevel@tonic-gate 			bzero((void *)so_faddr, sizeof (so_faddr));
57537c478bd9Sstevel@tonic-gate 
57547c478bd9Sstevel@tonic-gate 			/* get local and foreign addresses */
57550f1702c5SYu Xiangning 			len = sizeof (so_laddr);
57560f1702c5SYu Xiangning 			(void) socket_getsockname(so,
57570f1702c5SYu Xiangning 			    (struct sockaddr *)so_laddr, &len, CRED());
57580f1702c5SYu Xiangning 			len = sizeof (so_faddr);
57590f1702c5SYu Xiangning 			(void) socket_getpeername(so,
57600f1702c5SYu Xiangning 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
57617c478bd9Sstevel@tonic-gate 
57627c478bd9Sstevel@tonic-gate 			/*
57637c478bd9Sstevel@tonic-gate 			 * only way to drop out of switch. Note that we
57647c478bd9Sstevel@tonic-gate 			 * we release fd below.
57657c478bd9Sstevel@tonic-gate 			 */
57667c478bd9Sstevel@tonic-gate 
57677c478bd9Sstevel@tonic-gate 			break;
57687c478bd9Sstevel@tonic-gate 		}
57697c478bd9Sstevel@tonic-gate 
57707c478bd9Sstevel@tonic-gate 		releasef(fd);
57717c478bd9Sstevel@tonic-gate 		/* don't really want to audit every send call */
57727c478bd9Sstevel@tonic-gate 		tad->tad_flag = 0;
57737c478bd9Sstevel@tonic-gate 		/* free any residual audit data */
5774005d3febSMarek Pospisil 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
57757c478bd9Sstevel@tonic-gate 
57767c478bd9Sstevel@tonic-gate 		return;
57777c478bd9Sstevel@tonic-gate 
57787c478bd9Sstevel@tonic-gate 	case AF_UNIX:
57797c478bd9Sstevel@tonic-gate 
57807c478bd9Sstevel@tonic-gate 		if (fad->fad_aupath != NULL) {
57817c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_path(fad->fad_aupath));
57827c478bd9Sstevel@tonic-gate 		} else {
57837c478bd9Sstevel@tonic-gate 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
57847c478bd9Sstevel@tonic-gate 		}
57857c478bd9Sstevel@tonic-gate 
57867c478bd9Sstevel@tonic-gate 		audit_attributes(fp->f_vnode);
57877c478bd9Sstevel@tonic-gate 
57887c478bd9Sstevel@tonic-gate 		releasef(fd);
57897c478bd9Sstevel@tonic-gate 
57907c478bd9Sstevel@tonic-gate 		return;
57917c478bd9Sstevel@tonic-gate 
57927c478bd9Sstevel@tonic-gate 	default:
57937c478bd9Sstevel@tonic-gate 		releasef(fd);
57947c478bd9Sstevel@tonic-gate 
57957c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
57967c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
57977c478bd9Sstevel@tonic-gate 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
57987c478bd9Sstevel@tonic-gate 
57997c478bd9Sstevel@tonic-gate 		return;
58007c478bd9Sstevel@tonic-gate 	}
58017c478bd9Sstevel@tonic-gate 
58027c478bd9Sstevel@tonic-gate 	releasef(fd);
58037c478bd9Sstevel@tonic-gate 
58047c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
58057c478bd9Sstevel@tonic-gate 
58067c478bd9Sstevel@tonic-gate 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
58077c478bd9Sstevel@tonic-gate }
5808657b1f3dSraf 
5809657b1f3dSraf static au_event_t
5810657b1f3dSraf aui_forksys(au_event_t e)
5811657b1f3dSraf {
5812657b1f3dSraf 	struct a {
5813657b1f3dSraf 		long	subcode;
5814657b1f3dSraf 		long	flags;
5815657b1f3dSraf 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5816657b1f3dSraf 
5817657b1f3dSraf 	switch ((uint_t)uap->subcode) {
5818657b1f3dSraf 	case 0:
5819657b1f3dSraf 		e = AUE_FORK1;
5820657b1f3dSraf 		break;
5821657b1f3dSraf 	case 1:
5822657b1f3dSraf 		e = AUE_FORKALL;
5823657b1f3dSraf 		break;
5824657b1f3dSraf 	case 2:
5825657b1f3dSraf 		e = AUE_VFORK;
5826657b1f3dSraf 		break;
5827657b1f3dSraf 	default:
5828657b1f3dSraf 		e = AUE_NULL;
5829657b1f3dSraf 		break;
5830657b1f3dSraf 	}
5831657b1f3dSraf 
5832657b1f3dSraf 	return (e);
5833657b1f3dSraf }
5834df2381bfSpraks 
5835df2381bfSpraks /*ARGSUSED*/
5836df2381bfSpraks static au_event_t
5837df2381bfSpraks aui_portfs(au_event_t e)
5838df2381bfSpraks {
5839df2381bfSpraks 	struct a {		/* portfs */
5840df2381bfSpraks 		long	a1;
5841df2381bfSpraks 		long	a2;
5842df2381bfSpraks 		long	a3;
5843df2381bfSpraks 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5844df2381bfSpraks 
5845df2381bfSpraks 	/*
5846df2381bfSpraks 	 * check opcode
5847df2381bfSpraks 	 */
5848df2381bfSpraks 	switch (((uint_t)uap->a1) & PORT_CODE_MASK) {
5849df2381bfSpraks 	case PORT_ASSOCIATE:
58508350182dSJan Friedel 		/* check source */
58518350182dSJan Friedel 		if (((uint_t)uap->a3 == PORT_SOURCE_FILE) ||
58528350182dSJan Friedel 		    ((uint_t)uap->a3 == PORT_SOURCE_FD)) {
58538350182dSJan Friedel 			e = AUE_PORTFS_ASSOCIATE;
58548350182dSJan Friedel 		} else {
58558350182dSJan Friedel 			e = AUE_NULL;
58568350182dSJan Friedel 		}
58578350182dSJan Friedel 		break;
5858df2381bfSpraks 	case PORT_DISSOCIATE:
58598350182dSJan Friedel 		/* check source */
58608350182dSJan Friedel 		if (((uint_t)uap->a3 == PORT_SOURCE_FILE) ||
58618350182dSJan Friedel 		    ((uint_t)uap->a3 == PORT_SOURCE_FD)) {
58628350182dSJan Friedel 			e = AUE_PORTFS_DISSOCIATE;
5863df2381bfSpraks 		} else {
5864df2381bfSpraks 			e = AUE_NULL;
5865df2381bfSpraks 		}
5866df2381bfSpraks 		break;
5867df2381bfSpraks 	default:
5868df2381bfSpraks 		e = AUE_NULL;
5869df2381bfSpraks 	}
5870df2381bfSpraks 	return (e);
5871df2381bfSpraks }
5872