xref: /titanic_50/usr/src/uts/common/c2/audit_event.c (revision 356f72340a69936724c69f2f87fffa6f5887f885)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright (c) 2011 Bayard G. Bell. All rights reserved.
25  */
26 
27 /*
28  * This file contains the audit event table used to control the production
29  * of audit records for each system call.
30  */
31 
32 #include <sys/policy.h>
33 #include <sys/cred.h>
34 #include <sys/types.h>
35 #include <sys/systm.h>
36 #include <sys/systeminfo.h>	/* for sysinfo auditing */
37 #include <sys/utsname.h>	/* for sysinfo auditing */
38 #include <sys/proc.h>
39 #include <sys/vnode.h>
40 #include <sys/mman.h>		/* for mmap(2) auditing etc. */
41 #include <sys/fcntl.h>
42 #include <sys/modctl.h>		/* for modctl auditing */
43 #include <sys/vnode.h>
44 #include <sys/user.h>
45 #include <sys/types.h>
46 #include <sys/processor.h>
47 #include <sys/procset.h>
48 #include <sys/acl.h>
49 #include <sys/ipc.h>
50 #include <sys/door.h>
51 #include <sys/sem.h>
52 #include <sys/msg.h>
53 #include <sys/shm.h>
54 #include <sys/kmem.h>
55 #include <sys/file.h>		/* for accept */
56 #include <sys/utssys.h>		/* for fuser */
57 #include <sys/tsol/label.h>
58 #include <sys/tsol/tndb.h>
59 #include <sys/tsol/tsyscall.h>
60 #include <c2/audit.h>
61 #include <c2/audit_kernel.h>
62 #include <c2/audit_kevents.h>
63 #include <c2/audit_record.h>
64 #include <sys/procset.h>
65 #include <nfs/mount.h>
66 #include <sys/param.h>
67 #include <sys/debug.h>
68 #include <sys/sysmacros.h>
69 #include <sys/stream.h>
70 #include <sys/strsubr.h>
71 #include <sys/stropts.h>
72 #include <sys/tihdr.h>
73 #include <sys/socket.h>
74 #include <sys/socketvar.h>
75 #include <sys/vfs_opreg.h>
76 #include <fs/sockfs/sockcommon.h>
77 #include <netinet/in.h>
78 #include <sys/ddi.h>
79 #include <sys/port_impl.h>
80 
81 static au_event_t	aui_fchownat(au_event_t);
82 static au_event_t	aui_fchmodat(au_event_t);
83 static au_event_t	aui_open(au_event_t);
84 static au_event_t	aui_openat(au_event_t);
85 static au_event_t	aui_unlinkat(au_event_t);
86 static au_event_t	aui_fstatat(au_event_t);
87 static au_event_t	aui_msgsys(au_event_t);
88 static au_event_t	aui_shmsys(au_event_t);
89 static au_event_t	aui_semsys(au_event_t);
90 static au_event_t	aui_utssys(au_event_t);
91 static au_event_t	aui_fcntl(au_event_t);
92 static au_event_t	aui_execve(au_event_t);
93 static au_event_t	aui_memcntl(au_event_t);
94 static au_event_t	aui_sysinfo(au_event_t);
95 static au_event_t	aui_portfs(au_event_t);
96 static au_event_t	aui_auditsys(au_event_t);
97 static au_event_t	aui_modctl(au_event_t);
98 static au_event_t	aui_acl(au_event_t);
99 static au_event_t	aui_doorfs(au_event_t);
100 static au_event_t	aui_privsys(au_event_t);
101 static au_event_t	aui_forksys(au_event_t);
102 static au_event_t	aui_labelsys(au_event_t);
103 static au_event_t	aui_setpgrp(au_event_t);
104 
105 static void	aus_exit(struct t_audit_data *);
106 static void	aus_open(struct t_audit_data *);
107 static void	aus_openat(struct t_audit_data *);
108 static void	aus_acl(struct t_audit_data *);
109 static void	aus_acct(struct t_audit_data *);
110 static void	aus_chown(struct t_audit_data *);
111 static void	aus_fchown(struct t_audit_data *);
112 static void	aus_lchown(struct t_audit_data *);
113 static void	aus_fchownat(struct t_audit_data *);
114 static void	aus_chmod(struct t_audit_data *);
115 static void	aus_facl(struct t_audit_data *);
116 static void	aus_fchmod(struct t_audit_data *);
117 static void	aus_fchmodat(struct t_audit_data *);
118 static void	aus_fcntl(struct t_audit_data *);
119 static void	aus_mkdir(struct t_audit_data *);
120 static void	aus_mkdirat(struct t_audit_data *);
121 static void	aus_mknod(struct t_audit_data *);
122 static void	aus_mknodat(struct t_audit_data *);
123 static void	aus_mount(struct t_audit_data *);
124 static void	aus_umount2(struct t_audit_data *);
125 static void	aus_msgsys(struct t_audit_data *);
126 static void	aus_semsys(struct t_audit_data *);
127 static void	aus_close(struct t_audit_data *);
128 static void	aus_fstatfs(struct t_audit_data *);
129 static void	aus_setgid(struct t_audit_data *);
130 static void	aus_setpgrp(struct t_audit_data *);
131 static void	aus_setuid(struct t_audit_data *);
132 static void	aus_shmsys(struct t_audit_data *);
133 static void	aus_doorfs(struct t_audit_data *);
134 static void	aus_ioctl(struct t_audit_data *);
135 static void	aus_memcntl(struct t_audit_data *);
136 static void	aus_mmap(struct t_audit_data *);
137 static void	aus_munmap(struct t_audit_data *);
138 static void	aus_priocntlsys(struct t_audit_data *);
139 static void	aus_setegid(struct t_audit_data *);
140 static void	aus_setgroups(struct t_audit_data *);
141 static void	aus_seteuid(struct t_audit_data *);
142 static void	aus_putmsg(struct t_audit_data *);
143 static void	aus_putpmsg(struct t_audit_data *);
144 static void	aus_getmsg(struct t_audit_data *);
145 static void	aus_getpmsg(struct t_audit_data *);
146 static void	aus_auditsys(struct t_audit_data *);
147 static void	aus_sysinfo(struct t_audit_data *);
148 static void	aus_modctl(struct t_audit_data *);
149 static void	aus_kill(struct t_audit_data *);
150 static void	aus_setregid(struct t_audit_data *);
151 static void	aus_setreuid(struct t_audit_data *);
152 static void	aus_labelsys(struct t_audit_data *);
153 
154 static void	auf_mknod(struct t_audit_data *, int, rval_t *);
155 static void	auf_mknodat(struct t_audit_data *, int, rval_t *);
156 static void	auf_msgsys(struct t_audit_data *, int, rval_t *);
157 static void	auf_semsys(struct t_audit_data *, int, rval_t *);
158 static void	auf_shmsys(struct t_audit_data *, int, rval_t *);
159 static void	auf_read(struct t_audit_data *, int, rval_t *);
160 static void	auf_write(struct t_audit_data *, int, rval_t *);
161 
162 static void	aus_sigqueue(struct t_audit_data *);
163 static void	aus_p_online(struct t_audit_data *);
164 static void	aus_processor_bind(struct t_audit_data *);
165 static void	aus_inst_sync(struct t_audit_data *);
166 static void	aus_brandsys(struct t_audit_data *);
167 
168 static void	auf_accept(struct t_audit_data *, int, rval_t *);
169 
170 static void	auf_bind(struct t_audit_data *, int, rval_t *);
171 static void	auf_connect(struct t_audit_data *, int, rval_t *);
172 static void	aus_shutdown(struct t_audit_data *);
173 static void	auf_setsockopt(struct t_audit_data *, int, rval_t *);
174 static void	aus_sockconfig(struct t_audit_data *);
175 static void	auf_recv(struct t_audit_data *, int, rval_t *);
176 static void	auf_recvmsg(struct t_audit_data *, int, rval_t *);
177 static void	auf_send(struct t_audit_data *, int, rval_t *);
178 static void	auf_sendmsg(struct t_audit_data *, int, rval_t *);
179 static void	auf_recvfrom(struct t_audit_data *, int, rval_t *);
180 static void	auf_sendto(struct t_audit_data *, int, rval_t *);
181 static void	aus_socket(struct t_audit_data *);
182 /*
183  * This table contains mapping information for converting system call numbers
184  * to audit event IDs. In several cases it is necessary to map a single system
185  * call to several events.
186  */
187 
188 #define	aui_null	NULL	/* NULL initialize function */
189 #define	aus_null	NULL	/* NULL start function */
190 #define	auf_null	NULL	/* NULL finish function */
191 
192 struct audit_s2e audit_s2e[] =
193 {
194 /*
195  * ----------	---------- 	----------	----------
196  * INITIAL	AUDIT		START		SYSTEM
197  * PROCESSING	EVENT		PROCESSING	CALL
198  * ----------	----------	----------	-----------
199  *		FINISH		EVENT
200  *		PROCESSING	CONTROL
201  * ----------------------------------------------------------
202  */
203 aui_null,	AUE_NULL,	aus_null,	/* 0 unused (indirect) */
204 		auf_null,	0,
205 aui_null,	AUE_EXIT,	aus_exit,	/* 1 exit */
206 		auf_null,	S2E_NPT,
207 aui_null,	AUE_NULL,	aus_null,	/* 2 (loadable) was forkall */
208 		auf_null,	0,
209 aui_null,	AUE_READ,	aus_null,	/* 3 read */
210 		auf_read,	S2E_PUB,
211 aui_null,	AUE_WRITE,	aus_null,	/* 4 write */
212 		auf_write,	0,
213 aui_open,	AUE_OPEN,	aus_open,	/* 5 open */
214 		auf_null,	S2E_SP,
215 aui_null,	AUE_CLOSE,	aus_close,	/* 6 close */
216 		auf_null,	0,
217 aui_null,	AUE_LINK,	aus_null,	/* 7 linkat */
218 		auf_null,	0,
219 aui_null,	AUE_NULL,	aus_null,	/* 8 (loadable) was creat */
220 		auf_null,	0,
221 aui_null,	AUE_LINK,	aus_null,	/* 9 link */
222 		auf_null,	0,
223 aui_null,	AUE_UNLINK,	aus_null,	/* 10 unlink */
224 		auf_null,	0,
225 aui_null,	AUE_SYMLINK,	aus_null,	/* 11 symlinkat */
226 		auf_null,	0,
227 aui_null,	AUE_CHDIR,	aus_null,	/* 12 chdir */
228 		auf_null,	S2E_SP,
229 aui_null,	AUE_NULL,	aus_null,	/* 13 time */
230 		auf_null,	0,
231 aui_null,	AUE_MKNOD,	aus_mknod,	/* 14 mknod */
232 		auf_mknod,	S2E_MLD,
233 aui_null,	AUE_CHMOD,	aus_chmod,	/* 15 chmod */
234 		auf_null,	0,
235 aui_null,	AUE_CHOWN,	aus_chown,	/* 16 chown */
236 		auf_null,	0,
237 aui_null,	AUE_NULL,	aus_null,	/* 17 brk */
238 		auf_null,	0,
239 aui_null,	AUE_STAT,	aus_null,	/* 18 stat */
240 		auf_null,	S2E_PUB,
241 aui_null,	AUE_NULL,	aus_null,	/* 19 lseek */
242 		auf_null,	0,
243 aui_null,	AUE_NULL,	aus_null,	/* 20 getpid */
244 		auf_null,	0,
245 aui_null,	AUE_MOUNT,	aus_mount,	/* 21 mount */
246 		auf_null,	S2E_MLD,
247 aui_null,	AUE_READLINK,	aus_null,	/* 22 readlinkat */
248 		auf_null,	S2E_PUB,
249 aui_null,	AUE_SETUID,	aus_setuid,	/* 23 setuid */
250 		auf_null,	0,
251 aui_null,	AUE_NULL,	aus_null,	/* 24 getuid */
252 		auf_null,	0,
253 aui_null,	AUE_STIME,	aus_null,	/* 25 stime */
254 		auf_null,	0,
255 aui_null,	AUE_NULL,	aus_null,	/* 26 pcsample */
256 		auf_null,	0,
257 aui_null,	AUE_NULL,	aus_null,	/* 27 alarm */
258 		auf_null,	0,
259 aui_null,	AUE_NULL,	aus_null,	/* 28 fstat */
260 		auf_null,	0,
261 aui_null,	AUE_NULL,	aus_null,	/* 29 pause */
262 		auf_null,	0,
263 aui_null,	AUE_NULL,	aus_null,	/* 30 (loadable) was utime */
264 		auf_null,	0,
265 aui_null,	AUE_NULL,	aus_null,	/* 31 stty (TIOCSETP-audit?) */
266 		auf_null,	0,
267 aui_null,	AUE_NULL,	aus_null,	/* 32 gtty */
268 		auf_null,	0,
269 aui_null,	AUE_ACCESS,	aus_null,	/* 33 access */
270 		auf_null,	S2E_PUB,
271 aui_null,	AUE_NICE,	aus_null,	/* 34 nice */
272 		auf_null,	0,
273 aui_null,	AUE_STATFS,	aus_null,	/* 35 statfs */
274 		auf_null,	S2E_PUB,
275 aui_null,	AUE_NULL,	aus_null,	/* 36 sync */
276 		auf_null,	0,
277 aui_null,	AUE_KILL,	aus_kill,	/* 37 kill */
278 		auf_null,	0,
279 aui_null,	AUE_FSTATFS,	aus_fstatfs,	/* 38 fstatfs */
280 		auf_null,	S2E_PUB,
281 aui_setpgrp,	AUE_SETPGRP,	aus_setpgrp,	/* 39 setpgrp */
282 		auf_null,	0,
283 aui_null,	AUE_NULL,	aus_null,	/* 40 uucopystr */
284 		auf_null,	0,
285 aui_null,	AUE_NULL,	aus_null,	/* 41 (loadable) was dup */
286 		auf_null,	0,
287 aui_null,	AUE_PIPE,	aus_null,	/* 42 (loadable) pipe */
288 		auf_null,	0,
289 aui_null,	AUE_NULL,	aus_null,	/* 43 times */
290 		auf_null,	0,
291 aui_null,	AUE_NULL,	aus_null,	/* 44 profil */
292 		auf_null,	0,
293 aui_null,	AUE_ACCESS,	aus_null,	/* 45 faccessat */
294 		auf_null,	S2E_PUB,
295 aui_null,	AUE_SETGID,	aus_setgid,	/* 46 setgid */
296 		auf_null,	0,
297 aui_null,	AUE_NULL,	aus_null,	/* 47 getgid */
298 		auf_null,	0,
299 aui_null,	AUE_MKNOD,	aus_mknodat,	/* 48 mknodat */
300 		auf_mknodat,	S2E_MLD,
301 aui_msgsys,	AUE_MSGSYS,	aus_msgsys,	/* 49 (loadable) msgsys */
302 		auf_msgsys,	0,
303 #if defined(__x86)
304 aui_null,	AUE_NULL,	aus_null,	/* 50 sysi86 */
305 		auf_null,	0,
306 #else
307 aui_null,	AUE_NULL,	aus_null,	/* 50 (loadable) was sys3b */
308 		auf_null,	0,
309 #endif /* __x86 */
310 aui_null,	AUE_ACCT,	aus_acct,	/* 51 (loadable) sysacct */
311 		auf_null,	0,
312 aui_shmsys,	AUE_SHMSYS,	aus_shmsys,	/* 52 (loadable) shmsys */
313 		auf_shmsys,	0,
314 aui_semsys,	AUE_SEMSYS,	aus_semsys,	/* 53 (loadable) semsys */
315 		auf_semsys,	0,
316 aui_null,	AUE_IOCTL,	aus_ioctl,	/* 54 ioctl */
317 		auf_null,	0,
318 aui_null,	AUE_NULL,	aus_null,	/* 55 uadmin */
319 		auf_null,	0,
320 aui_fchownat,	AUE_NULL,	aus_fchownat,	/* 56 fchownat */
321 		auf_null,	0,
322 aui_utssys,	AUE_FUSERS,	aus_null,	/* 57 utssys */
323 		auf_null,	0,
324 aui_null,	AUE_NULL,	aus_null,	/* 58 fsync */
325 		auf_null,	0,
326 aui_execve,	AUE_EXECVE,	aus_null,	/* 59 exece */
327 		auf_null,	S2E_MLD,
328 aui_null,	AUE_NULL,	aus_null,	/* 60 umask */
329 		auf_null,	0,
330 aui_null,	AUE_CHROOT,	aus_null,	/* 61 chroot */
331 		auf_null,	S2E_SP,
332 aui_fcntl,	AUE_FCNTL,	aus_fcntl,	/* 62 fcntl */
333 		auf_null,	0,
334 aui_null,	AUE_NULL,	aus_null,	/* 63 ulimit */
335 		auf_null,	0,
336 aui_null,	AUE_RENAME,	aus_null,	/* 64 renameat */
337 		auf_null,	0,
338 aui_unlinkat,	AUE_NULL,	aus_null,	/* 65 unlinkat */
339 		auf_null,	0,
340 aui_fstatat,	AUE_NULL,	aus_null,	/* 66 fstatat */
341 		auf_null,	S2E_PUB,
342 aui_fstatat,	AUE_NULL,	aus_null,	/* 67 fstatat64 */
343 		auf_null,	S2E_PUB,
344 aui_openat,	AUE_OPEN,	aus_openat,	/* 68 openat */
345 		auf_null,	S2E_SP,
346 aui_openat,	AUE_OPEN,	aus_openat,	/* 69 openat64 */
347 		auf_null,	S2E_SP,
348 aui_null,	AUE_NULL,	aus_null,	/* 70 tasksys */
349 		auf_null,	0,
350 aui_null,	AUE_NULL,	aus_null,	/* 71 (loadable) acctctl */
351 		auf_null,	0,
352 aui_null,	AUE_NULL,	aus_null,	/* 72 (loadable) exacct */
353 		auf_null,	0,
354 aui_null,	AUE_NULL,	aus_null,	/* 73 getpagesizes */
355 		auf_null,	0,
356 aui_null,	AUE_NULL,	aus_null,	/* 74 rctlsys */
357 		auf_null,	0,
358 aui_null,	AUE_NULL,	aus_null,	/* 75 sidsys */
359 		auf_null,	0,
360 aui_null,	AUE_NULL,	aus_null,	/* 76 (loadable) was fsat */
361 		auf_null,	0,
362 aui_null,	AUE_NULL,	aus_null,	/* 77 syslwp_park */
363 		auf_null,	0,
364 aui_null,	AUE_NULL,	aus_null,	/* 78 sendfilev */
365 		auf_null,	0,
366 aui_null,	AUE_RMDIR,	aus_null,	/* 79 rmdir */
367 		auf_null,	0,
368 aui_null,	AUE_MKDIR,	aus_mkdir,	/* 80 mkdir */
369 		auf_null,	0,
370 aui_null,	AUE_NULL,	aus_null,	/* 81 getdents */
371 		auf_null,	0,
372 aui_privsys,	AUE_NULL,	aus_null,	/* 82 privsys */
373 		auf_null,	0,
374 aui_null,	AUE_NULL,	aus_null,	/* 83 ucredsys */
375 		auf_null,	0,
376 aui_null,	AUE_NULL,	aus_null,	/* 84 sysfs */
377 		auf_null,	0,
378 aui_null,	AUE_GETMSG,	aus_getmsg,	/* 85 getmsg */
379 		auf_null,	0,
380 aui_null,	AUE_PUTMSG,	aus_putmsg,	/* 86 putmsg */
381 		auf_null,	0,
382 aui_null,	AUE_NULL,	aus_null,	/* 87 (loadable) was poll */
383 		auf_null,	0,
384 aui_null,	AUE_LSTAT,	aus_null,	/* 88 lstat */
385 		auf_null,	S2E_PUB,
386 aui_null,	AUE_SYMLINK,	aus_null,	/* 89 symlink */
387 		auf_null,	0,
388 aui_null,	AUE_READLINK,	aus_null,	/* 90 readlink */
389 		auf_null,	S2E_PUB,
390 aui_null,	AUE_SETGROUPS,	aus_setgroups,	/* 91 setgroups */
391 		auf_null,	0,
392 aui_null,	AUE_NULL,	aus_null,	/* 92 getgroups */
393 		auf_null,	0,
394 aui_null,	AUE_FCHMOD,	aus_fchmod,	/* 93 fchmod */
395 		auf_null,	0,
396 aui_null,	AUE_FCHOWN,	aus_fchown,	/* 94 fchown */
397 		auf_null,	0,
398 aui_null,	AUE_NULL,	aus_null,	/* 95 sigprocmask */
399 		auf_null,	0,
400 aui_null,	AUE_NULL,	aus_null,	/* 96 sigsuspend */
401 		auf_null,	0,
402 aui_null,	AUE_NULL,	aus_null,	/* 97 sigaltstack */
403 		auf_null,	0,
404 aui_null,	AUE_NULL,	aus_null,	/* 98 sigaction */
405 		auf_null,	0,
406 aui_null,	AUE_NULL,	aus_null,	/* 99 sigpending */
407 		auf_null,	0,
408 aui_null,	AUE_NULL,	aus_null,	/* 100 setcontext */
409 		auf_null,	0,
410 aui_fchmodat,	AUE_NULL,	aus_fchmodat,	/* 101 fchmodat */
411 		auf_null,	0,
412 aui_null,	AUE_MKDIR,	aus_mkdirat,	/* 102 mkdirat */
413 		auf_null,	0,
414 aui_null,	AUE_STATVFS,	aus_null,	/* 103 statvfs */
415 		auf_null,	S2E_PUB,
416 aui_null,	AUE_NULL,	aus_null,	/* 104 fstatvfs */
417 		auf_null,	0,
418 aui_null,	AUE_NULL,	aus_null,	/* 105 getloadavg */
419 		auf_null,	0,
420 aui_null,	AUE_NULL,	aus_null,	/* 106 nfssys */
421 		auf_null,	0,
422 aui_null,	AUE_NULL,	aus_null,	/* 107 waitsys */
423 		auf_null,	0,
424 aui_null,	AUE_NULL,	aus_null,	/* 108 sigsendsys */
425 		auf_null,	0,
426 #if defined(__x86)
427 aui_null,	AUE_NULL,	aus_null,	/* 109 hrtsys */
428 		auf_null,	0,
429 #else
430 aui_null,	AUE_NULL,	aus_null,	/* 109 (loadable) */
431 		auf_null,	0,
432 #endif /* __x86 */
433 aui_null,	AUE_UTIMES,	aus_null,	/* 110 utimesys */
434 		auf_null,	0,
435 aui_null,	AUE_NULL,	aus_null,	/* 111 sigresend */
436 		auf_null,	0,
437 aui_null,	AUE_PRIOCNTLSYS, aus_priocntlsys, /* 112 priocntlsys */
438 		auf_null,	0,
439 aui_null,	AUE_PATHCONF,	aus_null,	/* 113 pathconf */
440 		auf_null,	S2E_PUB,
441 aui_null,	AUE_NULL,	aus_null,	/* 114 mincore */
442 		auf_null,	0,
443 aui_null,	AUE_MMAP,	aus_mmap,	/* 115 mmap */
444 		auf_null,	0,
445 aui_null,	AUE_NULL,	aus_null,	/* 116 mprotect */
446 		auf_null,	0,
447 aui_null,	AUE_MUNMAP,	aus_munmap,	/* 117 munmap */
448 		auf_null,	0,
449 aui_null,	AUE_NULL,	aus_null,	/* 118 fpathconf */
450 		auf_null,	0,
451 aui_null,	AUE_VFORK,	aus_null,	/* 119 vfork */
452 		auf_null,	0,
453 aui_null,	AUE_FCHDIR,	aus_null,	/* 120 fchdir */
454 		auf_null,	0,
455 aui_null,	AUE_READ,	aus_null,	/* 121 readv */
456 		auf_read,	S2E_PUB,
457 aui_null,	AUE_WRITE,	aus_null,	/* 122 writev */
458 		auf_write,	0,
459 aui_null,	AUE_NULL,	aus_null,	/* 123 (loadable) was xstat */
460 		auf_null,	0,
461 aui_null,	AUE_NULL,	aus_null,	/* 124 (loadable) was lxstat */
462 		auf_null,	0,
463 aui_null,	AUE_NULL,	aus_null,	/* 125 (loadable) was fxstat */
464 		auf_null,	0,
465 aui_null,	AUE_NULL,	aus_null,	/* 126 (loadable) was xmknod */
466 		auf_null,	0,
467 aui_null,	AUE_NULL,	aus_null,	/* 127 mmapobj */
468 		auf_null,	0,
469 aui_null,	AUE_SETRLIMIT,	aus_null,	/* 128 setrlimit */
470 		auf_null,	0,
471 aui_null,	AUE_NULL,	aus_null,	/* 129 getrlimit */
472 		auf_null,	0,
473 aui_null,	AUE_LCHOWN,	aus_lchown,	/* 130 lchown */
474 		auf_null,	0,
475 aui_memcntl,	AUE_MEMCNTL,	aus_memcntl,	/* 131 memcntl */
476 		auf_null,	0,
477 aui_null,	AUE_GETPMSG,	aus_getpmsg,	/* 132 getpmsg */
478 		auf_null,	0,
479 aui_null,	AUE_PUTPMSG,	aus_putpmsg,	/* 133 putpmsg */
480 		auf_null,	0,
481 aui_null,	AUE_RENAME,	aus_null,	/* 134 rename */
482 		auf_null,	0,
483 aui_null,	AUE_NULL,	aus_null,	/* 135 uname */
484 		auf_null,	0,
485 aui_null,	AUE_SETEGID,	aus_setegid,	/* 136 setegid */
486 		auf_null,	0,
487 aui_null,	AUE_NULL,	aus_null,	/* 137 sysconfig */
488 		auf_null,	0,
489 aui_null,	AUE_ADJTIME,	aus_null,	/* 138 adjtime */
490 		auf_null,	0,
491 aui_sysinfo,	AUE_SYSINFO,	aus_sysinfo,	/* 139 systeminfo */
492 		auf_null,	0,
493 aui_null,	AUE_NULL,	aus_null,	/* 140 (loadable) sharefs */
494 		auf_null,	0,
495 aui_null,	AUE_SETEUID,	aus_seteuid,	/* 141 seteuid */
496 		auf_null,	0,
497 aui_forksys,	AUE_NULL,	aus_null,	/* 142 forksys */
498 		auf_null,	0,
499 aui_null,	AUE_NULL,	aus_null,	/* 143 (loadable) was fork1 */
500 		auf_null,	0,
501 aui_null,	AUE_NULL,	aus_null,	/* 144 sigwait */
502 		auf_null,	0,
503 aui_null,	AUE_NULL,	aus_null,	/* 145 lwp_info */
504 		auf_null,	0,
505 aui_null,	AUE_NULL,	aus_null,	/* 146 yield */
506 		auf_null,	0,
507 aui_null,	AUE_NULL,	aus_null,	/* 147 (loadable) */
508 						/*	was lwp_sema_wait */
509 		auf_null,	0,
510 aui_null,	AUE_NULL,	aus_null,	/* 148 lwp_sema_post */
511 		auf_null,	0,
512 aui_null,	AUE_NULL,	aus_null,	/* 149 lwp_sema_trywait */
513 		auf_null,	0,
514 aui_null,	AUE_NULL,	aus_null,	/* 150 lwp_detach */
515 		auf_null,	0,
516 aui_null,	AUE_NULL,	aus_null,	/* 151 corectl */
517 		auf_null,	0,
518 aui_modctl,	AUE_MODCTL,	aus_modctl,	/* 152 modctl */
519 		auf_null,	0,
520 aui_null,	AUE_FCHROOT,	aus_null,	/* 153 fchroot */
521 		auf_null,	0,
522 aui_null,	AUE_NULL,	aus_null,	/* 154 (loadable) was utimes */
523 		auf_null,	0,
524 aui_null,	AUE_NULL,	aus_null,	/* 155 vhangup */
525 		auf_null,	0,
526 aui_null,	AUE_NULL,	aus_null,	/* 156 gettimeofday */
527 		auf_null,	0,
528 aui_null,	AUE_NULL,	aus_null,	/* 157 getitimer */
529 		auf_null,	0,
530 aui_null,	AUE_NULL,	aus_null,	/* 158 setitimer */
531 		auf_null,	0,
532 aui_null,	AUE_NULL,	aus_null,	/* 159 lwp_create */
533 		auf_null,	0,
534 aui_null,	AUE_NULL,	aus_null,	/* 160 lwp_exit */
535 		auf_null,	0,
536 aui_null,	AUE_NULL,	aus_null,	/* 161 lwp_suspend */
537 		auf_null,	0,
538 aui_null,	AUE_NULL,	aus_null,	/* 162 lwp_continue */
539 		auf_null,	0,
540 aui_null,	AUE_NULL,	aus_null,	/* 163 lwp_kill */
541 		auf_null,	0,
542 aui_null,	AUE_NULL,	aus_null,	/* 164 lwp_self */
543 		auf_null,	0,
544 aui_null,	AUE_NULL,	aus_null,	/* 165 lwp_sigmask */
545 		auf_null,	0,
546 aui_null,	AUE_NULL,	aus_null,	/* 166 lwp_private */
547 		auf_null,	0,
548 aui_null,	AUE_NULL,	aus_null,	/* 167 lwp_wait */
549 		auf_null,	0,
550 aui_null,	AUE_NULL,	aus_null,	/* 168 lwp_mutex_wakeup  */
551 		auf_null,	0,
552 aui_null,	AUE_NULL,	aus_null,	/* 169 (loadable) */
553 						/*	was lwp_mutex_lock */
554 		auf_null,	0,
555 aui_null,	AUE_NULL,	aus_null,	/* 170 lwp_cond_wait */
556 		auf_null,	0,
557 aui_null,	AUE_NULL,	aus_null,	/* 171 lwp_cond_signal */
558 		auf_null,	0,
559 aui_null,	AUE_NULL,	aus_null,	/* 172 lwp_cond_broadcast */
560 		auf_null,	0,
561 aui_null,	AUE_READ,	aus_null,	/* 173 pread */
562 		auf_read,	S2E_PUB,
563 aui_null,	AUE_WRITE,	aus_null,	/* 174 pwrite */
564 		auf_write,	0,
565 aui_null,	AUE_NULL,	aus_null,	/* 175 llseek */
566 		auf_null,	0,
567 aui_null,	AUE_INST_SYNC,	aus_inst_sync,  /* 176 (loadable) inst_sync */
568 		auf_null,	0,
569 aui_null,	AUE_BRANDSYS,	aus_brandsys,	/* 177 brandsys */
570 		auf_null,	0,
571 aui_null,	AUE_NULL,	aus_null,	/* 178 (loadable) kaio */
572 		auf_null,	0,
573 aui_null,	AUE_NULL,	aus_null,	/* 179 (loadable) cpc */
574 		auf_null,	0,
575 aui_null,	AUE_NULL,	aus_null,	/* 180 lgrpsys */
576 		auf_null,	0,
577 aui_null,	AUE_NULL,	aus_null,	/* 181 rusagesys */
578 		auf_null,	0,
579 aui_portfs,	AUE_PORTFS,	aus_null,	/* 182 (loadable) portfs */
580 		auf_null,	S2E_MLD,
581 aui_null,	AUE_NULL,	aus_null,	/* 183 pollsys */
582 		auf_null,	0,
583 aui_labelsys,	AUE_NULL,	aus_labelsys,	/* 184 labelsys */
584 		auf_null,	0,
585 aui_acl,	AUE_ACLSET,	aus_acl,	/* 185 acl */
586 		auf_null,	0,
587 aui_auditsys,	AUE_AUDITSYS,	aus_auditsys,	/* 186 auditsys  */
588 		auf_null,	0,
589 aui_null,	AUE_PROCESSOR_BIND, aus_processor_bind, /* 187 processor_bind */
590 		auf_null,	0,
591 aui_null,	AUE_NULL,	aus_null,	/* 188 processor_info */
592 		auf_null,	0,
593 aui_null,	AUE_P_ONLINE,	aus_p_online,	/* 189 p_online */
594 		auf_null,	0,
595 aui_null,	AUE_NULL,	aus_sigqueue,	/* 190 sigqueue */
596 		auf_null,	0,
597 aui_null,	AUE_NULL,	aus_null,	/* 191 clock_gettime */
598 		auf_null,	0,
599 aui_null,	AUE_CLOCK_SETTIME,	aus_null,	/* 192 clock_settime */
600 		auf_null,	0,
601 aui_null,	AUE_NULL,	aus_null,	/* 193 clock_getres */
602 		auf_null,	0,
603 aui_null,	AUE_NULL,	aus_null,	/* 194 timer_create */
604 		auf_null,	0,
605 aui_null,	AUE_NULL,	aus_null,	/* 195 timer_delete */
606 		auf_null,	0,
607 aui_null,	AUE_NULL,	aus_null,	/* 196 timer_settime */
608 		auf_null,	0,
609 aui_null,	AUE_NULL,	aus_null,	/* 197 timer_gettime */
610 		auf_null,	0,
611 aui_null,	AUE_NULL,	aus_null,	/* 198 timer_getoverrun */
612 		auf_null,	0,
613 aui_null,	AUE_NULL,	aus_null,	/* 199 nanosleep */
614 		auf_null,	0,
615 aui_acl,	AUE_FACLSET,	aus_facl,	/* 200 facl */
616 		auf_null,	0,
617 aui_doorfs,	AUE_DOORFS,	aus_doorfs,	/* 201 (loadable) doorfs */
618 		auf_null,	0,
619 aui_null,	AUE_SETREUID,	aus_setreuid,	/* 202 setreuid */
620 		auf_null,	0,
621 aui_null,	AUE_SETREGID,	aus_setregid,	/* 203 setregid */
622 		auf_null,	0,
623 aui_null,	AUE_NULL,	aus_null,	/* 204 install_utrap */
624 		auf_null,	0,
625 aui_null,	AUE_NULL,	aus_null,	/* 205 signotify */
626 		auf_null,	0,
627 aui_null,	AUE_NULL,	aus_null,	/* 206 schedctl */
628 		auf_null,	0,
629 aui_null,	AUE_NULL,	aus_null,	/* 207 (loadable) pset */
630 		auf_null,	0,
631 aui_null,	AUE_NULL,	aus_null,	/* 208 sparc_utrap_install */
632 		auf_null,	0,
633 aui_null,	AUE_NULL,	aus_null,	/* 209 resolvepath */
634 		auf_null,	0,
635 aui_null,	AUE_NULL,	aus_null,	/* 210 lwp_mutex_timedlock */
636 		auf_null,	0,
637 aui_null,	AUE_NULL,	aus_null,	/* 211 lwp_sema_timedwait */
638 		auf_null,	0,
639 aui_null,	AUE_NULL,	aus_null,	/* 212 lwp_rwlock_sys */
640 		auf_null,	0,
641 aui_null,	AUE_NULL,	aus_null,	/* 213 getdents64 */
642 		auf_null,	0,
643 aui_null,	AUE_MMAP,	aus_mmap,	/* 214 mmap64 */
644 		auf_null,	0,
645 aui_null,	AUE_STAT,	aus_null,	/* 215 stat64 */
646 		auf_null,	S2E_PUB,
647 aui_null,	AUE_LSTAT,	aus_null,	/* 216 lstat64 */
648 		auf_null,	S2E_PUB,
649 aui_null,	AUE_NULL,	aus_null,	/* 217 fstat64 */
650 		auf_null,	0,
651 aui_null,	AUE_STATVFS,	aus_null,	/* 218 statvfs64 */
652 		auf_null,	S2E_PUB,
653 aui_null,	AUE_NULL,	aus_null,	/* 219 fstatvfs64 */
654 		auf_null,	0,
655 aui_null,	AUE_SETRLIMIT,	aus_null,	/* 220 setrlimit64 */
656 		auf_null,	0,
657 aui_null,	AUE_NULL,	aus_null,	/* 221 getrlimit64 */
658 		auf_null,	0,
659 aui_null,	AUE_READ,	aus_null,	/* 222 pread64  */
660 		auf_read,	S2E_PUB,
661 aui_null,	AUE_WRITE,	aus_null,	/* 223 pwrite64 */
662 		auf_write,	0,
663 aui_null,	AUE_NULL,	aus_null,	/* 224 (loadable) was creat64 */
664 		auf_null,	0,
665 aui_open,	AUE_OPEN,	aus_open,	/* 225 open64 */
666 		auf_null,	S2E_SP,
667 aui_null,	AUE_NULL,	aus_null,	/* 226 (loadable) rpcsys */
668 		auf_null,	0,
669 aui_null,	AUE_NULL,	aus_null,	/* 227 zone */
670 		auf_null,	0,
671 aui_null,	AUE_NULL,	aus_null,	/* 228 (loadable) autofssys */
672 		auf_null,	0,
673 aui_null,	AUE_NULL,	aus_null,	/* 229 getcwd */
674 		auf_null,	0,
675 aui_null,	AUE_SOCKET,	aus_socket,	/* 230 so_socket */
676 		auf_null,	0,
677 aui_null,	AUE_NULL,	aus_null,	/* 231 so_socketpair */
678 		auf_null,	0,
679 aui_null,	AUE_BIND,	aus_null,	/* 232 bind */
680 		auf_bind,	0,
681 aui_null,	AUE_NULL,	aus_null,	/* 233 listen */
682 		auf_null,	0,
683 aui_null,	AUE_ACCEPT,	aus_null,	/* 234 accept */
684 		auf_accept,	0,
685 aui_null,	AUE_CONNECT,	aus_null,	/* 235 connect */
686 		auf_connect,	0,
687 aui_null,	AUE_SHUTDOWN,	aus_shutdown,	/* 236 shutdown */
688 		auf_null,	0,
689 aui_null,	AUE_READ,	aus_null,	/* 237 recv */
690 		auf_recv,	0,
691 aui_null,	AUE_RECVFROM,	aus_null,	/* 238 recvfrom */
692 		auf_recvfrom,	0,
693 aui_null,	AUE_RECVMSG,	aus_null,	/* 239 recvmsg */
694 		auf_recvmsg,	0,
695 aui_null,	AUE_WRITE,	aus_null,	/* 240 send */
696 		auf_send,	0,
697 aui_null,	AUE_SENDMSG,	aus_null,	/* 241 sendmsg */
698 		auf_sendmsg,	0,
699 aui_null,	AUE_SENDTO,	aus_null,	/* 242 sendto */
700 		auf_sendto,	0,
701 aui_null,	AUE_NULL,	aus_null,	/* 243 getpeername */
702 		auf_null,	0,
703 aui_null,	AUE_NULL,	aus_null,	/* 244 getsockname */
704 		auf_null,	0,
705 aui_null,	AUE_NULL,	aus_null,	/* 245 getsockopt */
706 		auf_null,	0,
707 aui_null,	AUE_SETSOCKOPT,	aus_null,	/* 246 setsockopt */
708 		auf_setsockopt,	0,
709 aui_null,	AUE_SOCKCONFIG,	aus_sockconfig,	/* 247 sockconfig */
710 		auf_null,	0,
711 aui_null,	AUE_NULL,	aus_null,	/* 248 ntp_gettime */
712 		auf_null,	0,
713 aui_null,	AUE_NTP_ADJTIME, aus_null,	/* 249 ntp_adjtime */
714 		auf_null,	0,
715 aui_null,	AUE_NULL,	aus_null,	/* 250 lwp_mutex_unlock */
716 		auf_null,	0,
717 aui_null,	AUE_NULL,	aus_null,	/* 251 lwp_mutex_trylock */
718 		auf_null,	0,
719 aui_null,	AUE_NULL,	aus_null,	/* 252 lwp_mutex_register */
720 		auf_null,	0,
721 aui_null,	AUE_NULL,	aus_null,	/* 253 cladm */
722 		auf_null,	0,
723 aui_null,	AUE_NULL,	aus_null,	/* 254 uucopy */
724 		auf_null,	0,
725 aui_null,	AUE_UMOUNT2,	aus_umount2,	/* 255 umount2 */
726 		auf_null,	0
727 };
728 
729 uint_t num_syscall = sizeof (audit_s2e) / sizeof (struct audit_s2e);
730 
731 
732 /* exit start function */
733 /*ARGSUSED*/
734 static void
735 aus_exit(struct t_audit_data *tad)
736 {
737 	uint32_t rval;
738 	struct a {
739 		long rval;
740 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
741 
742 	rval = (uint32_t)uap->rval;
743 	au_uwrite(au_to_arg32(1, "exit status", rval));
744 }
745 
746 /* acct start function */
747 /*ARGSUSED*/
748 static void
749 aus_acct(struct t_audit_data *tad)
750 {
751 	klwp_t *clwp = ttolwp(curthread);
752 	uintptr_t fname;
753 
754 	struct a {
755 		long	fname;		/* char * */
756 	} *uap = (struct a *)clwp->lwp_ap;
757 
758 	fname = (uintptr_t)uap->fname;
759 
760 	if (fname == 0)
761 		au_uwrite(au_to_arg32(1, "accounting off", (uint32_t)0));
762 }
763 
764 /* chown start function */
765 /*ARGSUSED*/
766 static void
767 aus_chown(struct t_audit_data *tad)
768 {
769 	klwp_t *clwp = ttolwp(curthread);
770 	uint32_t uid, gid;
771 
772 	struct a {
773 		long	fname;		/* char * */
774 		long	uid;
775 		long	gid;
776 	} *uap = (struct a *)clwp->lwp_ap;
777 
778 	uid = (uint32_t)uap->uid;
779 	gid = (uint32_t)uap->gid;
780 
781 	au_uwrite(au_to_arg32(2, "new file uid", uid));
782 	au_uwrite(au_to_arg32(3, "new file gid", gid));
783 }
784 
785 /* fchown start function */
786 /*ARGSUSED*/
787 static void
788 aus_fchown(struct t_audit_data *tad)
789 {
790 	klwp_t *clwp = ttolwp(curthread);
791 	uint32_t uid, gid, fd;
792 	struct file  *fp;
793 	struct vnode *vp;
794 	struct f_audit_data *fad;
795 
796 	struct a {
797 		long fd;
798 		long uid;
799 		long gid;
800 	} *uap = (struct a *)clwp->lwp_ap;
801 
802 	fd  = (uint32_t)uap->fd;
803 	uid = (uint32_t)uap->uid;
804 	gid = (uint32_t)uap->gid;
805 
806 	au_uwrite(au_to_arg32(2, "new file uid", uid));
807 	au_uwrite(au_to_arg32(3, "new file gid", gid));
808 
809 		/*
810 		 * convert file pointer to file descriptor
811 		 *   Note: fd ref count incremented here.
812 		 */
813 	if ((fp = getf(fd)) == NULL)
814 		return;
815 
816 	/* get path from file struct here */
817 	fad = F2A(fp);
818 	if (fad->fad_aupath != NULL) {
819 		au_uwrite(au_to_path(fad->fad_aupath));
820 	} else {
821 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
822 	}
823 
824 	vp = fp->f_vnode;
825 	audit_attributes(vp);
826 
827 	/* decrement file descriptor reference count */
828 	releasef(fd);
829 }
830 
831 /*ARGSUSED*/
832 static void
833 aus_lchown(struct t_audit_data *tad)
834 {
835 	klwp_t *clwp = ttolwp(curthread);
836 	uint32_t uid, gid;
837 
838 
839 	struct a {
840 		long	fname;		/* char	* */
841 		long	uid;
842 		long	gid;
843 	} *uap = (struct a *)clwp->lwp_ap;
844 
845 	uid = (uint32_t)uap->uid;
846 	gid = (uint32_t)uap->gid;
847 
848 	au_uwrite(au_to_arg32(2, "new file uid", uid));
849 	au_uwrite(au_to_arg32(3, "new file gid", gid));
850 }
851 
852 static au_event_t
853 aui_fchownat(au_event_t e)
854 {
855 	klwp_t *clwp = ttolwp(curthread);
856 
857 	struct a {
858 		long	fd;
859 		long	fname;		/* char * */
860 		long	uid;
861 		long	gid;
862 		long	flags;
863 	} *uap = (struct a *)clwp->lwp_ap;
864 
865 	if (uap->fname == NULL)
866 		e = AUE_FCHOWN;
867 	else if (uap->flags & AT_SYMLINK_NOFOLLOW)
868 		e = AUE_LCHOWN;
869 	else
870 		e = AUE_CHOWN;
871 
872 	return (e);
873 }
874 
875 /*ARGSUSED*/
876 static void
877 aus_fchownat(struct t_audit_data *tad)
878 {
879 	klwp_t *clwp = ttolwp(curthread);
880 	uint32_t uid, gid;
881 
882 	struct a {
883 		long	fd;
884 		long	fname;		/* char * */
885 		long	uid;
886 		long	gid;
887 		long	flags;
888 	} *uap = (struct a *)clwp->lwp_ap;
889 
890 	uid = (uint32_t)uap->uid;
891 	gid = (uint32_t)uap->gid;
892 
893 	au_uwrite(au_to_arg32(3, "new file uid", uid));
894 	au_uwrite(au_to_arg32(4, "new file gid", gid));
895 }
896 
897 /*ARGSUSED*/
898 static void
899 aus_chmod(struct t_audit_data *tad)
900 {
901 	klwp_t *clwp = ttolwp(curthread);
902 	uint32_t fmode;
903 
904 	struct a {
905 		long	fname;		/* char	* */
906 		long	fmode;
907 	} *uap = (struct a *)clwp->lwp_ap;
908 
909 	fmode = (uint32_t)uap->fmode;
910 
911 	au_uwrite(au_to_arg32(2, "new file mode", fmode&07777));
912 }
913 
914 /*ARGSUSED*/
915 static void
916 aus_fchmod(struct t_audit_data *tad)
917 {
918 	klwp_t *clwp = ttolwp(curthread);
919 	uint32_t fmode, fd;
920 	struct file  *fp;
921 	struct vnode *vp;
922 	struct f_audit_data *fad;
923 
924 	struct a {
925 		long	fd;
926 		long	fmode;
927 	} *uap = (struct a *)clwp->lwp_ap;
928 
929 	fd = (uint32_t)uap->fd;
930 	fmode = (uint32_t)uap->fmode;
931 
932 	au_uwrite(au_to_arg32(2, "new file mode", fmode&07777));
933 
934 	/*
935 	 * convert file pointer to file descriptor
936 	 *   Note: fd ref count incremented here.
937 	 */
938 	if ((fp = getf(fd)) == NULL)
939 		return;
940 
941 	/* get path from file struct here */
942 	fad = F2A(fp);
943 	if (fad->fad_aupath != NULL) {
944 		au_uwrite(au_to_path(fad->fad_aupath));
945 	} else {
946 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
947 	}
948 
949 	vp = fp->f_vnode;
950 	audit_attributes(vp);
951 
952 	/* decrement file descriptor reference count */
953 	releasef(fd);
954 }
955 
956 static au_event_t
957 aui_fchmodat(au_event_t e)
958 {
959 	klwp_t *clwp = ttolwp(curthread);
960 
961 	struct a {
962 		long	fd;
963 		long	fname;		/* char	* */
964 		long	fmode;
965 		long	flag;
966 	} *uap = (struct a *)clwp->lwp_ap;
967 
968 	if (uap->fname == NULL)
969 		e = AUE_FCHMOD;
970 	else
971 		e = AUE_CHMOD;
972 
973 	return (e);
974 }
975 
976 /*ARGSUSED*/
977 static void
978 aus_fchmodat(struct t_audit_data *tad)
979 {
980 	klwp_t *clwp = ttolwp(curthread);
981 	uint32_t fmode;
982 	uint32_t fd;
983 	struct file  *fp;
984 	struct vnode *vp;
985 	struct f_audit_data *fad;
986 
987 	struct a {
988 		long	fd;
989 		long	fname;		/* char	* */
990 		long	fmode;
991 		long	flag;
992 	} *uap = (struct a *)clwp->lwp_ap;
993 
994 	fd = (uint32_t)uap->fd;
995 	fmode = (uint32_t)uap->fmode;
996 
997 	au_uwrite(au_to_arg32(2, "new file mode", fmode&07777));
998 
999 	if (fd == AT_FDCWD || uap->fname != NULL)	/* same as chmod() */
1000 		return;
1001 
1002 	/*
1003 	 * convert file pointer to file descriptor
1004 	 *   Note: fd ref count incremented here.
1005 	 */
1006 	if ((fp = getf(fd)) == NULL)
1007 		return;
1008 
1009 	/* get path from file struct here */
1010 	fad = F2A(fp);
1011 	if (fad->fad_aupath != NULL) {
1012 		au_uwrite(au_to_path(fad->fad_aupath));
1013 	} else {
1014 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
1015 	}
1016 
1017 	vp = fp->f_vnode;
1018 	audit_attributes(vp);
1019 
1020 	/* decrement file descriptor reference count */
1021 	releasef(fd);
1022 }
1023 
1024 /*
1025  * convert open mode to appropriate open event
1026  */
1027 au_event_t
1028 open_event(uint_t fm)
1029 {
1030 	au_event_t e;
1031 
1032 	switch (fm & (O_ACCMODE | O_CREAT | O_TRUNC)) {
1033 	case O_RDONLY:
1034 		e = AUE_OPEN_R;
1035 		break;
1036 	case O_RDONLY | O_CREAT:
1037 		e = AUE_OPEN_RC;
1038 		break;
1039 	case O_RDONLY | O_TRUNC:
1040 		e = AUE_OPEN_RT;
1041 		break;
1042 	case O_RDONLY | O_TRUNC | O_CREAT:
1043 		e = AUE_OPEN_RTC;
1044 		break;
1045 	case O_WRONLY:
1046 		e = AUE_OPEN_W;
1047 		break;
1048 	case O_WRONLY | O_CREAT:
1049 		e = AUE_OPEN_WC;
1050 		break;
1051 	case O_WRONLY | O_TRUNC:
1052 		e = AUE_OPEN_WT;
1053 		break;
1054 	case O_WRONLY | O_TRUNC | O_CREAT:
1055 		e = AUE_OPEN_WTC;
1056 		break;
1057 	case O_RDWR:
1058 		e = AUE_OPEN_RW;
1059 		break;
1060 	case O_RDWR | O_CREAT:
1061 		e = AUE_OPEN_RWC;
1062 		break;
1063 	case O_RDWR | O_TRUNC:
1064 		e = AUE_OPEN_RWT;
1065 		break;
1066 	case O_RDWR | O_TRUNC | O_CREAT:
1067 		e = AUE_OPEN_RWTC;
1068 		break;
1069 	case O_SEARCH:
1070 		e = AUE_OPEN_S;
1071 		break;
1072 	case O_EXEC:
1073 		e = AUE_OPEN_E;
1074 		break;
1075 	default:
1076 		e = AUE_NULL;
1077 		break;
1078 	}
1079 
1080 	return (e);
1081 }
1082 
1083 /* ARGSUSED */
1084 static au_event_t
1085 aui_open(au_event_t e)
1086 {
1087 	klwp_t *clwp = ttolwp(curthread);
1088 	uint_t fm;
1089 
1090 	struct a {
1091 		long	fnamep;		/* char	* */
1092 		long	fmode;
1093 		long	cmode;
1094 	} *uap = (struct a *)clwp->lwp_ap;
1095 
1096 	fm = (uint_t)uap->fmode;
1097 
1098 	return (open_event(fm));
1099 }
1100 
1101 static void
1102 aus_open(struct t_audit_data *tad)
1103 {
1104 	klwp_t *clwp = ttolwp(curthread);
1105 	uint_t fm;
1106 
1107 	struct a {
1108 		long	fnamep;		/* char	* */
1109 		long	fmode;
1110 		long	cmode;
1111 	} *uap = (struct a *)clwp->lwp_ap;
1112 
1113 	fm = (uint_t)uap->fmode;
1114 
1115 	/* If no write, create, or trunc modes, mark as a public op */
1116 	if ((fm & (O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_TRUNC)) == O_RDONLY)
1117 		tad->tad_ctrl |= TAD_PUBLIC_EV;
1118 }
1119 
1120 /* ARGSUSED */
1121 static au_event_t
1122 aui_openat(au_event_t e)
1123 {
1124 	t_audit_data_t *tad = T2A(curthread);
1125 	klwp_t *clwp = ttolwp(curthread);
1126 	uint_t fm;
1127 
1128 	struct a {
1129 		long	filedes;
1130 		long	fnamep;		/* char	* */
1131 		long	fmode;
1132 		long	cmode;
1133 	} *uap = (struct a *)clwp->lwp_ap;
1134 
1135 	fm = (uint_t)uap->fmode;
1136 
1137 	/*
1138 	 * __openattrdirat() does an extra pathname lookup in order to
1139 	 * enter the extended system attribute namespace of the referenced
1140 	 * extended attribute filename.
1141 	 */
1142 	if (fm & FXATTRDIROPEN)
1143 		tad->tad_ctrl |= TAD_MLD;
1144 
1145 	return (open_event(fm));
1146 }
1147 
1148 static void
1149 aus_openat(struct t_audit_data *tad)
1150 {
1151 	klwp_t *clwp = ttolwp(curthread);
1152 	uint_t fm;
1153 
1154 	struct a {
1155 		long	filedes;
1156 		long	fnamep;		/* char	* */
1157 		long	fmode;
1158 		long	cmode;
1159 	} *uap = (struct a *)clwp->lwp_ap;
1160 
1161 	fm = (uint_t)uap->fmode;
1162 
1163 	/* If no write, create, or trunc modes, mark as a public op */
1164 	if ((fm & (O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_TRUNC)) == O_RDONLY)
1165 		tad->tad_ctrl |= TAD_PUBLIC_EV;
1166 }
1167 
1168 static au_event_t
1169 aui_unlinkat(au_event_t e)
1170 {
1171 	klwp_t *clwp = ttolwp(curthread);
1172 
1173 	struct a {
1174 		long	filedes;
1175 		long	fnamep;		/* char	* */
1176 		long	flags;
1177 	} *uap = (struct a *)clwp->lwp_ap;
1178 
1179 	if (uap->flags & AT_REMOVEDIR)
1180 		e = AUE_RMDIR;
1181 	else
1182 		e = AUE_UNLINK;
1183 
1184 	return (e);
1185 }
1186 
1187 static au_event_t
1188 aui_fstatat(au_event_t e)
1189 {
1190 	klwp_t *clwp = ttolwp(curthread);
1191 
1192 	struct a {
1193 		long	filedes;
1194 		long	fnamep;		/* char	* */
1195 		long	statb;
1196 		long	flags;
1197 	} *uap = (struct a *)clwp->lwp_ap;
1198 
1199 	if (uap->fnamep == NULL)
1200 		e = AUE_FSTAT;
1201 	else if (uap->flags & AT_SYMLINK_NOFOLLOW)
1202 		e = AUE_LSTAT;
1203 	else
1204 		e = AUE_STAT;
1205 
1206 	return (e);
1207 }
1208 
1209 /* msgsys */
1210 static au_event_t
1211 aui_msgsys(au_event_t e)
1212 {
1213 	klwp_t *clwp = ttolwp(curthread);
1214 	uint_t fm;
1215 
1216 	struct a {
1217 		long	id;	/* function code id */
1218 		long	ap;	/* arg pointer for recvmsg */
1219 	} *uap = (struct a *)clwp->lwp_ap;
1220 
1221 	struct b {
1222 		long	msgid;
1223 		long	cmd;
1224 		long	buf;	/* struct msqid_ds * */
1225 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
1226 
1227 	fm  = (uint_t)uap->id;
1228 
1229 	switch (fm) {
1230 	case 0:		/* msgget */
1231 		e = AUE_MSGGET;
1232 		break;
1233 	case 1:		/* msgctl */
1234 		switch ((uint_t)uap1->cmd) {
1235 		case IPC_RMID:
1236 			e = AUE_MSGCTL_RMID;
1237 			break;
1238 		case IPC_SET:
1239 			e = AUE_MSGCTL_SET;
1240 			break;
1241 		case IPC_STAT:
1242 			e = AUE_MSGCTL_STAT;
1243 			break;
1244 		default:
1245 			e = AUE_MSGCTL;
1246 			break;
1247 		}
1248 		break;
1249 	case 2:		/* msgrcv */
1250 		e = AUE_MSGRCV;
1251 		break;
1252 	case 3:		/* msgsnd */
1253 		e = AUE_MSGSND;
1254 		break;
1255 	default:	/* illegal system call */
1256 		e = AUE_NULL;
1257 		break;
1258 	}
1259 
1260 	return (e);
1261 }
1262 
1263 
1264 /* shmsys */
1265 static au_event_t
1266 aui_shmsys(au_event_t e)
1267 {
1268 	klwp_t *clwp = ttolwp(curthread);
1269 	int fm;
1270 
1271 	struct a {		/* shmsys */
1272 		long	id;	/* function code id */
1273 	} *uap = (struct a *)clwp->lwp_ap;
1274 
1275 	struct b {		/* ctrl */
1276 		long	shmid;
1277 		long	cmd;
1278 		long	arg;		/* struct shmid_ds * */
1279 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
1280 	fm  = (uint_t)uap->id;
1281 
1282 	switch (fm) {
1283 	case 0:		/* shmat */
1284 		e = AUE_SHMAT;
1285 		break;
1286 	case 1:		/* shmctl */
1287 		switch ((uint_t)uap1->cmd) {
1288 		case IPC_RMID:
1289 			e = AUE_SHMCTL_RMID;
1290 			break;
1291 		case IPC_SET:
1292 			e = AUE_SHMCTL_SET;
1293 			break;
1294 		case IPC_STAT:
1295 			e = AUE_SHMCTL_STAT;
1296 			break;
1297 		default:
1298 			e = AUE_SHMCTL;
1299 			break;
1300 		}
1301 		break;
1302 	case 2:		/* shmdt */
1303 		e = AUE_SHMDT;
1304 		break;
1305 	case 3:		/* shmget */
1306 		e = AUE_SHMGET;
1307 		break;
1308 	default:	/* illegal system call */
1309 		e = AUE_NULL;
1310 		break;
1311 	}
1312 
1313 	return (e);
1314 }
1315 
1316 
1317 /* semsys */
1318 static au_event_t
1319 aui_semsys(au_event_t e)
1320 {
1321 	klwp_t *clwp = ttolwp(curthread);
1322 	uint_t fm;
1323 
1324 	struct a {		/* semsys */
1325 		long	id;
1326 	} *uap = (struct a *)clwp->lwp_ap;
1327 
1328 	struct b {		/* ctrl */
1329 		long	semid;
1330 		long	semnum;
1331 		long	cmd;
1332 		long	arg;
1333 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
1334 
1335 	fm = (uint_t)uap->id;
1336 
1337 	switch (fm) {
1338 	case 0:		/* semctl */
1339 		switch ((uint_t)uap1->cmd) {
1340 		case IPC_RMID:
1341 			e = AUE_SEMCTL_RMID;
1342 			break;
1343 		case IPC_SET:
1344 			e = AUE_SEMCTL_SET;
1345 			break;
1346 		case IPC_STAT:
1347 			e = AUE_SEMCTL_STAT;
1348 			break;
1349 		case GETNCNT:
1350 			e = AUE_SEMCTL_GETNCNT;
1351 			break;
1352 		case GETPID:
1353 			e = AUE_SEMCTL_GETPID;
1354 			break;
1355 		case GETVAL:
1356 			e = AUE_SEMCTL_GETVAL;
1357 			break;
1358 		case GETALL:
1359 			e = AUE_SEMCTL_GETALL;
1360 			break;
1361 		case GETZCNT:
1362 			e = AUE_SEMCTL_GETZCNT;
1363 			break;
1364 		case SETVAL:
1365 			e = AUE_SEMCTL_SETVAL;
1366 			break;
1367 		case SETALL:
1368 			e = AUE_SEMCTL_SETALL;
1369 			break;
1370 		default:
1371 			e = AUE_SEMCTL;
1372 			break;
1373 		}
1374 		break;
1375 	case 1:		/* semget */
1376 		e = AUE_SEMGET;
1377 		break;
1378 	case 2:		/* semop */
1379 		e = AUE_SEMOP;
1380 		break;
1381 	default:	/* illegal system call */
1382 		e = AUE_NULL;
1383 		break;
1384 	}
1385 
1386 	return (e);
1387 }
1388 
1389 /* utssys - uname(2), ustat(2), fusers(2) */
1390 static au_event_t
1391 aui_utssys(au_event_t e)
1392 {
1393 	klwp_t *clwp = ttolwp(curthread);
1394 	uint_t type;
1395 
1396 	struct a {
1397 		union {
1398 			long	cbuf;		/* char * */
1399 			long	ubuf;		/* struct stat * */
1400 		} ub;
1401 		union {
1402 			long	mv;	/* for USTAT */
1403 			long	flags;	/* for FUSERS */
1404 		} un;
1405 		long	type;
1406 		long	outbp;		/* char * for FUSERS */
1407 	} *uap = (struct a *)clwp->lwp_ap;
1408 
1409 	type = (uint_t)uap->type;
1410 
1411 	if (type == UTS_FUSERS)
1412 		return (e);
1413 	else
1414 		return ((au_event_t)AUE_NULL);
1415 }
1416 
1417 static au_event_t
1418 aui_fcntl(au_event_t e)
1419 {
1420 	klwp_t *clwp = ttolwp(curthread);
1421 	uint_t cmd;
1422 
1423 	struct a {
1424 		long	fdes;
1425 		long	cmd;
1426 		long	arg;
1427 	} *uap = (struct a *)clwp->lwp_ap;
1428 
1429 	cmd = (uint_t)uap->cmd;
1430 
1431 	switch (cmd) {
1432 	case F_GETLK:
1433 	case F_SETLK:
1434 	case F_SETLKW:
1435 		break;
1436 	case F_SETFL:
1437 	case F_GETFL:
1438 	case F_GETFD:
1439 		break;
1440 	default:
1441 		e = (au_event_t)AUE_NULL;
1442 		break;
1443 	}
1444 	return ((au_event_t)e);
1445 }
1446 
1447 /* null function for now */
1448 static au_event_t
1449 aui_execve(au_event_t e)
1450 {
1451 	return (e);
1452 }
1453 
1454 /*ARGSUSED*/
1455 static void
1456 aus_fcntl(struct t_audit_data *tad)
1457 {
1458 	klwp_t *clwp = ttolwp(curthread);
1459 	uint32_t cmd, fd, flags;
1460 	struct file  *fp;
1461 	struct vnode *vp;
1462 	struct f_audit_data *fad;
1463 
1464 	struct a {
1465 		long	fd;
1466 		long	cmd;
1467 		long	arg;
1468 	} *uap = (struct a *)clwp->lwp_ap;
1469 
1470 	cmd	= (uint32_t)uap->cmd;
1471 	fd	= (uint32_t)uap->fd;
1472 	flags	= (uint32_t)uap->arg;
1473 
1474 	au_uwrite(au_to_arg32(2, "cmd", cmd));
1475 
1476 	if (cmd == F_SETFL)
1477 		au_uwrite(au_to_arg32(3, "flags", flags));
1478 
1479 		/*
1480 		 * convert file pointer to file descriptor
1481 		 *   Note: fd ref count incremented here.
1482 		 */
1483 	if ((fp = getf(fd)) == NULL)
1484 		return;
1485 
1486 	/* get path from file struct here */
1487 	fad = F2A(fp);
1488 	if (fad->fad_aupath != NULL) {
1489 		au_uwrite(au_to_path(fad->fad_aupath));
1490 	} else {
1491 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
1492 	}
1493 
1494 	vp = fp->f_vnode;
1495 	audit_attributes(vp);
1496 
1497 	/* decrement file descriptor reference count */
1498 	releasef(fd);
1499 }
1500 
1501 /*ARGSUSED*/
1502 static void
1503 aus_kill(struct t_audit_data *tad)
1504 {
1505 	klwp_t *clwp = ttolwp(curthread);
1506 	struct proc *p;
1507 	uint32_t signo;
1508 	uid_t uid, ruid;
1509 	gid_t gid, rgid;
1510 	pid_t pid;
1511 	const auditinfo_addr_t *ainfo;
1512 	cred_t *cr;
1513 
1514 	struct a {
1515 		long	pid;
1516 		long	signo;
1517 	} *uap = (struct a *)clwp->lwp_ap;
1518 
1519 	pid   = (pid_t)uap->pid;
1520 	signo = (uint32_t)uap->signo;
1521 
1522 	au_uwrite(au_to_arg32(2, "signal", signo));
1523 	if (pid > 0) {
1524 		mutex_enter(&pidlock);
1525 		if (((p = prfind(pid)) == (struct proc *)0) ||
1526 		    (p->p_stat == SIDL)) {
1527 			mutex_exit(&pidlock);
1528 			au_uwrite(au_to_arg32(1, "process", (uint32_t)pid));
1529 			return;
1530 		}
1531 		mutex_enter(&p->p_lock); /* so process doesn't go away */
1532 		mutex_exit(&pidlock);
1533 
1534 		mutex_enter(&p->p_crlock);
1535 		crhold(cr = p->p_cred);
1536 		mutex_exit(&p->p_crlock);
1537 		mutex_exit(&p->p_lock);
1538 
1539 		ainfo = crgetauinfo(cr);
1540 		if (ainfo == NULL) {
1541 			crfree(cr);
1542 			au_uwrite(au_to_arg32(1, "process", (uint32_t)pid));
1543 			return;
1544 		}
1545 
1546 		uid  = crgetuid(cr);
1547 		gid  = crgetgid(cr);
1548 		ruid = crgetruid(cr);
1549 		rgid = crgetrgid(cr);
1550 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
1551 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
1552 
1553 		if (is_system_labeled())
1554 			au_uwrite(au_to_label(CR_SL(cr)));
1555 
1556 		crfree(cr);
1557 	}
1558 	else
1559 		au_uwrite(au_to_arg32(1, "process", (uint32_t)pid));
1560 }
1561 
1562 /*ARGSUSED*/
1563 static void
1564 aus_mkdir(struct t_audit_data *tad)
1565 {
1566 	klwp_t *clwp = ttolwp(curthread);
1567 	uint32_t dmode;
1568 
1569 	struct a {
1570 		long	dirnamep;		/* char * */
1571 		long	dmode;
1572 	} *uap = (struct a *)clwp->lwp_ap;
1573 
1574 	dmode = (uint32_t)uap->dmode;
1575 
1576 	au_uwrite(au_to_arg32(2, "mode", dmode));
1577 }
1578 
1579 /*ARGSUSED*/
1580 static void
1581 aus_mkdirat(struct t_audit_data *tad)
1582 {
1583 	klwp_t *clwp = ttolwp(curthread);
1584 	uint32_t dmode;
1585 
1586 	struct a {
1587 		long	fd;
1588 		long	dirnamep;		/* char * */
1589 		long	dmode;
1590 	} *uap = (struct a *)clwp->lwp_ap;
1591 
1592 	dmode = (uint32_t)uap->dmode;
1593 
1594 	au_uwrite(au_to_arg32(2, "mode", dmode));
1595 }
1596 
1597 /*ARGSUSED*/
1598 static void
1599 aus_mknod(struct t_audit_data *tad)
1600 {
1601 	klwp_t *clwp = ttolwp(curthread);
1602 	uint32_t fmode;
1603 	dev_t dev;
1604 
1605 	struct a {
1606 		long	pnamep;		/* char * */
1607 		long	fmode;
1608 		long	dev;
1609 	} *uap = (struct a *)clwp->lwp_ap;
1610 
1611 	fmode = (uint32_t)uap->fmode;
1612 	dev   = (dev_t)uap->dev;
1613 
1614 	au_uwrite(au_to_arg32(2, "mode", fmode));
1615 #ifdef _LP64
1616 	au_uwrite(au_to_arg64(3, "dev", dev));
1617 #else
1618 	au_uwrite(au_to_arg32(3, "dev", dev));
1619 #endif
1620 }
1621 
1622 /*ARGSUSED*/
1623 static void
1624 auf_mknod(struct t_audit_data *tad, int error, rval_t *rval)
1625 {
1626 	klwp_t *clwp = ttolwp(curthread);
1627 	vnode_t	*dvp;
1628 	caddr_t pnamep;
1629 
1630 	struct a {
1631 		long	pnamep;		/* char * */
1632 		long	fmode;
1633 		long	dev;
1634 	} *uap = (struct a *)clwp->lwp_ap;
1635 
1636 	/* no error, then already path token in audit record */
1637 	if (error != EPERM && error != EINVAL)
1638 		return;
1639 
1640 	/* do the lookup to force generation of path token */
1641 	pnamep = (caddr_t)uap->pnamep;
1642 	tad->tad_ctrl |= TAD_NOATTRB;
1643 	error = lookupname(pnamep, UIO_USERSPACE, NO_FOLLOW, &dvp, NULLVPP);
1644 	if (error == 0)
1645 		VN_RELE(dvp);
1646 }
1647 
1648 /*ARGSUSED*/
1649 static void
1650 aus_mknodat(struct t_audit_data *tad)
1651 {
1652 	klwp_t *clwp = ttolwp(curthread);
1653 	uint32_t fmode;
1654 	dev_t dev;
1655 
1656 	struct a {
1657 		long	fd;
1658 		long	pnamep;		/* char * */
1659 		long	fmode;
1660 		long	dev;
1661 	} *uap = (struct a *)clwp->lwp_ap;
1662 
1663 	fmode = (uint32_t)uap->fmode;
1664 	dev   = (dev_t)uap->dev;
1665 
1666 	au_uwrite(au_to_arg32(2, "mode", fmode));
1667 #ifdef _LP64
1668 	au_uwrite(au_to_arg64(3, "dev", dev));
1669 #else
1670 	au_uwrite(au_to_arg32(3, "dev", dev));
1671 #endif
1672 }
1673 
1674 /*ARGSUSED*/
1675 static void
1676 auf_mknodat(struct t_audit_data *tad, int error, rval_t *rval)
1677 {
1678 	klwp_t *clwp = ttolwp(curthread);
1679 	vnode_t	*startvp;
1680 	vnode_t	*dvp;
1681 	caddr_t pnamep;
1682 	int fd;
1683 
1684 	struct a {
1685 		long	fd;
1686 		long	pnamep;		/* char * */
1687 		long	fmode;
1688 		long	dev;
1689 	} *uap = (struct a *)clwp->lwp_ap;
1690 
1691 	/* no error, then already path token in audit record */
1692 	if (error != EPERM && error != EINVAL)
1693 		return;
1694 
1695 	/* do the lookup to force generation of path token */
1696 	fd = (int)uap->fd;
1697 	pnamep = (caddr_t)uap->pnamep;
1698 	if (pnamep == NULL ||
1699 	    fgetstartvp(fd, pnamep, &startvp) != 0)
1700 		return;
1701 	tad->tad_ctrl |= TAD_NOATTRB;
1702 	error = lookupnameat(pnamep, UIO_USERSPACE, NO_FOLLOW, &dvp, NULLVPP,
1703 	    startvp);
1704 	if (error == 0)
1705 		VN_RELE(dvp);
1706 	if (startvp != NULL)
1707 		VN_RELE(startvp);
1708 }
1709 
1710 /*ARGSUSED*/
1711 static void
1712 aus_mount(struct t_audit_data *tad)
1713 {	/* AUS_START */
1714 	klwp_t *clwp = ttolwp(curthread);
1715 	uint32_t flags;
1716 	uintptr_t u_fstype, dataptr;
1717 	STRUCT_DECL(nfs_args, nfsargs);
1718 	size_t len;
1719 	char *fstype, *hostname;
1720 
1721 	struct a {
1722 		long	spec;		/* char    * */
1723 		long	dir;		/* char    * */
1724 		long	flags;
1725 		long	fstype;		/* char    * */
1726 		long	dataptr;	/* char    * */
1727 		long	datalen;
1728 	} *uap = (struct a *)clwp->lwp_ap;
1729 
1730 	u_fstype = (uintptr_t)uap->fstype;
1731 	flags    = (uint32_t)uap->flags;
1732 	dataptr  = (uintptr_t)uap->dataptr;
1733 
1734 	fstype = kmem_alloc(MAXNAMELEN, KM_SLEEP);
1735 	if (copyinstr((caddr_t)u_fstype, (caddr_t)fstype, MAXNAMELEN, &len))
1736 		goto mount_free_fstype;
1737 
1738 	au_uwrite(au_to_arg32(3, "flags", flags));
1739 	au_uwrite(au_to_text(fstype));
1740 
1741 	if (strncmp(fstype, "nfs", 3) == 0) {
1742 
1743 		STRUCT_INIT(nfsargs, get_udatamodel());
1744 		bzero(STRUCT_BUF(nfsargs), STRUCT_SIZE(nfsargs));
1745 
1746 		if (copyin((caddr_t)dataptr,
1747 				STRUCT_BUF(nfsargs),
1748 				MIN(uap->datalen, STRUCT_SIZE(nfsargs)))) {
1749 			/* DEBUG debug_enter((char *)NULL); */
1750 			goto mount_free_fstype;
1751 		}
1752 		hostname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
1753 		if (copyinstr(STRUCT_FGETP(nfsargs, hostname),
1754 				(caddr_t)hostname,
1755 				MAXNAMELEN, &len)) {
1756 			goto mount_free_hostname;
1757 		}
1758 		au_uwrite(au_to_text(hostname));
1759 		au_uwrite(au_to_arg32(3, "internal flags",
1760 			(uint_t)STRUCT_FGET(nfsargs, flags)));
1761 
1762 mount_free_hostname:
1763 		kmem_free(hostname, MAXNAMELEN);
1764 	}
1765 
1766 mount_free_fstype:
1767 	kmem_free(fstype, MAXNAMELEN);
1768 }	/* AUS_MOUNT */
1769 
1770 static void
1771 aus_umount_path(caddr_t umount_dir)
1772 {
1773 	char			*dir_path;
1774 	struct audit_path	*path;
1775 	size_t			path_len, dir_len;
1776 
1777 	/* length alloc'd for two string pointers */
1778 	path_len = sizeof (struct audit_path) + sizeof (char *);
1779 	path = kmem_alloc(path_len, KM_SLEEP);
1780 	dir_path = kmem_alloc(MAXPATHLEN, KM_SLEEP);
1781 
1782 	if (copyinstr(umount_dir, (caddr_t)dir_path,
1783 	    MAXPATHLEN, &dir_len))
1784 		goto umount2_free_dir;
1785 
1786 	/*
1787 	 * the audit_path struct assumes that the buffer pointed to
1788 	 * by audp_sect[n] contains string 0 immediatedly followed
1789 	 * by string 1.
1790 	 */
1791 	path->audp_sect[0] = dir_path;
1792 	path->audp_sect[1] = dir_path + strlen(dir_path) + 1;
1793 	path->audp_size = path_len;
1794 	path->audp_ref = 1;		/* not used */
1795 	path->audp_cnt = 1;		/* one path string */
1796 
1797 	au_uwrite(au_to_path(path));
1798 
1799 umount2_free_dir:
1800 	kmem_free(dir_path, MAXPATHLEN);
1801 	kmem_free(path, path_len);
1802 }
1803 
1804 /*ARGSUSED*/
1805 static void
1806 aus_umount2(struct t_audit_data *tad)
1807 {
1808 	klwp_t			*clwp = ttolwp(curthread);
1809 	struct a {
1810 		long	dir;		/* char    * */
1811 		long	flags;
1812 	} *uap = (struct a *)clwp->lwp_ap;
1813 
1814 	aus_umount_path((caddr_t)uap->dir);
1815 
1816 	au_uwrite(au_to_arg32(2, "flags", (uint32_t)uap->flags));
1817 }
1818 
1819 static void
1820 aus_msgsys(struct t_audit_data *tad)
1821 {
1822 	klwp_t *clwp = ttolwp(curthread);
1823 	uint32_t msgid;
1824 
1825 	struct b {
1826 		long	msgid;
1827 		long	cmd;
1828 		long	buf;		/* struct msqid_ds * */
1829 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
1830 
1831 	msgid = (uint32_t)uap1->msgid;
1832 
1833 
1834 	switch (tad->tad_event) {
1835 	case AUE_MSGGET:		/* msgget */
1836 		au_uwrite(au_to_arg32(1, "msg key", msgid));
1837 		break;
1838 	case AUE_MSGCTL:		/* msgctl */
1839 	case AUE_MSGCTL_RMID:		/* msgctl */
1840 	case AUE_MSGCTL_SET:		/* msgctl */
1841 	case AUE_MSGCTL_STAT:		/* msgctl */
1842 	case AUE_MSGRCV:		/* msgrcv */
1843 	case AUE_MSGSND:		/* msgsnd */
1844 		au_uwrite(au_to_arg32(1, "msg ID", msgid));
1845 		break;
1846 	}
1847 }
1848 
1849 /*ARGSUSED*/
1850 static void
1851 auf_msgsys(struct t_audit_data *tad, int error, rval_t *rval)
1852 {
1853 	int id;
1854 
1855 	if (error != 0)
1856 		return;
1857 	if (tad->tad_event == AUE_MSGGET) {
1858 		uint32_t scid;
1859 		uint32_t sy_flags;
1860 
1861 		/* need to determine type of executing binary */
1862 		scid = tad->tad_scid;
1863 #ifdef _SYSCALL32_IMPL
1864 		if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE)
1865 			sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
1866 		else
1867 			sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK;
1868 #else
1869 		sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
1870 #endif
1871 		if (sy_flags == SE_32RVAL1)
1872 			id = rval->r_val1;
1873 		if (sy_flags == (SE_32RVAL2|SE_32RVAL1))
1874 			id = rval->r_val1;
1875 		if (sy_flags == SE_64RVAL)
1876 			id = (int)rval->r_vals;
1877 
1878 		au_uwrite(au_to_ipc(AT_IPC_MSG, id));
1879 	}
1880 }
1881 
1882 static void
1883 aus_semsys(struct t_audit_data *tad)
1884 {
1885 	klwp_t *clwp = ttolwp(curthread);
1886 	uint32_t semid;
1887 
1888 	struct b {		/* ctrl */
1889 		long	semid;
1890 		long	semnum;
1891 		long	cmd;
1892 		long	arg;
1893 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
1894 
1895 	semid = (uint32_t)uap1->semid;
1896 
1897 	switch (tad->tad_event) {
1898 	case AUE_SEMCTL_RMID:
1899 	case AUE_SEMCTL_STAT:
1900 	case AUE_SEMCTL_GETNCNT:
1901 	case AUE_SEMCTL_GETPID:
1902 	case AUE_SEMCTL_GETVAL:
1903 	case AUE_SEMCTL_GETALL:
1904 	case AUE_SEMCTL_GETZCNT:
1905 	case AUE_SEMCTL_SET:
1906 	case AUE_SEMCTL_SETVAL:
1907 	case AUE_SEMCTL_SETALL:
1908 	case AUE_SEMCTL:
1909 	case AUE_SEMOP:
1910 		au_uwrite(au_to_arg32(1, "sem ID", semid));
1911 		break;
1912 	case AUE_SEMGET:
1913 		au_uwrite(au_to_arg32(1, "sem key", semid));
1914 		break;
1915 	}
1916 }
1917 
1918 /*ARGSUSED*/
1919 static void
1920 auf_semsys(struct t_audit_data *tad, int error, rval_t *rval)
1921 {
1922 	int id;
1923 
1924 	if (error != 0)
1925 		return;
1926 	if (tad->tad_event == AUE_SEMGET) {
1927 		uint32_t scid;
1928 		uint32_t sy_flags;
1929 
1930 		/* need to determine type of executing binary */
1931 		scid = tad->tad_scid;
1932 #ifdef _SYSCALL32_IMPL
1933 		if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE)
1934 			sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
1935 		else
1936 			sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK;
1937 #else
1938 		sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
1939 #endif
1940 		if (sy_flags == SE_32RVAL1)
1941 			id = rval->r_val1;
1942 		if (sy_flags == (SE_32RVAL2|SE_32RVAL1))
1943 			id = rval->r_val1;
1944 		if (sy_flags == SE_64RVAL)
1945 			id = (int)rval->r_vals;
1946 
1947 		au_uwrite(au_to_ipc(AT_IPC_SEM, id));
1948 	}
1949 }
1950 
1951 /*ARGSUSED*/
1952 static void
1953 aus_close(struct t_audit_data *tad)
1954 {
1955 	klwp_t *clwp = ttolwp(curthread);
1956 	uint32_t fd;
1957 	struct file *fp;
1958 	struct f_audit_data *fad;
1959 	struct vnode *vp;
1960 	struct vattr attr;
1961 	au_kcontext_t	*kctx = GET_KCTX_PZ;
1962 
1963 	struct a {
1964 		long	i;
1965 	} *uap = (struct a *)clwp->lwp_ap;
1966 
1967 	fd = (uint32_t)uap->i;
1968 
1969 	attr.va_mask = 0;
1970 	au_uwrite(au_to_arg32(1, "fd", fd));
1971 
1972 		/*
1973 		 * convert file pointer to file descriptor
1974 		 *   Note: fd ref count incremented here.
1975 		 */
1976 	if ((fp = getf(fd)) == NULL)
1977 		return;
1978 
1979 	fad = F2A(fp);
1980 	tad->tad_evmod = (au_emod_t)fad->fad_flags;
1981 	if (fad->fad_aupath != NULL) {
1982 		au_uwrite(au_to_path(fad->fad_aupath));
1983 		if ((vp = fp->f_vnode) != NULL) {
1984 			attr.va_mask = AT_ALL;
1985 			if (VOP_GETATTR(vp, &attr, 0, CRED(), NULL) == 0) {
1986 				/*
1987 				 * When write was not used and the file can be
1988 				 * considered public, skip the audit.
1989 				 */
1990 				if (((fp->f_flag & FWRITE) == 0) &&
1991 				    object_is_public(&attr)) {
1992 					tad->tad_flag = 0;
1993 					tad->tad_evmod = 0;
1994 					/* free any residual audit data */
1995 					au_close(kctx, &(u_ad), 0, 0, 0, NULL);
1996 					releasef(fd);
1997 					return;
1998 				}
1999 				au_uwrite(au_to_attr(&attr));
2000 				audit_sec_attributes(&(u_ad), vp);
2001 			}
2002 		}
2003 	}
2004 
2005 	/* decrement file descriptor reference count */
2006 	releasef(fd);
2007 }
2008 
2009 /*ARGSUSED*/
2010 static void
2011 aus_fstatfs(struct t_audit_data *tad)
2012 {
2013 	klwp_t *clwp = ttolwp(curthread);
2014 	uint32_t fd;
2015 	struct file  *fp;
2016 	struct vnode *vp;
2017 	struct f_audit_data *fad;
2018 
2019 	struct a {
2020 		long	fd;
2021 		long	buf;		/* struct statfs * */
2022 	} *uap = (struct a *)clwp->lwp_ap;
2023 
2024 	fd = (uint_t)uap->fd;
2025 
2026 		/*
2027 		 * convert file pointer to file descriptor
2028 		 *   Note: fd ref count incremented here.
2029 		 */
2030 	if ((fp = getf(fd)) == NULL)
2031 		return;
2032 
2033 		/* get path from file struct here */
2034 	fad = F2A(fp);
2035 	if (fad->fad_aupath != NULL) {
2036 		au_uwrite(au_to_path(fad->fad_aupath));
2037 	} else {
2038 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
2039 	}
2040 
2041 	vp = fp->f_vnode;
2042 	audit_attributes(vp);
2043 
2044 	/* decrement file descriptor reference count */
2045 	releasef(fd);
2046 }
2047 
2048 static au_event_t
2049 aui_setpgrp(au_event_t e)
2050 {
2051 	klwp_t *clwp = ttolwp(curthread);
2052 	int flag;
2053 
2054 	struct a {
2055 		long	flag;
2056 		long	pid;
2057 		long	pgid;
2058 	} *uap = (struct a *)clwp->lwp_ap;
2059 
2060 	flag = (int)uap->flag;
2061 
2062 
2063 	switch (flag) {
2064 
2065 	case 1:	/* setpgrp() */
2066 		e = AUE_SETPGRP;
2067 		break;
2068 
2069 	case 3: /* setsid() */
2070 		e = AUE_SETSID;
2071 		break;
2072 
2073 	case 5: /* setpgid() */
2074 		e = AUE_SETPGID;
2075 		break;
2076 
2077 	case 0: /* getpgrp()	- not security relevant */
2078 	case 2: /* getsid()	- not security relevant */
2079 	case 4: /* getpgid() 	- not security relevant */
2080 		e = AUE_NULL;
2081 		break;
2082 
2083 	default:
2084 		e = AUE_NULL;
2085 		break;
2086 	}
2087 
2088 	return (e);
2089 }
2090 
2091 /*ARGSUSED*/
2092 static void
2093 aus_setpgrp(struct t_audit_data *tad)
2094 {
2095 	klwp_t		*clwp = ttolwp(curthread);
2096 	pid_t		pgid;
2097 	struct proc	*p;
2098 	uid_t		uid, ruid;
2099 	gid_t		gid, rgid;
2100 	pid_t		pid;
2101 	cred_t		*cr;
2102 	int		flag;
2103 	const auditinfo_addr_t	*ainfo;
2104 
2105 	struct a {
2106 		long	flag;
2107 		long	pid;
2108 		long	pgid;
2109 	} *uap = (struct a *)clwp->lwp_ap;
2110 
2111 	flag = (int)uap->flag;
2112 	pid  = (pid_t)uap->pid;
2113 	pgid = (pid_t)uap->pgid;
2114 
2115 
2116 	switch (flag) {
2117 
2118 	case 0: /* getpgrp() */
2119 	case 1: /* setpgrp() */
2120 	case 2: /* getsid() */
2121 	case 3: /* setsid() */
2122 	case 4: /* getpgid() */
2123 		break;
2124 
2125 	case 5: /* setpgid() */
2126 
2127 		/* current process? */
2128 		if (pid == 0) {
2129 			return;
2130 		}
2131 
2132 		mutex_enter(&pidlock);
2133 		p = prfind(pid);
2134 		if (p == NULL || p->p_as == &kas ||
2135 		    p->p_stat == SIDL || p->p_stat == SZOMB) {
2136 			mutex_exit(&pidlock);
2137 			return;
2138 		}
2139 		mutex_enter(&p->p_lock);	/* so process doesn't go away */
2140 		mutex_exit(&pidlock);
2141 
2142 		mutex_enter(&p->p_crlock);
2143 		crhold(cr = p->p_cred);
2144 		mutex_exit(&p->p_crlock);
2145 		mutex_exit(&p->p_lock);
2146 
2147 		ainfo = crgetauinfo(cr);
2148 		if (ainfo == NULL) {
2149 			crfree(cr);
2150 			return;
2151 		}
2152 
2153 		uid  = crgetuid(cr);
2154 		gid  = crgetgid(cr);
2155 		ruid = crgetruid(cr);
2156 		rgid = crgetrgid(cr);
2157 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
2158 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
2159 		crfree(cr);
2160 		au_uwrite(au_to_arg32(2, "pgid", pgid));
2161 		break;
2162 
2163 	default:
2164 		break;
2165 	}
2166 }
2167 
2168 
2169 /*ARGSUSED*/
2170 static void
2171 aus_setregid(struct t_audit_data *tad)
2172 {
2173 	klwp_t *clwp = ttolwp(curthread);
2174 	uint32_t rgid, egid;
2175 
2176 	struct a {
2177 		long	 rgid;
2178 		long	 egid;
2179 	} *uap = (struct a *)clwp->lwp_ap;
2180 
2181 	rgid  = (uint32_t)uap->rgid;
2182 	egid  = (uint32_t)uap->egid;
2183 
2184 	au_uwrite(au_to_arg32(1, "rgid", rgid));
2185 	au_uwrite(au_to_arg32(2, "egid", egid));
2186 }
2187 
2188 /*ARGSUSED*/
2189 static void
2190 aus_setgid(struct t_audit_data *tad)
2191 {
2192 	klwp_t *clwp = ttolwp(curthread);
2193 	uint32_t gid;
2194 
2195 	struct a {
2196 		long	gid;
2197 	} *uap = (struct a *)clwp->lwp_ap;
2198 
2199 	gid = (uint32_t)uap->gid;
2200 
2201 	au_uwrite(au_to_arg32(1, "gid", gid));
2202 }
2203 
2204 
2205 /*ARGSUSED*/
2206 static void
2207 aus_setreuid(struct t_audit_data *tad)
2208 {
2209 	klwp_t *clwp = ttolwp(curthread);
2210 	uint32_t ruid, euid;
2211 
2212 	struct a {
2213 		long	ruid;
2214 		long	euid;
2215 	} *uap = (struct a *)clwp->lwp_ap;
2216 
2217 	ruid = (uint32_t)uap->ruid;
2218 	euid  = (uint32_t)uap->euid;
2219 
2220 	au_uwrite(au_to_arg32(1, "ruid", ruid));
2221 	au_uwrite(au_to_arg32(2, "euid", euid));
2222 }
2223 
2224 
2225 /*ARGSUSED*/
2226 static void
2227 aus_setuid(struct t_audit_data *tad)
2228 {
2229 	klwp_t *clwp = ttolwp(curthread);
2230 	uint32_t uid;
2231 
2232 	struct a {
2233 		long	uid;
2234 	} *uap = (struct a *)clwp->lwp_ap;
2235 
2236 	uid = (uint32_t)uap->uid;
2237 
2238 	au_uwrite(au_to_arg32(1, "uid", uid));
2239 }
2240 
2241 /*ARGSUSED*/
2242 static void
2243 aus_shmsys(struct t_audit_data *tad)
2244 {
2245 	klwp_t *clwp = ttolwp(curthread);
2246 	uint32_t id, cmd;
2247 
2248 	struct b {
2249 		long	id;
2250 		long	cmd;
2251 		long	buf;		/* struct shmid_ds * */
2252 	} *uap1 = (struct b *)&clwp->lwp_ap[1];
2253 
2254 	id  = (uint32_t)uap1->id;
2255 	cmd = (uint32_t)uap1->cmd;
2256 
2257 	switch (tad->tad_event) {
2258 	case AUE_SHMGET:			/* shmget */
2259 		au_uwrite(au_to_arg32(1, "shm key", id));
2260 		break;
2261 	case AUE_SHMCTL:			/* shmctl */
2262 	case AUE_SHMCTL_RMID:			/* shmctl */
2263 	case AUE_SHMCTL_STAT:			/* shmctl */
2264 	case AUE_SHMCTL_SET:			/* shmctl */
2265 		au_uwrite(au_to_arg32(1, "shm ID", id));
2266 		break;
2267 	case AUE_SHMDT:				/* shmdt */
2268 		au_uwrite(au_to_arg32(1, "shm adr", id));
2269 		break;
2270 	case AUE_SHMAT:				/* shmat */
2271 		au_uwrite(au_to_arg32(1, "shm ID", id));
2272 		au_uwrite(au_to_arg32(2, "shm adr", cmd));
2273 		break;
2274 	}
2275 }
2276 
2277 /*ARGSUSED*/
2278 static void
2279 auf_shmsys(struct t_audit_data *tad, int error, rval_t *rval)
2280 {
2281 	int id;
2282 
2283 	if (error != 0)
2284 		return;
2285 	if (tad->tad_event == AUE_SHMGET) {
2286 		uint32_t scid;
2287 		uint32_t sy_flags;
2288 
2289 		/* need to determine type of executing binary */
2290 		scid = tad->tad_scid;
2291 #ifdef _SYSCALL32_IMPL
2292 		if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE)
2293 			sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
2294 		else
2295 			sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK;
2296 #else
2297 		sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
2298 #endif
2299 		if (sy_flags == SE_32RVAL1)
2300 			id = rval->r_val1;
2301 		if (sy_flags == (SE_32RVAL2|SE_32RVAL1))
2302 			id = rval->r_val1;
2303 		if (sy_flags == SE_64RVAL)
2304 			id = (int)rval->r_vals;
2305 		au_uwrite(au_to_ipc(AT_IPC_SHM, id));
2306 	}
2307 }
2308 
2309 
2310 /*ARGSUSED*/
2311 static void
2312 aus_ioctl(struct t_audit_data *tad)
2313 {
2314 	klwp_t *clwp = ttolwp(curthread);
2315 	struct file *fp;
2316 	struct vnode *vp;
2317 	struct f_audit_data *fad;
2318 	uint32_t fd, cmd;
2319 	uintptr_t cmarg;
2320 
2321 	/* XX64 */
2322 	struct a {
2323 		long	fd;
2324 		long	cmd;
2325 		long	cmarg;		/* caddr_t */
2326 	} *uap = (struct a *)clwp->lwp_ap;
2327 
2328 	fd    = (uint32_t)uap->fd;
2329 	cmd   = (uint32_t)uap->cmd;
2330 	cmarg = (uintptr_t)uap->cmarg;
2331 
2332 		/*
2333 		 * convert file pointer to file descriptor
2334 		 *   Note: fd ref count incremented here.
2335 		 */
2336 	if ((fp = getf(fd)) == NULL) {
2337 		au_uwrite(au_to_arg32(1, "fd", fd));
2338 		au_uwrite(au_to_arg32(2, "cmd", cmd));
2339 #ifndef _LP64
2340 			au_uwrite(au_to_arg32(3, "arg", (uint32_t)cmarg));
2341 #else
2342 			au_uwrite(au_to_arg64(3, "arg", (uint64_t)cmarg));
2343 #endif
2344 		return;
2345 	}
2346 
2347 	/* get path from file struct here */
2348 	fad = F2A(fp);
2349 	if (fad->fad_aupath != NULL) {
2350 		au_uwrite(au_to_path(fad->fad_aupath));
2351 	} else {
2352 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
2353 	}
2354 
2355 	vp = fp->f_vnode;
2356 	audit_attributes(vp);
2357 
2358 	/* decrement file descriptor reference count */
2359 	releasef(fd);
2360 
2361 	au_uwrite(au_to_arg32(2, "cmd", cmd));
2362 #ifndef _LP64
2363 		au_uwrite(au_to_arg32(3, "arg", (uint32_t)cmarg));
2364 #else
2365 		au_uwrite(au_to_arg64(3, "arg", (uint64_t)cmarg));
2366 #endif
2367 }
2368 
2369 /*
2370  * null function for memcntl for now. We might want to limit memcntl()
2371  * auditing to commands: MC_LOCKAS, MC_LOCK, MC_UNLOCKAS, MC_UNLOCK which
2372  * require privileges.
2373  */
2374 static au_event_t
2375 aui_memcntl(au_event_t e)
2376 {
2377 	return (e);
2378 }
2379 
2380 /*ARGSUSED*/
2381 static au_event_t
2382 aui_privsys(au_event_t e)
2383 {
2384 	klwp_t *clwp = ttolwp(curthread);
2385 
2386 	struct a {
2387 		long	opcode;
2388 	} *uap = (struct a *)clwp->lwp_ap;
2389 
2390 	switch (uap->opcode) {
2391 	case PRIVSYS_SETPPRIV:
2392 		return (AUE_SETPPRIV);
2393 	default:
2394 		return (AUE_NULL);
2395 	}
2396 }
2397 
2398 /*ARGSUSED*/
2399 static void
2400 aus_memcntl(struct t_audit_data *tad)
2401 {
2402 	klwp_t *clwp = ttolwp(curthread);
2403 
2404 	struct a {
2405 		long	addr;
2406 		long	len;
2407 		long	cmd;
2408 		long	arg;
2409 		long	attr;
2410 		long	mask;
2411 	} *uap = (struct a *)clwp->lwp_ap;
2412 
2413 #ifdef _LP64
2414 	au_uwrite(au_to_arg64(1, "base", (uint64_t)uap->addr));
2415 	au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len));
2416 #else
2417 	au_uwrite(au_to_arg32(1, "base", (uint32_t)uap->addr));
2418 	au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len));
2419 #endif
2420 	au_uwrite(au_to_arg32(3, "cmd", (uint_t)uap->cmd));
2421 #ifdef _LP64
2422 	au_uwrite(au_to_arg64(4, "arg", (uint64_t)uap->arg));
2423 #else
2424 	au_uwrite(au_to_arg32(4, "arg", (uint32_t)uap->arg));
2425 #endif
2426 	au_uwrite(au_to_arg32(5, "attr", (uint_t)uap->attr));
2427 	au_uwrite(au_to_arg32(6, "mask", (uint_t)uap->mask));
2428 }
2429 
2430 /*ARGSUSED*/
2431 static void
2432 aus_mmap(struct t_audit_data *tad)
2433 {
2434 	klwp_t *clwp = ttolwp(curthread);
2435 	struct file *fp;
2436 	struct f_audit_data *fad;
2437 	struct vnode *vp;
2438 	uint32_t fd;
2439 
2440 	struct a {
2441 		long	addr;
2442 		long	len;
2443 		long	prot;
2444 		long	flags;
2445 		long	fd;
2446 		long	pos;
2447 	} *uap = (struct a *)clwp->lwp_ap;
2448 
2449 	fd = (uint32_t)uap->fd;
2450 
2451 #ifdef _LP64
2452 	au_uwrite(au_to_arg64(1, "addr", (uint64_t)uap->addr));
2453 	au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len));
2454 #else
2455 	au_uwrite(au_to_arg32(1, "addr", (uint32_t)uap->addr));
2456 	au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len));
2457 #endif
2458 
2459 	if ((fp = getf(fd)) == NULL) {
2460 		au_uwrite(au_to_arg32(5, "fd", (uint32_t)uap->fd));
2461 		return;
2462 	}
2463 
2464 	/*
2465 	 * Mark in the tad if write access is NOT requested... if
2466 	 * this is later detected (in audit_attributes) to be a
2467 	 * public object, the mmap event may be discarded.
2468 	 */
2469 	if (((uap->prot) & PROT_WRITE) == 0) {
2470 		tad->tad_ctrl |= TAD_PUBLIC_EV;
2471 	}
2472 
2473 	fad = F2A(fp);
2474 	if (fad->fad_aupath != NULL) {
2475 		au_uwrite(au_to_path(fad->fad_aupath));
2476 	} else {
2477 		au_uwrite(au_to_arg32(1, "no path: fd", fd));
2478 	}
2479 
2480 	vp = (struct vnode *)fp->f_vnode;
2481 	audit_attributes(vp);
2482 
2483 	/* mark READ/WRITE since we can't predict access */
2484 	if (uap->prot & PROT_READ)
2485 		fad->fad_flags |= FAD_READ;
2486 	if (uap->prot & PROT_WRITE)
2487 		fad->fad_flags |= FAD_WRITE;
2488 
2489 	/* decrement file descriptor reference count */
2490 	releasef(fd);
2491 
2492 }	/* AUS_MMAP */
2493 
2494 
2495 
2496 
2497 /*ARGSUSED*/
2498 static void
2499 aus_munmap(struct t_audit_data *tad)
2500 {
2501 	klwp_t *clwp = ttolwp(curthread);
2502 
2503 	struct a {
2504 		long	addr;
2505 		long	len;
2506 	} *uap = (struct a *)clwp->lwp_ap;
2507 
2508 #ifdef _LP64
2509 	au_uwrite(au_to_arg64(1, "addr", (uint64_t)uap->addr));
2510 	au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len));
2511 #else
2512 	au_uwrite(au_to_arg32(1, "addr", (uint32_t)uap->addr));
2513 	au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len));
2514 #endif
2515 
2516 }	/* AUS_MUNMAP */
2517 
2518 
2519 
2520 
2521 
2522 
2523 
2524 /*ARGSUSED*/
2525 static void
2526 aus_priocntlsys(struct t_audit_data *tad)
2527 {
2528 	klwp_t *clwp = ttolwp(curthread);
2529 
2530 	struct a {
2531 		long	pc_version;
2532 		long	psp;		/* procset_t */
2533 		long	cmd;
2534 		long	arg;
2535 	} *uap = (struct a *)clwp->lwp_ap;
2536 
2537 	au_uwrite(au_to_arg32(1, "pc_version", (uint32_t)uap->pc_version));
2538 	au_uwrite(au_to_arg32(3, "cmd", (uint32_t)uap->cmd));
2539 
2540 }	/* AUS_PRIOCNTLSYS */
2541 
2542 
2543 /*ARGSUSED*/
2544 static void
2545 aus_setegid(struct t_audit_data *tad)
2546 {
2547 	klwp_t *clwp = ttolwp(curthread);
2548 	uint32_t gid;
2549 
2550 	struct a {
2551 		long	gid;
2552 	} *uap = (struct a *)clwp->lwp_ap;
2553 
2554 	gid = (uint32_t)uap->gid;
2555 
2556 	au_uwrite(au_to_arg32(1, "gid", gid));
2557 }	/* AUS_SETEGID */
2558 
2559 
2560 
2561 
2562 /*ARGSUSED*/
2563 static void
2564 aus_setgroups(struct t_audit_data *tad)
2565 {
2566 	klwp_t *clwp = ttolwp(curthread);
2567 	int i;
2568 	int gidsetsize;
2569 	uintptr_t gidset;
2570 	gid_t *gidlist;
2571 
2572 	struct a {
2573 		long	gidsetsize;
2574 		long	gidset;
2575 	} *uap = (struct a *)clwp->lwp_ap;
2576 
2577 	gidsetsize = (uint_t)uap->gidsetsize;
2578 	gidset = (uintptr_t)uap->gidset;
2579 
2580 	if ((gidsetsize > NGROUPS_MAX_DEFAULT) || (gidsetsize < 0))
2581 		return;
2582 	if (gidsetsize != 0) {
2583 		gidlist = kmem_alloc(gidsetsize * sizeof (gid_t),
2584 		    KM_SLEEP);
2585 		if (copyin((caddr_t)gidset, gidlist,
2586 		    gidsetsize * sizeof (gid_t)) == 0)
2587 			for (i = 0; i < gidsetsize; i++)
2588 				au_uwrite(au_to_arg32(1, "setgroups",
2589 				    (uint32_t)gidlist[i]));
2590 		kmem_free(gidlist, gidsetsize * sizeof (gid_t));
2591 	} else
2592 		au_uwrite(au_to_arg32(1, "setgroups", (uint32_t)0));
2593 
2594 }	/* AUS_SETGROUPS */
2595 
2596 
2597 
2598 
2599 
2600 /*ARGSUSED*/
2601 static void
2602 aus_seteuid(struct t_audit_data *tad)
2603 {
2604 	klwp_t *clwp = ttolwp(curthread);
2605 	uint32_t uid;
2606 
2607 	struct a {
2608 		long	uid;
2609 	} *uap = (struct a *)clwp->lwp_ap;
2610 
2611 	uid = (uint32_t)uap->uid;
2612 
2613 	au_uwrite(au_to_arg32(1, "euid", uid));
2614 
2615 }	/* AUS_SETEUID */
2616 
2617 /*ARGSUSED*/
2618 static void
2619 aus_putmsg(struct t_audit_data *tad)
2620 {
2621 	klwp_t *clwp = ttolwp(curthread);
2622 	uint32_t fd, pri;
2623 	struct file *fp;
2624 	struct f_audit_data *fad;
2625 
2626 	struct a {
2627 		long	fdes;
2628 		long	ctl;		/* struct strbuf * */
2629 		long	data;		/* struct strbuf * */
2630 		long	pri;
2631 	} *uap = (struct a *)clwp->lwp_ap;
2632 
2633 	fd  = (uint32_t)uap->fdes;
2634 	pri = (uint32_t)uap->pri;
2635 
2636 	au_uwrite(au_to_arg32(1, "fd", fd));
2637 
2638 	if ((fp = getf(fd)) != NULL) {
2639 		fad = F2A(fp);
2640 
2641 		fad->fad_flags |= FAD_WRITE;
2642 
2643 		/* add path name to audit record */
2644 		if (fad->fad_aupath != NULL) {
2645 			au_uwrite(au_to_path(fad->fad_aupath));
2646 		}
2647 		audit_attributes(fp->f_vnode);
2648 
2649 		releasef(fd);
2650 	}
2651 
2652 	au_uwrite(au_to_arg32(4, "pri", pri));
2653 }
2654 
2655 /*ARGSUSED*/
2656 static void
2657 aus_putpmsg(struct t_audit_data *tad)
2658 {
2659 	klwp_t *clwp = ttolwp(curthread);
2660 	uint32_t fd, pri, flags;
2661 	struct file *fp;
2662 	struct f_audit_data *fad;
2663 
2664 	struct a {
2665 		long	fdes;
2666 		long	ctl;		/* struct strbuf * */
2667 		long	data;		/* struct strbuf * */
2668 		long	pri;
2669 		long	flags;
2670 	} *uap = (struct a *)clwp->lwp_ap;
2671 
2672 	fd = (uint32_t)uap->fdes;
2673 	pri  = (uint32_t)uap->pri;
2674 	flags  = (uint32_t)uap->flags;
2675 
2676 	au_uwrite(au_to_arg32(1, "fd", fd));
2677 
2678 	if ((fp = getf(fd)) != NULL) {
2679 		fad = F2A(fp);
2680 
2681 		fad->fad_flags |= FAD_WRITE;
2682 
2683 		/* add path name to audit record */
2684 		if (fad->fad_aupath != NULL) {
2685 			au_uwrite(au_to_path(fad->fad_aupath));
2686 		}
2687 		audit_attributes(fp->f_vnode);
2688 
2689 		releasef(fd);
2690 	}
2691 
2692 
2693 	au_uwrite(au_to_arg32(4, "pri", pri));
2694 	au_uwrite(au_to_arg32(5, "flags", flags));
2695 }
2696 
2697 /*ARGSUSED*/
2698 static void
2699 aus_getmsg(struct t_audit_data *tad)
2700 {
2701 	klwp_t *clwp = ttolwp(curthread);
2702 	uint32_t fd, pri;
2703 	struct file *fp;
2704 	struct f_audit_data *fad;
2705 
2706 	struct a {
2707 		long	fdes;
2708 		long	ctl;		/* struct strbuf * */
2709 		long	data;		/* struct strbuf * */
2710 		long	pri;
2711 	} *uap = (struct a *)clwp->lwp_ap;
2712 
2713 	fd  = (uint32_t)uap->fdes;
2714 	pri = (uint32_t)uap->pri;
2715 
2716 	au_uwrite(au_to_arg32(1, "fd", fd));
2717 
2718 	if ((fp = getf(fd)) != NULL) {
2719 		fad = F2A(fp);
2720 
2721 		/*
2722 		 * read operation on this object
2723 		 */
2724 		fad->fad_flags |= FAD_READ;
2725 
2726 		/* add path name to audit record */
2727 		if (fad->fad_aupath != NULL) {
2728 			au_uwrite(au_to_path(fad->fad_aupath));
2729 		}
2730 		audit_attributes(fp->f_vnode);
2731 
2732 		releasef(fd);
2733 	}
2734 
2735 	au_uwrite(au_to_arg32(4, "pri", pri));
2736 }
2737 
2738 /*ARGSUSED*/
2739 static void
2740 aus_getpmsg(struct t_audit_data *tad)
2741 {
2742 	klwp_t *clwp = ttolwp(curthread);
2743 	uint32_t fd;
2744 	struct file *fp;
2745 	struct f_audit_data *fad;
2746 
2747 	struct a {
2748 		long	fdes;
2749 		long	ctl;		/* struct strbuf * */
2750 		long	data;		/* struct strbuf * */
2751 		long	pri;
2752 		long	flags;
2753 	} *uap = (struct a *)clwp->lwp_ap;
2754 
2755 	fd = (uint32_t)uap->fdes;
2756 
2757 	au_uwrite(au_to_arg32(1, "fd", fd));
2758 
2759 	if ((fp = getf(fd)) != NULL) {
2760 		fad = F2A(fp);
2761 
2762 		/*
2763 		 * read operation on this object
2764 		 */
2765 		fad->fad_flags |= FAD_READ;
2766 
2767 		/* add path name to audit record */
2768 		if (fad->fad_aupath != NULL) {
2769 			au_uwrite(au_to_path(fad->fad_aupath));
2770 		}
2771 		audit_attributes(fp->f_vnode);
2772 
2773 		releasef(fd);
2774 	}
2775 }
2776 
2777 static au_event_t
2778 aui_labelsys(au_event_t e)
2779 {
2780 	klwp_t *clwp = ttolwp(curthread);
2781 	uint32_t code;
2782 	uint32_t cmd;
2783 
2784 	struct a {
2785 		long	code;
2786 		long	cmd;
2787 	} *uap = (struct a *)clwp->lwp_ap;
2788 
2789 	code = (uint32_t)uap->code;
2790 	cmd = (uint32_t)uap->cmd;
2791 
2792 	/* not security relevant if not changing kernel cache */
2793 	if (cmd == TNDB_GET)
2794 		return (AUE_NULL);
2795 
2796 	switch (code) {
2797 	case TSOL_TNRH:
2798 		e = AUE_LABELSYS_TNRH;
2799 		break;
2800 	case TSOL_TNRHTP:
2801 		e = AUE_LABELSYS_TNRHTP;
2802 		break;
2803 	case TSOL_TNMLP:
2804 		e = AUE_LABELSYS_TNMLP;
2805 		break;
2806 	default:
2807 		e = AUE_NULL;
2808 		break;
2809 	}
2810 
2811 	return (e);
2812 
2813 }
2814 
2815 static void
2816 aus_labelsys(struct t_audit_data *tad)
2817 {
2818 	klwp_t *clwp = ttolwp(curthread);
2819 	uint32_t cmd;
2820 	uintptr_t a2;
2821 
2822 	struct a {
2823 		long	code;
2824 		long	cmd;
2825 		long	a2;
2826 	} *uap = (struct a *)clwp->lwp_ap;
2827 
2828 	cmd = (uint32_t)uap->cmd;
2829 	a2 = (uintptr_t)uap->a2;
2830 
2831 	switch (tad->tad_event) {
2832 	case AUE_LABELSYS_TNRH:
2833 	{
2834 		tsol_rhent_t	*rhent;
2835 		tnaddr_t	*rh_addr;
2836 
2837 		au_uwrite(au_to_arg32(1, "cmd", cmd));
2838 
2839 		/* Remaining args don't apply for FLUSH, so skip */
2840 		if (cmd == TNDB_FLUSH)
2841 			break;
2842 
2843 		rhent = kmem_alloc(sizeof (tsol_rhent_t), KM_SLEEP);
2844 		if (copyin((caddr_t)a2, rhent, sizeof (tsol_rhent_t))) {
2845 			kmem_free(rhent, sizeof (tsol_rhent_t));
2846 			return;
2847 		}
2848 
2849 		rh_addr = &rhent->rh_address;
2850 		if (rh_addr->ta_family == AF_INET) {
2851 			struct in_addr	*ipaddr;
2852 
2853 			ipaddr = &(rh_addr->ta_addr_v4);
2854 			au_uwrite(au_to_in_addr(ipaddr));
2855 		} else if (rh_addr->ta_family == AF_INET6) {
2856 			int32_t		*ipaddr;
2857 
2858 			ipaddr = (int32_t *)&(rh_addr->ta_addr_v6);
2859 			au_uwrite(au_to_in_addr_ex(ipaddr));
2860 		}
2861 		au_uwrite(au_to_arg32(2, "prefix len", rhent->rh_prefix));
2862 
2863 		kmem_free(rhent, sizeof (tsol_rhent_t));
2864 
2865 		break;
2866 	}
2867 	case AUE_LABELSYS_TNRHTP:
2868 	{
2869 		tsol_tpent_t	*tpent;
2870 
2871 		au_uwrite(au_to_arg32(1, "cmd", cmd));
2872 
2873 		/* Remaining args don't apply for FLUSH, so skip */
2874 		if (cmd == TNDB_FLUSH)
2875 			break;
2876 
2877 		tpent = kmem_alloc(sizeof (tsol_tpent_t), KM_SLEEP);
2878 		if (copyin((caddr_t)a2, tpent, sizeof (tsol_tpent_t))) {
2879 			kmem_free(tpent, sizeof (tsol_tpent_t));
2880 			return;
2881 		}
2882 
2883 		/* Make sure that the template name is null-terminated. */
2884 		*(tpent->name + TNTNAMSIZ - 1) = '\0';
2885 
2886 		au_uwrite(au_to_text(tpent->name));
2887 		kmem_free(tpent, sizeof (tsol_tpent_t));
2888 
2889 		break;
2890 	}
2891 	case AUE_LABELSYS_TNMLP:
2892 	{
2893 		tsol_mlpent_t	*mlpent;
2894 
2895 		au_uwrite(au_to_arg32(1, "cmd", cmd));
2896 
2897 		mlpent = kmem_alloc(sizeof (tsol_mlpent_t), KM_SLEEP);
2898 		if (copyin((caddr_t)a2, mlpent, sizeof (tsol_mlpent_t))) {
2899 			kmem_free(mlpent, sizeof (tsol_mlpent_t));
2900 			return;
2901 		}
2902 
2903 		if (mlpent->tsme_flags & TSOL_MEF_SHARED) {
2904 			au_uwrite(au_to_text("shared"));
2905 		} else {
2906 			zone_t	*zone;
2907 
2908 			zone = zone_find_by_id(mlpent->tsme_zoneid);
2909 			if (zone != NULL) {
2910 				au_uwrite(au_to_text(zone->zone_name));
2911 				zone_rele(zone);
2912 			}
2913 		}
2914 
2915 		/* Remaining args don't apply for FLUSH, so skip */
2916 		if (cmd == TNDB_FLUSH) {
2917 			kmem_free(mlpent, sizeof (tsol_mlpent_t));
2918 			break;
2919 		}
2920 
2921 		au_uwrite(au_to_arg32(2, "proto num",
2922 		    (uint32_t)mlpent->tsme_mlp.mlp_ipp));
2923 		au_uwrite(au_to_arg32(2, "mlp_port",
2924 		    (uint32_t)mlpent->tsme_mlp.mlp_port));
2925 
2926 		if (mlpent->tsme_mlp.mlp_port_upper != 0)
2927 			au_uwrite(au_to_arg32(2, "mlp_port_upper",
2928 			    (uint32_t)mlpent->tsme_mlp.mlp_port_upper));
2929 
2930 		kmem_free(mlpent, sizeof (tsol_mlpent_t));
2931 
2932 		break;
2933 	}
2934 	default:
2935 		break;
2936 	}
2937 }
2938 
2939 
2940 static au_event_t
2941 aui_auditsys(au_event_t e)
2942 {
2943 	klwp_t *clwp = ttolwp(curthread);
2944 	uint32_t code;
2945 
2946 	struct a {
2947 		long	code;
2948 		long	a1;
2949 		long	a2;
2950 		long	a3;
2951 		long	a4;
2952 		long	a5;
2953 		long	a6;
2954 		long	a7;
2955 	} *uap = (struct a *)clwp->lwp_ap;
2956 
2957 	code = (uint32_t)uap->code;
2958 
2959 	switch (code) {
2960 
2961 	case BSM_GETAUID:
2962 		e = AUE_GETAUID;
2963 		break;
2964 	case BSM_SETAUID:
2965 		e = AUE_SETAUID;
2966 		break;
2967 	case BSM_GETAUDIT:
2968 		e = AUE_GETAUDIT;
2969 		break;
2970 	case BSM_GETAUDIT_ADDR:
2971 		e = AUE_GETAUDIT_ADDR;
2972 		break;
2973 	case BSM_SETAUDIT:
2974 		e = AUE_SETAUDIT;
2975 		break;
2976 	case BSM_SETAUDIT_ADDR:
2977 		e = AUE_SETAUDIT_ADDR;
2978 		break;
2979 	case BSM_AUDIT:
2980 		e = AUE_AUDIT;
2981 		break;
2982 	case BSM_AUDITCTL:
2983 		switch ((uint_t)uap->a1) {
2984 
2985 		case A_GETPOLICY:
2986 			e = AUE_AUDITON_GPOLICY;
2987 			break;
2988 		case A_SETPOLICY:
2989 			e = AUE_AUDITON_SPOLICY;
2990 			break;
2991 		case A_GETAMASK:
2992 			e = AUE_AUDITON_GETAMASK;
2993 			break;
2994 		case A_SETAMASK:
2995 			e = AUE_AUDITON_SETAMASK;
2996 			break;
2997 		case A_GETKMASK:
2998 			e = AUE_AUDITON_GETKMASK;
2999 			break;
3000 		case A_SETKMASK:
3001 			e = AUE_AUDITON_SETKMASK;
3002 			break;
3003 		case A_GETQCTRL:
3004 			e = AUE_AUDITON_GQCTRL;
3005 			break;
3006 		case A_SETQCTRL:
3007 			e = AUE_AUDITON_SQCTRL;
3008 			break;
3009 		case A_GETCWD:
3010 			e = AUE_AUDITON_GETCWD;
3011 			break;
3012 		case A_GETCAR:
3013 			e = AUE_AUDITON_GETCAR;
3014 			break;
3015 		case A_GETSTAT:
3016 			e = AUE_AUDITON_GETSTAT;
3017 			break;
3018 		case A_SETSTAT:
3019 			e = AUE_AUDITON_SETSTAT;
3020 			break;
3021 		case A_SETUMASK:
3022 			e = AUE_AUDITON_SETUMASK;
3023 			break;
3024 		case A_SETSMASK:
3025 			e = AUE_AUDITON_SETSMASK;
3026 			break;
3027 		case A_GETCOND:
3028 			e = AUE_AUDITON_GETCOND;
3029 			break;
3030 		case A_SETCOND:
3031 			e = AUE_AUDITON_SETCOND;
3032 			break;
3033 		case A_GETCLASS:
3034 			e = AUE_AUDITON_GETCLASS;
3035 			break;
3036 		case A_SETCLASS:
3037 			e = AUE_AUDITON_SETCLASS;
3038 			break;
3039 		default:
3040 			e = AUE_NULL;
3041 			break;
3042 		}
3043 		break;
3044 	default:
3045 		e = AUE_NULL;
3046 		break;
3047 	}
3048 
3049 	return (e);
3050 
3051 }	/* AUI_AUDITSYS */
3052 
3053 
3054 static void
3055 aus_auditsys(struct t_audit_data *tad)
3056 {
3057 	klwp_t *clwp = ttolwp(curthread);
3058 	uintptr_t a1, a2;
3059 	STRUCT_DECL(auditinfo, ainfo);
3060 	STRUCT_DECL(auditinfo_addr, ainfo_addr);
3061 	au_evclass_map_t event;
3062 	au_mask_t mask;
3063 	int auditstate, policy;
3064 	au_id_t auid;
3065 
3066 
3067 	struct a {
3068 		long	code;
3069 		long	a1;
3070 		long	a2;
3071 		long	a3;
3072 		long	a4;
3073 		long	a5;
3074 		long	a6;
3075 		long	a7;
3076 	} *uap = (struct a *)clwp->lwp_ap;
3077 
3078 	a1   = (uintptr_t)uap->a1;
3079 	a2   = (uintptr_t)uap->a2;
3080 
3081 	switch (tad->tad_event) {
3082 	case AUE_SETAUID:
3083 		if (copyin((caddr_t)a1, &auid, sizeof (au_id_t)))
3084 				return;
3085 		au_uwrite(au_to_arg32(2, "setauid", auid));
3086 		break;
3087 	case AUE_SETAUDIT:
3088 		STRUCT_INIT(ainfo, get_udatamodel());
3089 		if (copyin((caddr_t)a1, STRUCT_BUF(ainfo),
3090 		    STRUCT_SIZE(ainfo))) {
3091 				return;
3092 		}
3093 		au_uwrite(au_to_arg32((char)1, "setaudit:auid",
3094 		    (uint32_t)STRUCT_FGET(ainfo, ai_auid)));
3095 #ifdef _LP64
3096 		au_uwrite(au_to_arg64((char)1, "setaudit:port",
3097 		    (uint64_t)STRUCT_FGET(ainfo, ai_termid.port)));
3098 #else
3099 		au_uwrite(au_to_arg32((char)1, "setaudit:port",
3100 		    (uint32_t)STRUCT_FGET(ainfo, ai_termid.port)));
3101 #endif
3102 		au_uwrite(au_to_arg32((char)1, "setaudit:machine",
3103 		    (uint32_t)STRUCT_FGET(ainfo, ai_termid.machine)));
3104 		au_uwrite(au_to_arg32((char)1, "setaudit:as_success",
3105 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success)));
3106 		au_uwrite(au_to_arg32((char)1, "setaudit:as_failure",
3107 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure)));
3108 		au_uwrite(au_to_arg32((char)1, "setaudit:asid",
3109 		    (uint32_t)STRUCT_FGET(ainfo, ai_asid)));
3110 		break;
3111 	case AUE_SETAUDIT_ADDR:
3112 		STRUCT_INIT(ainfo_addr, get_udatamodel());
3113 		if (copyin((caddr_t)a1, STRUCT_BUF(ainfo_addr),
3114 		    STRUCT_SIZE(ainfo_addr))) {
3115 				return;
3116 		}
3117 		au_uwrite(au_to_arg32((char)1, "auid",
3118 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_auid)));
3119 #ifdef _LP64
3120 		au_uwrite(au_to_arg64((char)1, "port",
3121 		    (uint64_t)STRUCT_FGET(ainfo_addr, ai_termid.at_port)));
3122 #else
3123 		au_uwrite(au_to_arg32((char)1, "port",
3124 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_port)));
3125 #endif
3126 		au_uwrite(au_to_arg32((char)1, "type",
3127 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_type)));
3128 		if ((uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_type) ==
3129 		    AU_IPv4) {
3130 			au_uwrite(au_to_in_addr(
3131 			    (struct in_addr *)STRUCT_FGETP(ainfo_addr,
3132 			    ai_termid.at_addr)));
3133 		} else {
3134 			au_uwrite(au_to_in_addr_ex(
3135 			    (int32_t *)STRUCT_FGETP(ainfo_addr,
3136 			    ai_termid.at_addr)));
3137 		}
3138 		au_uwrite(au_to_arg32((char)1, "as_success",
3139 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_mask.as_success)));
3140 		au_uwrite(au_to_arg32((char)1, "as_failure",
3141 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_mask.as_failure)));
3142 		au_uwrite(au_to_arg32((char)1, "asid",
3143 		    (uint32_t)STRUCT_FGET(ainfo_addr, ai_asid)));
3144 		break;
3145 	case AUE_AUDITON_SETAMASK:
3146 		if (copyin((caddr_t)a2, &mask, sizeof (au_mask_t)))
3147 				return;
3148 		au_uwrite(au_to_arg32(
3149 		    2, "setamask:as_success", (uint32_t)mask.as_success));
3150 		au_uwrite(au_to_arg32(
3151 		    2, "setamask:as_failure", (uint32_t)mask.as_failure));
3152 		break;
3153 	case AUE_AUDITON_SETKMASK:
3154 		if (copyin((caddr_t)a2, &mask, sizeof (au_mask_t)))
3155 				return;
3156 		au_uwrite(au_to_arg32(
3157 		    2, "setkmask:as_success", (uint32_t)mask.as_success));
3158 		au_uwrite(au_to_arg32(
3159 		    2, "setkmask:as_failure", (uint32_t)mask.as_failure));
3160 		break;
3161 	case AUE_AUDITON_SPOLICY:
3162 		if (copyin((caddr_t)a2, &policy, sizeof (int)))
3163 			return;
3164 		au_uwrite(au_to_arg32(3, "setpolicy", (uint32_t)policy));
3165 		break;
3166 	case AUE_AUDITON_SQCTRL: {
3167 		STRUCT_DECL(au_qctrl, qctrl);
3168 		model_t model;
3169 
3170 		model = get_udatamodel();
3171 		STRUCT_INIT(qctrl, model);
3172 		if (copyin((caddr_t)a2, STRUCT_BUF(qctrl), STRUCT_SIZE(qctrl)))
3173 				return;
3174 		if (model == DATAMODEL_ILP32) {
3175 			au_uwrite(au_to_arg32(
3176 			    3, "setqctrl:aq_hiwater",
3177 			    (uint32_t)STRUCT_FGET(qctrl, aq_hiwater)));
3178 			au_uwrite(au_to_arg32(
3179 			    3, "setqctrl:aq_lowater",
3180 			    (uint32_t)STRUCT_FGET(qctrl, aq_lowater)));
3181 			au_uwrite(au_to_arg32(
3182 			    3, "setqctrl:aq_bufsz",
3183 			    (uint32_t)STRUCT_FGET(qctrl, aq_bufsz)));
3184 			au_uwrite(au_to_arg32(
3185 			    3, "setqctrl:aq_delay",
3186 			    (uint32_t)STRUCT_FGET(qctrl, aq_delay)));
3187 		} else {
3188 			au_uwrite(au_to_arg64(
3189 			    3, "setqctrl:aq_hiwater",
3190 			    (uint64_t)STRUCT_FGET(qctrl, aq_hiwater)));
3191 			au_uwrite(au_to_arg64(
3192 			    3, "setqctrl:aq_lowater",
3193 			    (uint64_t)STRUCT_FGET(qctrl, aq_lowater)));
3194 			au_uwrite(au_to_arg64(
3195 			    3, "setqctrl:aq_bufsz",
3196 			    (uint64_t)STRUCT_FGET(qctrl, aq_bufsz)));
3197 			au_uwrite(au_to_arg64(
3198 			    3, "setqctrl:aq_delay",
3199 			    (uint64_t)STRUCT_FGET(qctrl, aq_delay)));
3200 		}
3201 		break;
3202 	}
3203 	case AUE_AUDITON_SETUMASK:
3204 		STRUCT_INIT(ainfo, get_udatamodel());
3205 		if (copyin((caddr_t)uap->a2, STRUCT_BUF(ainfo),
3206 		    STRUCT_SIZE(ainfo))) {
3207 			return;
3208 		}
3209 		au_uwrite(au_to_arg32(3, "setumask:as_success",
3210 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success)));
3211 		au_uwrite(au_to_arg32(3, "setumask:as_failure",
3212 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure)));
3213 		break;
3214 	case AUE_AUDITON_SETSMASK:
3215 		STRUCT_INIT(ainfo, get_udatamodel());
3216 		if (copyin((caddr_t)uap->a2, STRUCT_BUF(ainfo),
3217 		    STRUCT_SIZE(ainfo))) {
3218 			return;
3219 		}
3220 		au_uwrite(au_to_arg32(3, "setsmask:as_success",
3221 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success)));
3222 		au_uwrite(au_to_arg32(3, "setsmask:as_failure",
3223 		    (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure)));
3224 		break;
3225 	case AUE_AUDITON_SETCOND:
3226 		if (copyin((caddr_t)a2, &auditstate, sizeof (int)))
3227 			return;
3228 		au_uwrite(au_to_arg32(3, "setcond", (uint32_t)auditstate));
3229 		break;
3230 	case AUE_AUDITON_SETCLASS:
3231 		if (copyin((caddr_t)a2, &event, sizeof (au_evclass_map_t)))
3232 			return;
3233 		au_uwrite(au_to_arg32(
3234 		    2, "setclass:ec_event", (uint32_t)event.ec_number));
3235 		au_uwrite(au_to_arg32(
3236 		    3, "setclass:ec_class", (uint32_t)event.ec_class));
3237 		break;
3238 	case AUE_GETAUID:
3239 	case AUE_GETAUDIT:
3240 	case AUE_GETAUDIT_ADDR:
3241 	case AUE_AUDIT:
3242 	case AUE_AUDITON_GPOLICY:
3243 	case AUE_AUDITON_GQCTRL:
3244 	case AUE_AUDITON_GETAMASK:
3245 	case AUE_AUDITON_GETKMASK:
3246 	case AUE_AUDITON_GETCWD:
3247 	case AUE_AUDITON_GETCAR:
3248 	case AUE_AUDITON_GETSTAT:
3249 	case AUE_AUDITON_SETSTAT:
3250 	case AUE_AUDITON_GETCOND:
3251 	case AUE_AUDITON_GETCLASS:
3252 		break;
3253 	default:
3254 		break;
3255 	}
3256 
3257 }	/* AUS_AUDITSYS */
3258 
3259 
3260 /* only audit privileged operations for systeminfo(2) system call */
3261 static au_event_t
3262 aui_sysinfo(au_event_t e)
3263 {
3264 	klwp_t *clwp = ttolwp(curthread);
3265 	uint32_t command;
3266 
3267 	struct a {
3268 		long	command;
3269 		long	buf;		/* char * */
3270 		long	count;
3271 	} *uap = (struct a *)clwp->lwp_ap;
3272 
3273 	command = (uint32_t)uap->command;
3274 
3275 	switch (command) {
3276 	case SI_SET_HOSTNAME:
3277 	case SI_SET_SRPC_DOMAIN:
3278 		e = (au_event_t)AUE_SYSINFO;
3279 		break;
3280 	default:
3281 		e = (au_event_t)AUE_NULL;
3282 		break;
3283 	}
3284 	return (e);
3285 }
3286 
3287 /*ARGSUSED*/
3288 static void
3289 aus_sysinfo(struct t_audit_data *tad)
3290 {
3291 	klwp_t *clwp = ttolwp(curthread);
3292 	uint32_t command;
3293 	size_t len, maxlen;
3294 	char *name;
3295 	uintptr_t buf;
3296 
3297 	struct a {
3298 		long	command;
3299 		long	buf;		/* char * */
3300 		long	count;
3301 	} *uap = (struct a *)clwp->lwp_ap;
3302 
3303 	command = (uint32_t)uap->command;
3304 	buf = (uintptr_t)uap->buf;
3305 
3306 	au_uwrite(au_to_arg32(1, "cmd", command));
3307 
3308 	switch (command) {
3309 	case SI_SET_HOSTNAME:
3310 	{
3311 		if (secpolicy_sys_config(CRED(), B_TRUE) != 0)
3312 			return;
3313 
3314 		maxlen = SYS_NMLN;
3315 		name = kmem_alloc(maxlen, KM_SLEEP);
3316 		if (copyinstr((caddr_t)buf, name, SYS_NMLN, &len))
3317 			break;
3318 
3319 		/*
3320 		 * Must be non-NULL string and string
3321 		 * must be less than SYS_NMLN chars.
3322 		 */
3323 		if (len < 2 || (len == SYS_NMLN && name[SYS_NMLN - 1] != '\0'))
3324 			break;
3325 
3326 		au_uwrite(au_to_text(name));
3327 		break;
3328 	}
3329 
3330 	case SI_SET_SRPC_DOMAIN:
3331 	{
3332 		if (secpolicy_sys_config(CRED(), B_TRUE) != 0)
3333 			return;
3334 
3335 		maxlen = SYS_NMLN;
3336 		name = kmem_alloc(maxlen, KM_SLEEP);
3337 		if (copyinstr((caddr_t)buf, name, SYS_NMLN, &len))
3338 			break;
3339 
3340 		/*
3341 		 * If string passed in is longer than length
3342 		 * allowed for domain name, fail.
3343 		 */
3344 		if (len == SYS_NMLN && name[SYS_NMLN - 1] != '\0')
3345 			break;
3346 
3347 		au_uwrite(au_to_text(name));
3348 		break;
3349 	}
3350 
3351 	default:
3352 		return;
3353 	}
3354 
3355 	kmem_free(name, maxlen);
3356 }
3357 
3358 static au_event_t
3359 aui_modctl(au_event_t e)
3360 {
3361 	klwp_t *clwp = ttolwp(curthread);
3362 	uint_t cmd;
3363 
3364 	struct a {
3365 		long	cmd;
3366 	} *uap = (struct a *)clwp->lwp_ap;
3367 
3368 	cmd = (uint_t)uap->cmd;
3369 
3370 	switch (cmd) {
3371 	case MODLOAD:
3372 		e = AUE_MODLOAD;
3373 		break;
3374 	case MODUNLOAD:
3375 		e = AUE_MODUNLOAD;
3376 		break;
3377 	case MODADDMAJBIND:
3378 		e = AUE_MODADDMAJ;
3379 		break;
3380 	case MODSETDEVPOLICY:
3381 		e = AUE_MODDEVPLCY;
3382 		break;
3383 	case MODALLOCPRIV:
3384 		e = AUE_MODADDPRIV;
3385 		break;
3386 	default:
3387 		e = AUE_NULL;
3388 		break;
3389 	}
3390 	return (e);
3391 }
3392 
3393 
3394 /*ARGSUSED*/
3395 static void
3396 aus_modctl(struct t_audit_data *tad)
3397 {
3398 	klwp_t *clwp = ttolwp(curthread);
3399 	void *a	= clwp->lwp_ap;
3400 	uint_t use_path;
3401 
3402 	switch (tad->tad_event) {
3403 	case AUE_MODLOAD: {
3404 		typedef struct {
3405 			long	cmd;
3406 			long	use_path;
3407 			long	filename;		/* char * */
3408 		} modloada_t;
3409 
3410 		char *filenamep;
3411 		uintptr_t fname;
3412 		extern char *default_path;
3413 
3414 		fname = (uintptr_t)((modloada_t *)a)->filename;
3415 		use_path = (uint_t)((modloada_t *)a)->use_path;
3416 
3417 			/* space to hold path */
3418 		filenamep = kmem_alloc(MOD_MAXPATH, KM_SLEEP);
3419 			/* get string */
3420 		if (copyinstr((caddr_t)fname, filenamep, MOD_MAXPATH, 0)) {
3421 				/* free allocated path */
3422 			kmem_free(filenamep, MOD_MAXPATH);
3423 			return;
3424 		}
3425 			/* ensure it's null terminated */
3426 		filenamep[MOD_MAXPATH - 1] = 0;
3427 
3428 		if (use_path)
3429 			au_uwrite(au_to_text(default_path));
3430 		au_uwrite(au_to_text(filenamep));
3431 
3432 			/* release temporary memory */
3433 		kmem_free(filenamep, MOD_MAXPATH);
3434 		break;
3435 	}
3436 	case AUE_MODUNLOAD: {
3437 		typedef struct {
3438 			long	cmd;
3439 			long	id;
3440 		} modunloada_t;
3441 
3442 		uint32_t id = (uint32_t)((modunloada_t *)a)->id;
3443 
3444 		au_uwrite(au_to_arg32(1, "id", id));
3445 		break;
3446 	}
3447 	case AUE_MODADDMAJ: {
3448 		STRUCT_DECL(modconfig, mc);
3449 		typedef struct {
3450 			long	cmd;
3451 			long	subcmd;
3452 			long	data;		/* int * */
3453 		} modconfiga_t;
3454 
3455 		STRUCT_DECL(aliases, alias);
3456 		caddr_t ap;
3457 		int i, num_aliases;
3458 		char *drvname, *mc_drvname;
3459 		char *name;
3460 		extern char *ddi_major_to_name(major_t);
3461 		model_t model;
3462 
3463 		uintptr_t data = (uintptr_t)((modconfiga_t *)a)->data;
3464 
3465 		model = get_udatamodel();
3466 		STRUCT_INIT(mc, model);
3467 			/* sanitize buffer */
3468 		bzero((caddr_t)STRUCT_BUF(mc), STRUCT_SIZE(mc));
3469 			/* get user arguments */
3470 		if (copyin((caddr_t)data, (caddr_t)STRUCT_BUF(mc),
3471 		    STRUCT_SIZE(mc)) != 0)
3472 			return;
3473 
3474 		mc_drvname = STRUCT_FGET(mc, drvname);
3475 		if ((drvname = ddi_major_to_name(
3476 		    (major_t)STRUCT_FGET(mc, major))) != NULL &&
3477 		    strncmp(drvname, mc_drvname, MAXMODCONFNAME) != 0) {
3478 				/* safety */
3479 			if (mc_drvname[0] != '\0') {
3480 				mc_drvname[MAXMODCONFNAME-1] = '\0';
3481 				au_uwrite(au_to_text(mc_drvname));
3482 			}
3483 				/* drvname != NULL from test above */
3484 			au_uwrite(au_to_text(drvname));
3485 			return;
3486 		}
3487 
3488 		if (mc_drvname[0] != '\0') {
3489 				/* safety */
3490 			mc_drvname[MAXMODCONFNAME-1] = '\0';
3491 			au_uwrite(au_to_text(mc_drvname));
3492 		} else
3493 			au_uwrite(au_to_text("no drvname"));
3494 
3495 		num_aliases = STRUCT_FGET(mc, num_aliases);
3496 		au_uwrite(au_to_arg32(5, "", (uint32_t)num_aliases));
3497 		ap = (caddr_t)STRUCT_FGETP(mc, ap);
3498 		name = kmem_alloc(MAXMODCONFNAME, KM_SLEEP);
3499 		STRUCT_INIT(alias, model);
3500 		for (i = 0; i < num_aliases; i++) {
3501 			bzero((caddr_t)STRUCT_BUF(alias),
3502 			    STRUCT_SIZE(alias));
3503 			if (copyin((caddr_t)ap, (caddr_t)STRUCT_BUF(alias),
3504 			    STRUCT_SIZE(alias)) != 0)
3505 				break;
3506 			if (copyinstr(STRUCT_FGETP(alias, a_name), name,
3507 			    MAXMODCONFNAME, NULL) != 0) {
3508 				break;
3509 			}
3510 
3511 			au_uwrite(au_to_text(name));
3512 			ap = (caddr_t)STRUCT_FGETP(alias, a_next);
3513 		}
3514 		kmem_free(name, MAXMODCONFNAME);
3515 		break;
3516 	}
3517 	default:
3518 		break;
3519 	}
3520 }
3521 
3522 
3523 /*ARGSUSED*/
3524 static void
3525 auf_accept(
3526 	struct t_audit_data *tad,
3527 	int	error,
3528 	rval_t	*rval)
3529 {
3530 	uint32_t scid;
3531 	uint32_t sy_flags;
3532 	int fd;
3533 	struct sonode *so;
3534 	char so_laddr[sizeof (struct sockaddr_in6)];
3535 	char so_faddr[sizeof (struct sockaddr_in6)];
3536 	int err;
3537 	short so_family, so_type;
3538 	int add_sock_token = 0;
3539 
3540 	/* need to determine type of executing binary */
3541 	scid = tad->tad_scid;
3542 #ifdef _SYSCALL32_IMPL
3543 	if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE)
3544 		sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
3545 	else
3546 		sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK;
3547 #else
3548 	sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK;
3549 #endif
3550 	switch (sy_flags) {
3551 	case SE_32RVAL1:
3552 		/* FALLTHRU */
3553 	case SE_32RVAL2|SE_32RVAL1:
3554 		fd = rval->r_val1;
3555 		break;
3556 	case SE_64RVAL:
3557 		fd = (int)rval->r_vals;
3558 		break;
3559 	default:
3560 		/*
3561 		 * should never happen, seems to be an internal error
3562 		 * in sysent => no fd, nothing to audit here, returning
3563 		 */
3564 		return;
3565 	}
3566 
3567 	if (error) {
3568 		/* can't trust socket contents. Just return */
3569 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
3570 		return;
3571 	}
3572 
3573 	if ((so = getsonode(fd, &err, NULL)) == NULL) {
3574 		/*
3575 		 * not security relevant if doing a accept from non socket
3576 		 * so no extra tokens. Should probably turn off audit record
3577 		 * generation here.
3578 		 */
3579 		return;
3580 	}
3581 
3582 	so_family = so->so_family;
3583 	so_type   = so->so_type;
3584 
3585 	switch (so_family) {
3586 	case AF_INET:
3587 	case AF_INET6:
3588 		/*
3589 		 * XXX - what about other socket types for AF_INET (e.g. DGRAM)
3590 		 */
3591 		if (so->so_type == SOCK_STREAM) {
3592 			socklen_t len;
3593 
3594 			bzero((void *)so_laddr, sizeof (so_laddr));
3595 			bzero((void *)so_faddr, sizeof (so_faddr));
3596 
3597 			len = sizeof (so_laddr);
3598 			(void) socket_getsockname(so,
3599 			    (struct sockaddr *)so_laddr, &len, CRED());
3600 			len = sizeof (so_faddr);
3601 			(void) socket_getpeername(so,
3602 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
3603 
3604 			add_sock_token = 1;
3605 		}
3606 		break;
3607 
3608 	default:
3609 		/* AF_UNIX, AF_ROUTE, AF_KEY do not support accept */
3610 		break;
3611 	}
3612 
3613 	releasef(fd);
3614 
3615 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
3616 
3617 	if (add_sock_token == 0) {
3618 		au_uwrite(au_to_arg32(0, "family", (uint32_t)(so_family)));
3619 		au_uwrite(au_to_arg32(0, "type", (uint32_t)(so_type)));
3620 		return;
3621 	}
3622 
3623 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
3624 
3625 }
3626 
3627 /*ARGSUSED*/
3628 static void
3629 auf_bind(struct t_audit_data *tad, int error, rval_t *rvp)
3630 {
3631 	struct a {
3632 		long	fd;
3633 		long	addr;
3634 		long	len;
3635 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
3636 
3637 	struct sonode *so;
3638 	char so_laddr[sizeof (struct sockaddr_in6)];
3639 	char so_faddr[sizeof (struct sockaddr_in6)];
3640 	int err, fd;
3641 	socklen_t len;
3642 	short so_family, so_type;
3643 	int add_sock_token = 0;
3644 
3645 	fd = (int)uap->fd;
3646 
3647 	/*
3648 	 * bind failed, then nothing extra to add to audit record.
3649 	 */
3650 	if (error) {
3651 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
3652 		/* XXX may want to add failed address some day */
3653 		return;
3654 	}
3655 
3656 	if ((so = getsonode(fd, &err, NULL)) == NULL) {
3657 		/*
3658 		 * not security relevant if doing a bind from non socket
3659 		 * so no extra tokens. Should probably turn off audit record
3660 		 * generation here.
3661 		 */
3662 		return;
3663 	}
3664 
3665 	so_family = so->so_family;
3666 	so_type   = so->so_type;
3667 
3668 	switch (so_family) {
3669 	case AF_INET:
3670 	case AF_INET6:
3671 
3672 		bzero(so_faddr, sizeof (so_faddr));
3673 		len = sizeof (so_faddr);
3674 
3675 		(void) socket_getpeername(so,
3676 		    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
3677 		add_sock_token = 1;
3678 
3679 		break;
3680 
3681 	case AF_UNIX:
3682 		/* token added by lookup */
3683 		break;
3684 	default:
3685 		/* AF_ROUTE, AF_KEY do not support accept */
3686 		break;
3687 	}
3688 
3689 	releasef(fd);
3690 
3691 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
3692 
3693 	if (add_sock_token == 0) {
3694 		au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family)));
3695 		au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type)));
3696 		return;
3697 	}
3698 
3699 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
3700 
3701 }
3702 
3703 /*ARGSUSED*/
3704 static void
3705 auf_connect(struct t_audit_data *tad, int error, rval_t *rval)
3706 {
3707 	struct a {
3708 		long	fd;
3709 		long	addr;
3710 		long	len;
3711 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
3712 
3713 	struct sonode *so;
3714 	char so_laddr[sizeof (struct sockaddr_in6)];
3715 	char so_faddr[sizeof (struct sockaddr_in6)];
3716 	int err, fd;
3717 	socklen_t len;
3718 	short so_family, so_type;
3719 	int add_sock_token = 0;
3720 
3721 	fd = (int)uap->fd;
3722 
3723 
3724 	if ((so = getsonode(fd, &err, NULL)) == NULL) {
3725 		/*
3726 		 * not security relevant if doing a connect from non socket
3727 		 * so no extra tokens. Should probably turn off audit record
3728 		 * generation here.
3729 		 */
3730 		return;
3731 	}
3732 
3733 	so_family = so->so_family;
3734 	so_type   = so->so_type;
3735 
3736 	switch (so_family) {
3737 	case AF_INET:
3738 	case AF_INET6:
3739 
3740 		bzero(so_laddr, sizeof (so_laddr));
3741 		bzero(so_faddr, sizeof (so_faddr));
3742 
3743 		len = sizeof (so_laddr);
3744 		(void) socket_getsockname(so, (struct sockaddr *)so_laddr,
3745 		    &len, CRED());
3746 		if (error) {
3747 			if (uap->addr == NULL)
3748 				break;
3749 			if (uap->len <= 0)
3750 				break;
3751 			len = min(uap->len, sizeof (so_faddr));
3752 			if (copyin((caddr_t)(uap->addr), so_faddr, len) != 0)
3753 				break;
3754 #ifdef NOTYET
3755 			au_uwrite(au_to_data(AUP_HEX, AUR_CHAR, len, so_faddr));
3756 #endif
3757 		} else {
3758 			/* sanity check on length */
3759 			len = sizeof (so_faddr);
3760 			(void) socket_getpeername(so,
3761 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
3762 		}
3763 
3764 		add_sock_token = 1;
3765 
3766 		break;
3767 
3768 	case AF_UNIX:
3769 		/* does a lookup on name */
3770 		break;
3771 
3772 	default:
3773 		/* AF_ROUTE, AF_KEY do not support accept */
3774 		break;
3775 	}
3776 
3777 	releasef(fd);
3778 
3779 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
3780 
3781 	if (add_sock_token == 0) {
3782 		au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family)));
3783 		au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type)));
3784 		return;
3785 	}
3786 
3787 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
3788 
3789 }
3790 
3791 /*ARGSUSED*/
3792 static void
3793 aus_shutdown(struct t_audit_data *tad)
3794 {
3795 	struct a {
3796 		long	fd;
3797 		long	how;
3798 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
3799 
3800 	struct sonode *so;
3801 	char so_laddr[sizeof (struct sockaddr_in6)];
3802 	char so_faddr[sizeof (struct sockaddr_in6)];
3803 	int err, fd;
3804 	socklen_t len;
3805 	short so_family, so_type;
3806 	int add_sock_token = 0;
3807 	file_t *fp;				/* unix domain sockets */
3808 	struct f_audit_data *fad;		/* unix domain sockets */
3809 
3810 	fd = (int)uap->fd;
3811 
3812 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
3813 		/*
3814 		 * not security relevant if doing a shutdown using non socket
3815 		 * so no extra tokens. Should probably turn off audit record
3816 		 * generation here.
3817 		 */
3818 		return;
3819 	}
3820 
3821 	so_family = so->so_family;
3822 	so_type   = so->so_type;
3823 
3824 	switch (so_family) {
3825 	case AF_INET:
3826 	case AF_INET6:
3827 
3828 		bzero(so_laddr, sizeof (so_laddr));
3829 		bzero(so_faddr, sizeof (so_faddr));
3830 
3831 		len = sizeof (so_laddr);
3832 		(void) socket_getsockname(so,
3833 		    (struct sockaddr *)so_laddr, &len, CRED());
3834 		len = sizeof (so_faddr);
3835 		(void) socket_getpeername(so,
3836 		    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
3837 
3838 		add_sock_token = 1;
3839 
3840 		break;
3841 
3842 	case AF_UNIX:
3843 
3844 		/* get path from file struct here */
3845 		fad = F2A(fp);
3846 		ASSERT(fad);
3847 
3848 		if (fad->fad_aupath != NULL) {
3849 			au_uwrite(au_to_path(fad->fad_aupath));
3850 		} else {
3851 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
3852 		}
3853 
3854 		audit_attributes(fp->f_vnode);
3855 
3856 		break;
3857 
3858 	default:
3859 		/*
3860 		 * AF_KEY and AF_ROUTE support shutdown. No socket token
3861 		 * added.
3862 		 */
3863 		break;
3864 	}
3865 
3866 	releasef(fd);
3867 
3868 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
3869 
3870 	if (add_sock_token == 0) {
3871 		au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family)));
3872 		au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type)));
3873 		au_uwrite(au_to_arg32(2, "how", (uint32_t)(uap->how)));
3874 		return;
3875 	}
3876 
3877 	au_uwrite(au_to_arg32(2, "how", (uint32_t)(uap->how)));
3878 
3879 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
3880 
3881 }
3882 
3883 /*ARGSUSED*/
3884 static void
3885 auf_setsockopt(struct t_audit_data *tad, int error, rval_t *rval)
3886 {
3887 	struct a {
3888 		long	fd;
3889 		long	level;
3890 		long	optname;
3891 		long	*optval;
3892 		long	optlen;
3893 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
3894 
3895 	struct sonode	*so;
3896 	char so_laddr[sizeof (struct sockaddr_in6)];
3897 	char so_faddr[sizeof (struct sockaddr_in6)];
3898 	char		val[AU_BUFSIZE];
3899 	int		err, fd;
3900 	socklen_t	len;
3901 	short so_family, so_type;
3902 	int		add_sock_token = 0;
3903 	file_t *fp;				/* unix domain sockets */
3904 	struct f_audit_data *fad;		/* unix domain sockets */
3905 
3906 	fd = (int)uap->fd;
3907 
3908 	if (error) {
3909 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
3910 		au_uwrite(au_to_arg32(2, "level", (uint32_t)uap->level));
3911 		/* XXX may want to include other arguments */
3912 		return;
3913 	}
3914 
3915 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
3916 		/*
3917 		 * not security relevant if doing a setsockopt from non socket
3918 		 * so no extra tokens. Should probably turn off audit record
3919 		 * generation here.
3920 		 */
3921 		return;
3922 	}
3923 
3924 	so_family = so->so_family;
3925 	so_type   = so->so_type;
3926 
3927 	switch (so_family) {
3928 	case AF_INET:
3929 	case AF_INET6:
3930 		bzero((void *)so_laddr, sizeof (so_laddr));
3931 		bzero((void *)so_faddr, sizeof (so_faddr));
3932 
3933 		/* get local and foreign addresses */
3934 		len = sizeof (so_laddr);
3935 		(void) socket_getsockname(so, (struct sockaddr *)so_laddr,
3936 		    &len, CRED());
3937 		len = sizeof (so_faddr);
3938 		(void) socket_getpeername(so, (struct sockaddr *)so_faddr,
3939 		    &len, B_FALSE, CRED());
3940 
3941 		add_sock_token = 1;
3942 
3943 		break;
3944 
3945 	case AF_UNIX:
3946 
3947 		/* get path from file struct here */
3948 		fad = F2A(fp);
3949 		ASSERT(fad);
3950 
3951 		if (fad->fad_aupath != NULL) {
3952 			au_uwrite(au_to_path(fad->fad_aupath));
3953 		} else {
3954 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
3955 		}
3956 
3957 		audit_attributes(fp->f_vnode);
3958 
3959 		break;
3960 
3961 	default:
3962 		/*
3963 		 * AF_KEY and AF_ROUTE support setsockopt. No socket token
3964 		 * added.
3965 		 */
3966 		break;
3967 	}
3968 
3969 	releasef(fd);
3970 
3971 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
3972 
3973 	if (add_sock_token == 0) {
3974 		au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family)));
3975 		au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type)));
3976 	}
3977 	au_uwrite(au_to_arg32(2, "level", (uint32_t)(uap->level)));
3978 	au_uwrite(au_to_arg32(3, "optname", (uint32_t)(uap->optname)));
3979 
3980 	bzero(val, sizeof (val));
3981 	len = min(uap->optlen, sizeof (val));
3982 	if ((len > 0) &&
3983 	    (copyin((caddr_t)(uap->optval), (caddr_t)val, len) == 0)) {
3984 		au_uwrite(au_to_arg32(5, "optlen", (uint32_t)(uap->optlen)));
3985 		au_uwrite(au_to_data(AUP_HEX, AUR_BYTE, len, val));
3986 	}
3987 
3988 	if (add_sock_token == 0)
3989 		return;
3990 
3991 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
3992 
3993 }
3994 
3995 /*ARGSUSED*/
3996 static void
3997 aus_sockconfig(tad)
3998 	struct t_audit_data *tad;
3999 {
4000 	struct a {
4001 		long	cmd;
4002 		long	arg1;
4003 		long	arg2;
4004 		long	arg3;
4005 		long	arg4;
4006 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4007 
4008 	char	*buf;
4009 	int	buflen;
4010 	size_t	size;
4011 
4012 	au_uwrite(au_to_arg32(1, "cmd", (uint_t)uap->cmd));
4013 	switch (uap->cmd) {
4014 	case SOCKCONFIG_ADD_SOCK:
4015 	case SOCKCONFIG_REMOVE_SOCK:
4016 		au_uwrite(au_to_arg32(2, "domain", (uint32_t)uap->arg1));
4017 		au_uwrite(au_to_arg32(3, "type", (uint32_t)uap->arg2));
4018 		au_uwrite(au_to_arg32(4, "protocol", (uint32_t)uap->arg3));
4019 
4020 		if (uap->arg4 == 0) {
4021 			au_uwrite(au_to_arg32(5, "devpath", (uint32_t)0));
4022 		} else {
4023 			buflen = MAXPATHLEN + 1;
4024 			buf = kmem_alloc(buflen, KM_SLEEP);
4025 			if (copyinstr((caddr_t)uap->arg4, buf, buflen,
4026 			    &size)) {
4027 				kmem_free(buf, buflen);
4028 				return;
4029 			}
4030 
4031 			if (size > MAXPATHLEN) {
4032 				kmem_free(buf, buflen);
4033 				return;
4034 			}
4035 
4036 			au_uwrite(au_to_text(buf));
4037 			kmem_free(buf, buflen);
4038 		}
4039 		break;
4040 	case SOCKCONFIG_ADD_FILTER:
4041 	case SOCKCONFIG_REMOVE_FILTER:
4042 		buflen = FILNAME_MAX;
4043 		buf = kmem_alloc(buflen, KM_SLEEP);
4044 
4045 		if (copyinstr((caddr_t)uap->arg1, buf, buflen, &size)) {
4046 			kmem_free(buf, buflen);
4047 			return;
4048 		}
4049 
4050 		au_uwrite(au_to_text(buf));
4051 		kmem_free(buf, buflen);
4052 		break;
4053 	default:
4054 		break;
4055 	}
4056 }
4057 
4058 /*
4059  * only audit recvmsg when the system call represents the creation of a new
4060  * circuit. This effectively occurs for all UDP packets and may occur for
4061  * special TCP situations where the local host has not set a local address
4062  * in the socket structure.
4063  */
4064 /*ARGSUSED*/
4065 static void
4066 auf_recvmsg(
4067 	struct t_audit_data *tad,
4068 	int error,
4069 	rval_t *rvp)
4070 {
4071 	struct a {
4072 		long	fd;
4073 		long	msg;	/* struct msghdr */
4074 		long	flags;
4075 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4076 
4077 	struct sonode	*so;
4078 	STRUCT_DECL(msghdr, msg);
4079 	caddr_t msg_name;
4080 	socklen_t msg_namelen;
4081 	int fd;
4082 	int err;
4083 	char so_laddr[sizeof (struct sockaddr_in6)];
4084 	char so_faddr[sizeof (struct sockaddr_in6)];
4085 	socklen_t len;
4086 	file_t *fp;				/* unix domain sockets */
4087 	struct f_audit_data *fad;		/* unix domain sockets */
4088 	short so_family, so_type;
4089 	int add_sock_token = 0;
4090 	au_kcontext_t	*kctx = GET_KCTX_PZ;
4091 
4092 	fd = (int)uap->fd;
4093 
4094 	/* bail if an error */
4095 	if (error) {
4096 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
4097 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4098 		return;
4099 	}
4100 
4101 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
4102 		/*
4103 		 * not security relevant if doing a recvmsg from non socket
4104 		 * so no extra tokens. Should probably turn off audit record
4105 		 * generation here.
4106 		 */
4107 		return;
4108 	}
4109 
4110 	so_family = so->so_family;
4111 	so_type   = so->so_type;
4112 
4113 	/*
4114 	 * only putout SOCKET_EX token if INET/INET6 family.
4115 	 * XXX - what do we do about other families?
4116 	 */
4117 
4118 	switch (so_family) {
4119 	case AF_INET:
4120 	case AF_INET6:
4121 
4122 		/*
4123 		 * if datagram type socket, then just use what is in
4124 		 * socket structure for local address.
4125 		 * XXX - what do we do for other types?
4126 		 */
4127 		if ((so->so_type == SOCK_DGRAM) ||
4128 		    (so->so_type == SOCK_RAW)) {
4129 			add_sock_token = 1;
4130 
4131 			bzero((void *)so_laddr, sizeof (so_laddr));
4132 			bzero((void *)so_faddr, sizeof (so_faddr));
4133 
4134 			/* get local address */
4135 			len = sizeof (so_laddr);
4136 			(void) socket_getsockname(so,
4137 			    (struct sockaddr *)so_laddr, &len, CRED());
4138 
4139 			/* get peer address */
4140 			STRUCT_INIT(msg, get_udatamodel());
4141 
4142 			if (copyin((caddr_t)(uap->msg),
4143 			    (caddr_t)STRUCT_BUF(msg), STRUCT_SIZE(msg)) != 0) {
4144 				break;
4145 			}
4146 			msg_name = (caddr_t)STRUCT_FGETP(msg, msg_name);
4147 			if (msg_name == NULL) {
4148 				break;
4149 			}
4150 
4151 			/* length is value from recvmsg - sanity check */
4152 			msg_namelen = (socklen_t)STRUCT_FGET(msg, msg_namelen);
4153 			if (msg_namelen == 0) {
4154 				break;
4155 			}
4156 			if (copyin(msg_name, so_faddr,
4157 			    sizeof (so_faddr)) != 0) {
4158 				break;
4159 			}
4160 
4161 		} else if (so->so_type == SOCK_STREAM) {
4162 
4163 			/* get path from file struct here */
4164 			fad = F2A(fp);
4165 			ASSERT(fad);
4166 
4167 			/*
4168 			 * already processed this file for read attempt
4169 			 */
4170 			if (fad->fad_flags & FAD_READ) {
4171 				/* don't want to audit every recvmsg attempt */
4172 				tad->tad_flag = 0;
4173 				/* free any residual audit data */
4174 				au_close(kctx, &(u_ad), 0, 0, 0, NULL);
4175 				releasef(fd);
4176 				return;
4177 			}
4178 			/*
4179 			 * mark things so we know what happened and don't
4180 			 * repeat things
4181 			 */
4182 			fad->fad_flags |= FAD_READ;
4183 
4184 			bzero((void *)so_laddr, sizeof (so_laddr));
4185 			bzero((void *)so_faddr, sizeof (so_faddr));
4186 
4187 			/* get local and foreign addresses */
4188 			len = sizeof (so_laddr);
4189 			(void) socket_getsockname(so,
4190 			    (struct sockaddr *)so_laddr, &len, CRED());
4191 			len = sizeof (so_faddr);
4192 			(void) socket_getpeername(so,
4193 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
4194 
4195 			add_sock_token = 1;
4196 		}
4197 
4198 		/* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */
4199 
4200 		break;
4201 
4202 	case AF_UNIX:
4203 		/*
4204 		 * first check if this is first time through. Too much
4205 		 * duplicate code to put this in an aui_ routine.
4206 		 */
4207 
4208 		/* get path from file struct here */
4209 		fad = F2A(fp);
4210 		ASSERT(fad);
4211 
4212 		/*
4213 		 * already processed this file for read attempt
4214 		 */
4215 		if (fad->fad_flags & FAD_READ) {
4216 			releasef(fd);
4217 			/* don't want to audit every recvmsg attempt */
4218 			tad->tad_flag = 0;
4219 			/* free any residual audit data */
4220 			au_close(kctx, &(u_ad), 0, 0, 0, NULL);
4221 			return;
4222 		}
4223 		/*
4224 		 * mark things so we know what happened and don't
4225 		 * repeat things
4226 		 */
4227 		fad->fad_flags |= FAD_READ;
4228 
4229 		if (fad->fad_aupath != NULL) {
4230 			au_uwrite(au_to_path(fad->fad_aupath));
4231 		} else {
4232 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
4233 		}
4234 
4235 		audit_attributes(fp->f_vnode);
4236 
4237 		releasef(fd);
4238 
4239 		return;
4240 
4241 	default:
4242 		break;
4243 
4244 	}
4245 
4246 	releasef(fd);
4247 
4248 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
4249 
4250 	if (add_sock_token == 0) {
4251 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
4252 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
4253 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4254 		return;
4255 	}
4256 
4257 	au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4258 
4259 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
4260 
4261 }
4262 
4263 /*ARGSUSED*/
4264 static void
4265 auf_recvfrom(
4266 	struct t_audit_data *tad,
4267 	int error,
4268 	rval_t *rvp)
4269 {
4270 
4271 	struct a {
4272 		long	fd;
4273 		long	msg;	/* char */
4274 		long	len;
4275 		long	flags;
4276 		long	from;	/* struct sockaddr */
4277 		long	fromlen;
4278 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4279 
4280 	socklen_t	fromlen;
4281 	struct sonode	*so;
4282 	char so_laddr[sizeof (struct sockaddr_in6)];
4283 	char so_faddr[sizeof (struct sockaddr_in6)];
4284 	int		fd;
4285 	short so_family, so_type;
4286 	int add_sock_token = 0;
4287 	socklen_t len;
4288 	int err;
4289 	struct file *fp;
4290 	struct f_audit_data *fad;		/* unix domain sockets */
4291 	au_kcontext_t	*kctx = GET_KCTX_PZ;
4292 
4293 	fd = (int)uap->fd;
4294 
4295 	/* bail if an error */
4296 	if (error) {
4297 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
4298 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4299 		return;
4300 	}
4301 
4302 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
4303 		/*
4304 		 * not security relevant if doing a recvmsg from non socket
4305 		 * so no extra tokens. Should probably turn off audit record
4306 		 * generation here.
4307 		 */
4308 		return;
4309 	}
4310 
4311 	so_family = so->so_family;
4312 	so_type   = so->so_type;
4313 
4314 	/*
4315 	 * only putout SOCKET_EX token if INET/INET6 family.
4316 	 * XXX - what do we do about other families?
4317 	 */
4318 
4319 	switch (so_family) {
4320 	case AF_INET:
4321 	case AF_INET6:
4322 
4323 		/*
4324 		 * if datagram type socket, then just use what is in
4325 		 * socket structure for local address.
4326 		 * XXX - what do we do for other types?
4327 		 */
4328 		if ((so->so_type == SOCK_DGRAM) ||
4329 		    (so->so_type == SOCK_RAW)) {
4330 			add_sock_token = 1;
4331 
4332 			/* get local address */
4333 			len = sizeof (so_laddr);
4334 			(void) socket_getsockname(so,
4335 			    (struct sockaddr *)so_laddr, &len, CRED());
4336 
4337 			/* get peer address */
4338 			bzero((void *)so_faddr, sizeof (so_faddr));
4339 
4340 			/* sanity check */
4341 			if (uap->from == NULL)
4342 				break;
4343 
4344 			/* sanity checks */
4345 			if (uap->fromlen == 0)
4346 				break;
4347 
4348 			if (copyin((caddr_t)(uap->fromlen), (caddr_t)&fromlen,
4349 			    sizeof (fromlen)) != 0)
4350 				break;
4351 
4352 			if (fromlen == 0)
4353 				break;
4354 
4355 			/* enforce maximum size */
4356 			if (fromlen > sizeof (so_faddr))
4357 				fromlen = sizeof (so_faddr);
4358 
4359 			if (copyin((caddr_t)(uap->from), so_faddr,
4360 			    fromlen) != 0)
4361 				break;
4362 
4363 		} else if (so->so_type == SOCK_STREAM) {
4364 
4365 			/* get path from file struct here */
4366 			fad = F2A(fp);
4367 			ASSERT(fad);
4368 
4369 			/*
4370 			 * already processed this file for read attempt
4371 			 */
4372 			if (fad->fad_flags & FAD_READ) {
4373 				/* don't want to audit every recvfrom attempt */
4374 				tad->tad_flag = 0;
4375 				/* free any residual audit data */
4376 				au_close(kctx, &(u_ad), 0, 0, 0, NULL);
4377 				releasef(fd);
4378 				return;
4379 			}
4380 			/*
4381 			 * mark things so we know what happened and don't
4382 			 * repeat things
4383 			 */
4384 			fad->fad_flags |= FAD_READ;
4385 
4386 			bzero((void *)so_laddr, sizeof (so_laddr));
4387 			bzero((void *)so_faddr, sizeof (so_faddr));
4388 
4389 			/* get local and foreign addresses */
4390 			len = sizeof (so_laddr);
4391 			(void) socket_getsockname(so,
4392 			    (struct sockaddr *)so_laddr, &len, CRED());
4393 			len = sizeof (so_faddr);
4394 			(void) socket_getpeername(so,
4395 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
4396 
4397 			add_sock_token = 1;
4398 		}
4399 
4400 		/* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */
4401 
4402 		break;
4403 
4404 	case AF_UNIX:
4405 		/*
4406 		 * first check if this is first time through. Too much
4407 		 * duplicate code to put this in an aui_ routine.
4408 		 */
4409 
4410 		/* get path from file struct here */
4411 		fad = F2A(fp);
4412 		ASSERT(fad);
4413 
4414 		/*
4415 		 * already processed this file for read attempt
4416 		 */
4417 		if (fad->fad_flags & FAD_READ) {
4418 			/* don't want to audit every recvfrom attempt */
4419 			tad->tad_flag = 0;
4420 			/* free any residual audit data */
4421 			au_close(kctx, &(u_ad), 0, 0, 0, NULL);
4422 			releasef(fd);
4423 			return;
4424 		}
4425 		/*
4426 		 * mark things so we know what happened and don't
4427 		 * repeat things
4428 		 */
4429 		fad->fad_flags |= FAD_READ;
4430 
4431 		if (fad->fad_aupath != NULL) {
4432 			au_uwrite(au_to_path(fad->fad_aupath));
4433 		} else {
4434 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
4435 		}
4436 
4437 		audit_attributes(fp->f_vnode);
4438 
4439 		releasef(fd);
4440 
4441 		return;
4442 
4443 	default:
4444 		break;
4445 
4446 	}
4447 
4448 	releasef(fd);
4449 
4450 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
4451 
4452 	if (add_sock_token == 0) {
4453 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
4454 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
4455 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4456 		return;
4457 	}
4458 
4459 	au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4460 
4461 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
4462 }
4463 
4464 /*ARGSUSED*/
4465 static void
4466 auf_sendmsg(struct t_audit_data *tad, int error, rval_t *rval)
4467 {
4468 	struct a {
4469 		long	fd;
4470 		long	msg;	/* struct msghdr */
4471 		long	flags;
4472 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4473 
4474 	struct sonode	*so;
4475 	char so_laddr[sizeof (struct sockaddr_in6)];
4476 	char so_faddr[sizeof (struct sockaddr_in6)];
4477 	int		err;
4478 	int		fd;
4479 	short so_family, so_type;
4480 	int		add_sock_token = 0;
4481 	socklen_t	len;
4482 	struct file	*fp;
4483 	struct f_audit_data *fad;
4484 	caddr_t		msg_name;
4485 	socklen_t	msg_namelen;
4486 	STRUCT_DECL(msghdr, msg);
4487 	au_kcontext_t	*kctx = GET_KCTX_PZ;
4488 
4489 	fd = (int)uap->fd;
4490 
4491 	/* bail if an error */
4492 	if (error) {
4493 		/* XXX include destination address from system call arguments */
4494 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
4495 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4496 		return;
4497 	}
4498 
4499 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
4500 		/*
4501 		 * not security relevant if doing a sendmsg from non socket
4502 		 * so no extra tokens. Should probably turn off audit record
4503 		 * generation here.
4504 		 */
4505 		return;
4506 	}
4507 
4508 	so_family = so->so_family;
4509 	so_type   = so->so_type;
4510 
4511 	switch (so_family) {
4512 	case AF_INET:
4513 	case AF_INET6:
4514 		/*
4515 		 * if datagram type socket, then just use what is in
4516 		 * socket structure for local address.
4517 		 * XXX - what do we do for other types?
4518 		 */
4519 		if ((so->so_type == SOCK_DGRAM) ||
4520 		    (so->so_type == SOCK_RAW)) {
4521 
4522 			bzero((void *)so_laddr, sizeof (so_laddr));
4523 			bzero((void *)so_faddr, sizeof (so_faddr));
4524 
4525 			/* get local address */
4526 			len = sizeof (so_laddr);
4527 			(void) socket_getsockname(so,
4528 			    (struct sockaddr *)so_laddr, &len, CRED());
4529 
4530 			/* get peer address */
4531 			STRUCT_INIT(msg, get_udatamodel());
4532 
4533 			if (copyin((caddr_t)(uap->msg),
4534 			    (caddr_t)STRUCT_BUF(msg), STRUCT_SIZE(msg)) != 0) {
4535 				break;
4536 			}
4537 			msg_name = (caddr_t)STRUCT_FGETP(msg, msg_name);
4538 			if (msg_name == NULL)
4539 				break;
4540 
4541 			msg_namelen = (socklen_t)STRUCT_FGET(msg, msg_namelen);
4542 			/* length is value from recvmsg - sanity check */
4543 			if (msg_namelen == 0)
4544 				break;
4545 
4546 			if (copyin(msg_name, so_faddr,
4547 			    sizeof (so_faddr)) != 0)
4548 				break;
4549 
4550 			add_sock_token = 1;
4551 
4552 		} else if (so->so_type == SOCK_STREAM) {
4553 
4554 			/* get path from file struct here */
4555 			fad = F2A(fp);
4556 			ASSERT(fad);
4557 
4558 			/*
4559 			 * already processed this file for write attempt
4560 			 */
4561 			if (fad->fad_flags & FAD_WRITE) {
4562 				releasef(fd);
4563 				/* don't want to audit every sendmsg attempt */
4564 				tad->tad_flag = 0;
4565 				/* free any residual audit data */
4566 				au_close(kctx, &(u_ad), 0, 0, 0, NULL);
4567 				return;
4568 			}
4569 
4570 			/*
4571 			 * mark things so we know what happened and don't
4572 			 * repeat things
4573 			 */
4574 			fad->fad_flags |= FAD_WRITE;
4575 
4576 			bzero((void *)so_laddr, sizeof (so_laddr));
4577 			bzero((void *)so_faddr, sizeof (so_faddr));
4578 
4579 			/* get local and foreign addresses */
4580 			len = sizeof (so_laddr);
4581 			(void) socket_getsockname(so,
4582 			    (struct sockaddr *)so_laddr, &len, CRED());
4583 			len = sizeof (so_faddr);
4584 			(void) socket_getpeername(so,
4585 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
4586 
4587 			add_sock_token = 1;
4588 		}
4589 
4590 		/* XXX - what about SOCK_RAW/SOCK_RDM/SOCK_SEQPACKET ??? */
4591 
4592 		break;
4593 
4594 	case AF_UNIX:
4595 		/*
4596 		 * first check if this is first time through. Too much
4597 		 * duplicate code to put this in an aui_ routine.
4598 		 */
4599 
4600 		/* get path from file struct here */
4601 		fad = F2A(fp);
4602 		ASSERT(fad);
4603 
4604 		/*
4605 		 * already processed this file for write attempt
4606 		 */
4607 		if (fad->fad_flags & FAD_WRITE) {
4608 			releasef(fd);
4609 			/* don't want to audit every sendmsg attempt */
4610 			tad->tad_flag = 0;
4611 			/* free any residual audit data */
4612 			au_close(kctx, &(u_ad), 0, 0, 0, NULL);
4613 			return;
4614 		}
4615 		/*
4616 		 * mark things so we know what happened and don't
4617 		 * repeat things
4618 		 */
4619 		fad->fad_flags |= FAD_WRITE;
4620 
4621 		if (fad->fad_aupath != NULL) {
4622 			au_uwrite(au_to_path(fad->fad_aupath));
4623 		} else {
4624 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
4625 		}
4626 
4627 		audit_attributes(fp->f_vnode);
4628 
4629 		releasef(fd);
4630 
4631 		return;
4632 
4633 	default:
4634 		break;
4635 	}
4636 
4637 	releasef(fd);
4638 
4639 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
4640 
4641 	if (add_sock_token == 0) {
4642 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
4643 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
4644 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4645 		return;
4646 	}
4647 
4648 	au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4649 
4650 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
4651 }
4652 
4653 /*ARGSUSED*/
4654 static void
4655 auf_sendto(struct t_audit_data *tad, int error, rval_t *rval)
4656 {
4657 	struct a {
4658 		long	fd;
4659 		long	msg;	/* char */
4660 		long	len;
4661 		long	flags;
4662 		long	to;	/* struct sockaddr */
4663 		long	tolen;
4664 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4665 
4666 	struct sonode	*so;
4667 	char so_laddr[sizeof (struct sockaddr_in6)];
4668 	char so_faddr[sizeof (struct sockaddr_in6)];
4669 	socklen_t	tolen;
4670 	int		err;
4671 	int		fd;
4672 	socklen_t	len;
4673 	short so_family, so_type;
4674 	int		add_sock_token = 0;
4675 	struct file	*fp;
4676 	struct f_audit_data *fad;
4677 	au_kcontext_t	*kctx = GET_KCTX_PZ;
4678 
4679 	fd = (int)uap->fd;
4680 
4681 	/* bail if an error */
4682 	if (error) {
4683 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
4684 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4685 		/* XXX include destination address from system call arguments */
4686 		return;
4687 	}
4688 
4689 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
4690 		/*
4691 		 * not security relevant if doing a sendto using non socket
4692 		 * so no extra tokens. Should probably turn off audit record
4693 		 * generation here.
4694 		 */
4695 		return;
4696 	}
4697 
4698 	so_family = so->so_family;
4699 	so_type   = so->so_type;
4700 
4701 	/*
4702 	 * only putout SOCKET_EX token if INET/INET6 family.
4703 	 * XXX - what do we do about other families?
4704 	 */
4705 
4706 	switch (so_family) {
4707 	case AF_INET:
4708 	case AF_INET6:
4709 
4710 		/*
4711 		 * if datagram type socket, then just use what is in
4712 		 * socket structure for local address.
4713 		 * XXX - what do we do for other types?
4714 		 */
4715 		if ((so->so_type == SOCK_DGRAM) ||
4716 		    (so->so_type == SOCK_RAW)) {
4717 
4718 			bzero((void *)so_laddr, sizeof (so_laddr));
4719 			bzero((void *)so_faddr, sizeof (so_faddr));
4720 
4721 			/* get local address */
4722 			len = sizeof (so_laddr);
4723 			(void) socket_getsockname(so,
4724 			    (struct sockaddr *)so_laddr, &len, CRED());
4725 
4726 			/* get peer address */
4727 
4728 			/* sanity check */
4729 			if (uap->to == NULL)
4730 				break;
4731 
4732 			/* sanity checks */
4733 			if (uap->tolen == 0)
4734 				break;
4735 
4736 			tolen = (socklen_t)uap->tolen;
4737 
4738 			/* enforce maximum size */
4739 			if (tolen > sizeof (so_faddr))
4740 				tolen = sizeof (so_faddr);
4741 
4742 			if (copyin((caddr_t)(uap->to), so_faddr, tolen) != 0)
4743 				break;
4744 
4745 			add_sock_token = 1;
4746 		} else {
4747 			/*
4748 			 * check if this is first time through.
4749 			 */
4750 
4751 			/* get path from file struct here */
4752 			fad = F2A(fp);
4753 			ASSERT(fad);
4754 
4755 			/*
4756 			 * already processed this file for write attempt
4757 			 */
4758 			if (fad->fad_flags & FAD_WRITE) {
4759 				/* don't want to audit every sendto attempt */
4760 				tad->tad_flag = 0;
4761 				/* free any residual audit data */
4762 				au_close(kctx, &(u_ad), 0, 0, 0, NULL);
4763 				releasef(fd);
4764 				return;
4765 			}
4766 			/*
4767 			 * mark things so we know what happened and don't
4768 			 * repeat things
4769 			 */
4770 			fad->fad_flags |= FAD_WRITE;
4771 
4772 			bzero((void *)so_laddr, sizeof (so_laddr));
4773 			bzero((void *)so_faddr, sizeof (so_faddr));
4774 
4775 			/* get local and foreign addresses */
4776 			len = sizeof (so_laddr);
4777 			(void) socket_getsockname(so,
4778 			    (struct sockaddr *)so_laddr, &len, CRED());
4779 			len = sizeof (so_faddr);
4780 			(void) socket_getpeername(so,
4781 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
4782 
4783 			add_sock_token = 1;
4784 		}
4785 
4786 		/* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */
4787 
4788 		break;
4789 
4790 	case AF_UNIX:
4791 		/*
4792 		 * first check if this is first time through. Too much
4793 		 * duplicate code to put this in an aui_ routine.
4794 		 */
4795 
4796 		/* get path from file struct here */
4797 		fad = F2A(fp);
4798 		ASSERT(fad);
4799 
4800 		/*
4801 		 * already processed this file for write attempt
4802 		 */
4803 		if (fad->fad_flags & FAD_WRITE) {
4804 			/* don't want to audit every sendto attempt */
4805 			tad->tad_flag = 0;
4806 			/* free any residual audit data */
4807 			au_close(kctx, &(u_ad), 0, 0, 0, NULL);
4808 			releasef(fd);
4809 			return;
4810 		}
4811 		/*
4812 		 * mark things so we know what happened and don't
4813 		 * repeat things
4814 		 */
4815 		fad->fad_flags |= FAD_WRITE;
4816 
4817 		if (fad->fad_aupath != NULL) {
4818 			au_uwrite(au_to_path(fad->fad_aupath));
4819 		} else {
4820 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
4821 		}
4822 
4823 		audit_attributes(fp->f_vnode);
4824 
4825 		releasef(fd);
4826 
4827 		return;
4828 
4829 	default:
4830 		break;
4831 
4832 	}
4833 
4834 	releasef(fd);
4835 
4836 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
4837 
4838 	if (add_sock_token == 0) {
4839 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
4840 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
4841 		au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4842 		return;
4843 	}
4844 
4845 	au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags)));
4846 
4847 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
4848 
4849 }
4850 
4851 /*
4852  * XXX socket(2) may be equivalent to open(2) on a unix domain
4853  * socket. This needs investigation.
4854  */
4855 
4856 /*ARGSUSED*/
4857 static void
4858 aus_socket(struct t_audit_data *tad)
4859 {
4860 	struct a {
4861 		long	domain;
4862 		long	type;
4863 		long	protocol;
4864 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4865 
4866 	au_uwrite(au_to_arg32(1, "domain", (uint32_t)uap->domain));
4867 	au_uwrite(au_to_arg32(2, "type", (uint32_t)uap->type));
4868 	au_uwrite(au_to_arg32(3, "protocol", (uint32_t)uap->protocol));
4869 }
4870 
4871 /*ARGSUSED*/
4872 static void
4873 aus_sigqueue(struct t_audit_data *tad)
4874 {
4875 	struct a {
4876 		long	pid;
4877 		long	signo;
4878 		long	*val;
4879 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4880 	struct proc *p;
4881 	uid_t uid, ruid;
4882 	gid_t gid, rgid;
4883 	pid_t pid;
4884 	const auditinfo_addr_t *ainfo;
4885 	cred_t *cr;
4886 
4887 	pid = (pid_t)uap->pid;
4888 
4889 	au_uwrite(au_to_arg32(2, "signal", (uint32_t)uap->signo));
4890 	if (pid > 0) {
4891 		mutex_enter(&pidlock);
4892 		if ((p = prfind(pid)) == (struct proc *)0) {
4893 			mutex_exit(&pidlock);
4894 			return;
4895 		}
4896 		mutex_enter(&p->p_lock); /* so process doesn't go away */
4897 		mutex_exit(&pidlock);
4898 
4899 		mutex_enter(&p->p_crlock);
4900 		crhold(cr = p->p_cred);
4901 		mutex_exit(&p->p_crlock);
4902 		mutex_exit(&p->p_lock);
4903 
4904 		ainfo = crgetauinfo(cr);
4905 		if (ainfo == NULL) {
4906 			crfree(cr);
4907 			return;
4908 		}
4909 
4910 		uid  = crgetuid(cr);
4911 		gid  = crgetgid(cr);
4912 		ruid = crgetruid(cr);
4913 		rgid = crgetrgid(cr);
4914 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
4915 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
4916 		crfree(cr);
4917 	}
4918 	else
4919 		au_uwrite(au_to_arg32(1, "process ID", (uint32_t)pid));
4920 }
4921 
4922 /*ARGSUSED*/
4923 static void
4924 aus_inst_sync(struct t_audit_data *tad)
4925 {
4926 	struct a {
4927 		long	name;	/* char */
4928 		long	flags;
4929 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4930 
4931 	au_uwrite(au_to_arg32(2, "flags", (uint32_t)uap->flags));
4932 }
4933 
4934 /*ARGSUSED*/
4935 static void
4936 aus_brandsys(struct t_audit_data *tad)
4937 {
4938 	klwp_t *clwp = ttolwp(curthread);
4939 
4940 	struct a {
4941 		long	cmd;
4942 		long	arg1;
4943 		long	arg2;
4944 		long	arg3;
4945 		long	arg4;
4946 		long	arg5;
4947 		long	arg6;
4948 	} *uap = (struct a *)clwp->lwp_ap;
4949 
4950 	au_uwrite(au_to_arg32(1, "cmd", (uint_t)uap->cmd));
4951 #ifdef _LP64
4952 	au_uwrite(au_to_arg64(2, "arg1", (uint64_t)uap->arg1));
4953 	au_uwrite(au_to_arg64(3, "arg2", (uint64_t)uap->arg2));
4954 	au_uwrite(au_to_arg64(4, "arg3", (uint64_t)uap->arg3));
4955 	au_uwrite(au_to_arg64(5, "arg4", (uint64_t)uap->arg4));
4956 	au_uwrite(au_to_arg64(6, "arg5", (uint64_t)uap->arg5));
4957 	au_uwrite(au_to_arg64(7, "arg6", (uint64_t)uap->arg6));
4958 #else
4959 	au_uwrite(au_to_arg32(2, "arg1", (uint32_t)uap->arg1));
4960 	au_uwrite(au_to_arg32(3, "arg2", (uint32_t)uap->arg2));
4961 	au_uwrite(au_to_arg32(4, "arg3", (uint32_t)uap->arg3));
4962 	au_uwrite(au_to_arg32(5, "arg4", (uint32_t)uap->arg4));
4963 	au_uwrite(au_to_arg32(6, "arg5", (uint32_t)uap->arg5));
4964 	au_uwrite(au_to_arg32(7, "arg6", (uint32_t)uap->arg6));
4965 #endif
4966 }
4967 
4968 /*ARGSUSED*/
4969 static void
4970 aus_p_online(struct t_audit_data *tad)
4971 {
4972 	struct a {
4973 		long	processor_id;
4974 		long	flag;
4975 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
4976 
4977 	struct flags {
4978 			int	flag;
4979 			char	*cflag;
4980 	} aflags[6] = {
4981 			{ P_ONLINE, "P_ONLINE"},
4982 			{ P_OFFLINE, "P_OFFLINE"},
4983 			{ P_NOINTR, "P_NOINTR"},
4984 			{ P_SPARE, "P_SPARE"},
4985 			{ P_FAULTED, "P_FAULTED"},
4986 			{ P_STATUS, "P_STATUS"}
4987 	};
4988 	int i;
4989 	char *cflag;
4990 
4991 	au_uwrite(au_to_arg32(1, "processor ID", (uint32_t)uap->processor_id));
4992 	au_uwrite(au_to_arg32(2, "flag", (uint32_t)uap->flag));
4993 
4994 	for (i = 0; i < 6; i++) {
4995 		if (aflags[i].flag == uap->flag)
4996 			break;
4997 	}
4998 	cflag = (i == 6) ? "bad flag":aflags[i].cflag;
4999 
5000 	au_uwrite(au_to_text(cflag));
5001 }
5002 
5003 /*ARGSUSED*/
5004 static void
5005 aus_processor_bind(struct t_audit_data *tad)
5006 {
5007 	struct a {
5008 		long	id_type;
5009 		long	id;
5010 		long	processor_id;
5011 		long	obind;
5012 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5013 
5014 	struct proc *p;
5015 	int lwpcnt;
5016 	uid_t uid, ruid;
5017 	gid_t gid, rgid;
5018 	pid_t pid;
5019 	const auditinfo_addr_t *ainfo;
5020 	cred_t *cr;
5021 
5022 	au_uwrite(au_to_arg32(1, "ID type", (uint32_t)uap->id_type));
5023 	au_uwrite(au_to_arg32(2, "ID", (uint32_t)uap->id));
5024 	if (uap->processor_id == PBIND_NONE)
5025 		au_uwrite(au_to_text("PBIND_NONE"));
5026 	else
5027 		au_uwrite(au_to_arg32(3, "processor_id",
5028 		    (uint32_t)uap->processor_id));
5029 
5030 	switch (uap->id_type) {
5031 	case P_MYID:
5032 	case P_LWPID:
5033 		mutex_enter(&pidlock);
5034 		p = ttoproc(curthread);
5035 		if (p == NULL || p->p_as == &kas) {
5036 			mutex_exit(&pidlock);
5037 			return;
5038 		}
5039 		mutex_enter(&p->p_lock);
5040 		mutex_exit(&pidlock);
5041 		lwpcnt = p->p_lwpcnt;
5042 		pid  = p->p_pid;
5043 
5044 		mutex_enter(&p->p_crlock);
5045 		crhold(cr = p->p_cred);
5046 		mutex_exit(&p->p_crlock);
5047 		mutex_exit(&p->p_lock);
5048 
5049 		ainfo = crgetauinfo(cr);
5050 		if (ainfo == NULL) {
5051 			crfree(cr);
5052 			return;
5053 		}
5054 
5055 		uid  = crgetuid(cr);
5056 		gid  = crgetgid(cr);
5057 		ruid = crgetruid(cr);
5058 		rgid = crgetrgid(cr);
5059 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
5060 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
5061 		crfree(cr);
5062 		break;
5063 	case P_PID:
5064 		mutex_enter(&pidlock);
5065 		p = prfind(uap->id);
5066 		if (p == NULL || p->p_as == &kas) {
5067 			mutex_exit(&pidlock);
5068 			return;
5069 		}
5070 		mutex_enter(&p->p_lock);
5071 		mutex_exit(&pidlock);
5072 		lwpcnt = p->p_lwpcnt;
5073 		pid  = p->p_pid;
5074 
5075 		mutex_enter(&p->p_crlock);
5076 		crhold(cr = p->p_cred);
5077 		mutex_exit(&p->p_crlock);
5078 		mutex_exit(&p->p_lock);
5079 
5080 		ainfo = crgetauinfo(cr);
5081 		if (ainfo == NULL) {
5082 			crfree(cr);
5083 			return;
5084 		}
5085 
5086 		uid  = crgetuid(cr);
5087 		gid  = crgetgid(cr);
5088 		ruid = crgetruid(cr);
5089 		rgid = crgetrgid(cr);
5090 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
5091 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
5092 		crfree(cr);
5093 
5094 		break;
5095 	default:
5096 		return;
5097 	}
5098 
5099 	if (uap->processor_id == PBIND_NONE &&
5100 	    (!(uap->id_type == P_LWPID && lwpcnt > 1)))
5101 		au_uwrite(au_to_text("PBIND_NONE for process"));
5102 	else
5103 		au_uwrite(au_to_arg32(3, "processor_id",
5104 		    (uint32_t)uap->processor_id));
5105 }
5106 
5107 /*ARGSUSED*/
5108 static au_event_t
5109 aui_doorfs(au_event_t e)
5110 {
5111 	uint32_t code;
5112 
5113 	struct a {		/* doorfs */
5114 		long	a1;
5115 		long	a2;
5116 		long	a3;
5117 		long	a4;
5118 		long	a5;
5119 		long	code;
5120 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5121 
5122 	/*
5123 	 *	audit formats for several of the
5124 	 *	door calls have not yet been determined
5125 	 */
5126 	code = (uint32_t)uap->code;
5127 	switch (code) {
5128 	case DOOR_CALL:
5129 		e = AUE_DOORFS_DOOR_CALL;
5130 		break;
5131 	case DOOR_RETURN:
5132 		e = AUE_NULL;
5133 		break;
5134 	case DOOR_CREATE:
5135 		e = AUE_DOORFS_DOOR_CREATE;
5136 		break;
5137 	case DOOR_REVOKE:
5138 		e = AUE_DOORFS_DOOR_REVOKE;
5139 		break;
5140 	case DOOR_INFO:
5141 		e = AUE_NULL;
5142 		break;
5143 	case DOOR_UCRED:
5144 		e = AUE_NULL;
5145 		break;
5146 	case DOOR_BIND:
5147 		e = AUE_NULL;
5148 		break;
5149 	case DOOR_UNBIND:
5150 		e = AUE_NULL;
5151 		break;
5152 	case DOOR_GETPARAM:
5153 		e = AUE_NULL;
5154 		break;
5155 	case DOOR_SETPARAM:
5156 		e = AUE_NULL;
5157 		break;
5158 	default:	/* illegal system call */
5159 		e = AUE_NULL;
5160 		break;
5161 	}
5162 
5163 	return (e);
5164 }
5165 
5166 static door_node_t *
5167 au_door_lookup(int did)
5168 {
5169 	vnode_t	*vp;
5170 	file_t *fp;
5171 
5172 	if ((fp = getf(did)) == NULL)
5173 		return (NULL);
5174 	/*
5175 	 * Use the underlying vnode (we may be namefs mounted)
5176 	 */
5177 	if (VOP_REALVP(fp->f_vnode, &vp, NULL))
5178 		vp = fp->f_vnode;
5179 
5180 	if (vp == NULL || vp->v_type != VDOOR) {
5181 		releasef(did);
5182 		return (NULL);
5183 	}
5184 
5185 	return (VTOD(vp));
5186 }
5187 
5188 /*ARGSUSED*/
5189 static void
5190 aus_doorfs(struct t_audit_data *tad)
5191 {
5192 
5193 	struct a {		/* doorfs */
5194 		long	a1;
5195 		long	a2;
5196 		long	a3;
5197 		long	a4;
5198 		long	a5;
5199 		long	code;
5200 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5201 
5202 	door_node_t	*dp;
5203 	struct proc	*p;
5204 	uint32_t	did;
5205 	uid_t uid, ruid;
5206 	gid_t gid, rgid;
5207 	pid_t pid;
5208 	const auditinfo_addr_t *ainfo;
5209 	cred_t *cr;
5210 
5211 	did = (uint32_t)uap->a1;
5212 
5213 	switch (tad->tad_event) {
5214 	case AUE_DOORFS_DOOR_CALL:
5215 		au_uwrite(au_to_arg32(1, "door ID", (uint32_t)did));
5216 		if ((dp = au_door_lookup(did)) == NULL)
5217 			break;
5218 
5219 		if (DOOR_INVALID(dp)) {
5220 			releasef(did);
5221 			break;
5222 		}
5223 
5224 		if ((p = dp->door_target) == NULL) {
5225 			releasef(did);
5226 			break;
5227 		}
5228 		mutex_enter(&p->p_lock);
5229 		releasef(did);
5230 
5231 		pid  = p->p_pid;
5232 
5233 		mutex_enter(&p->p_crlock);
5234 		crhold(cr = p->p_cred);
5235 		mutex_exit(&p->p_crlock);
5236 		mutex_exit(&p->p_lock);
5237 
5238 		ainfo = crgetauinfo(cr);
5239 		if (ainfo == NULL) {
5240 			crfree(cr);
5241 			return;
5242 		}
5243 		uid  = crgetuid(cr);
5244 		gid  = crgetgid(cr);
5245 		ruid = crgetruid(cr);
5246 		rgid = crgetrgid(cr);
5247 		au_uwrite(au_to_process(uid, gid, ruid, rgid, pid,
5248 		    ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid));
5249 		crfree(cr);
5250 		break;
5251 	case AUE_DOORFS_DOOR_RETURN:
5252 		/*
5253 		 * We may want to write information about
5254 		 * all doors (if any) which will be copied
5255 		 * by this call to the user space
5256 		 */
5257 		break;
5258 	case AUE_DOORFS_DOOR_CREATE:
5259 		au_uwrite(au_to_arg32(3, "door attr", (uint32_t)uap->a3));
5260 		break;
5261 	case AUE_DOORFS_DOOR_REVOKE:
5262 		au_uwrite(au_to_arg32(1, "door ID", (uint32_t)did));
5263 		break;
5264 	case AUE_DOORFS_DOOR_INFO:
5265 		break;
5266 	case AUE_DOORFS_DOOR_CRED:
5267 		break;
5268 	case AUE_DOORFS_DOOR_BIND:
5269 		break;
5270 	case AUE_DOORFS_DOOR_UNBIND: {
5271 		break;
5272 	}
5273 	default:	/* illegal system call */
5274 		break;
5275 	}
5276 }
5277 
5278 /*ARGSUSED*/
5279 static au_event_t
5280 aui_acl(au_event_t e)
5281 {
5282 	struct a {
5283 		union {
5284 			long	name;	/* char */
5285 			long	fd;
5286 		}		obj;
5287 
5288 		long		cmd;
5289 		long		nentries;
5290 		long		arg;	/* aclent_t */
5291 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5292 
5293 	switch (uap->cmd) {
5294 	case SETACL:
5295 	case ACE_SETACL:
5296 		/*
5297 		 * acl(SETACL/ACE_SETACL, ...) and facl(SETACL/ACE_SETACL, ...)
5298 		 * are expected.
5299 		 */
5300 		break;
5301 	case GETACL:
5302 	case GETACLCNT:
5303 	case ACE_GETACL:
5304 	case ACE_GETACLCNT:
5305 		/* do nothing for these four values. */
5306 		e = AUE_NULL;
5307 		break;
5308 	default:
5309 		/* illegal system call */
5310 		break;
5311 	}
5312 
5313 	return (e);
5314 }
5315 
5316 static void
5317 au_acl(int cmd, int nentries, caddr_t bufp)
5318 {
5319 	size_t		a_size;
5320 	aclent_t	*aclbufp;
5321 	ace_t		*acebufp;
5322 	int		i;
5323 
5324 	switch (cmd) {
5325 	case GETACL:
5326 	case GETACLCNT:
5327 		break;
5328 	case SETACL:
5329 		if (nentries < 3)
5330 			break;
5331 
5332 		a_size = nentries * sizeof (aclent_t);
5333 
5334 		if ((aclbufp = kmem_alloc(a_size, KM_SLEEP)) == NULL)
5335 			break;
5336 		if (copyin(bufp, aclbufp, a_size)) {
5337 			kmem_free(aclbufp, a_size);
5338 			break;
5339 		}
5340 		for (i = 0; i < nentries; i++) {
5341 			au_uwrite(au_to_acl(aclbufp + i));
5342 		}
5343 		kmem_free(aclbufp, a_size);
5344 		break;
5345 
5346 	case ACE_SETACL:
5347 		if (nentries < 1 || nentries > MAX_ACL_ENTRIES)
5348 			break;
5349 
5350 		a_size = nentries * sizeof (ace_t);
5351 		if ((acebufp = kmem_alloc(a_size, KM_SLEEP)) == NULL)
5352 			break;
5353 		if (copyin(bufp, acebufp, a_size)) {
5354 			kmem_free(acebufp, a_size);
5355 			break;
5356 		}
5357 		for (i = 0; i < nentries; i++) {
5358 			au_uwrite(au_to_ace(acebufp + i));
5359 		}
5360 		kmem_free(acebufp, a_size);
5361 		break;
5362 	default:
5363 		break;
5364 	}
5365 }
5366 
5367 /*ARGSUSED*/
5368 static void
5369 aus_acl(struct t_audit_data *tad)
5370 {
5371 	struct a {
5372 		long	fname;
5373 		long	cmd;
5374 		long	nentries;
5375 		long	aclbufp;
5376 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5377 
5378 	au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd));
5379 	au_uwrite(au_to_arg32(3, "nentries", (uint32_t)uap->nentries));
5380 
5381 	au_acl(uap->cmd, uap->nentries, (caddr_t)uap->aclbufp);
5382 }
5383 
5384 /*ARGSUSED*/
5385 static void
5386 aus_facl(struct t_audit_data *tad)
5387 {
5388 	struct a {
5389 		long	fd;
5390 		long	cmd;
5391 		long	nentries;
5392 		long	aclbufp;
5393 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5394 	struct file  *fp;
5395 	struct vnode *vp;
5396 	struct f_audit_data *fad;
5397 	int fd;
5398 
5399 	au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd));
5400 	au_uwrite(au_to_arg32(3, "nentries", (uint32_t)uap->nentries));
5401 
5402 	fd = (int)uap->fd;
5403 
5404 	if ((fp = getf(fd)) == NULL)
5405 		return;
5406 
5407 	/* get path from file struct here */
5408 	fad = F2A(fp);
5409 	if (fad->fad_aupath != NULL) {
5410 		au_uwrite(au_to_path(fad->fad_aupath));
5411 	} else {
5412 		au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd));
5413 	}
5414 
5415 	vp = fp->f_vnode;
5416 	audit_attributes(vp);
5417 
5418 	/* decrement file descriptor reference count */
5419 	releasef(fd);
5420 
5421 	au_acl(uap->cmd, uap->nentries, (caddr_t)uap->aclbufp);
5422 }
5423 
5424 /*ARGSUSED*/
5425 static void
5426 auf_read(tad, error, rval)
5427 	struct t_audit_data *tad;
5428 	int error;
5429 	rval_t *rval;
5430 {
5431 	struct file *fp;
5432 	struct f_audit_data *fad;
5433 	int fd;
5434 	register struct a {
5435 		long	fd;
5436 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5437 	au_kcontext_t	*kctx = GET_KCTX_PZ;
5438 
5439 	fd = (int)uap->fd;
5440 
5441 	/*
5442 	 * convert file pointer to file descriptor
5443 	 *   Note: fd ref count incremented here.
5444 	 */
5445 	if ((fp = getf(fd)) == NULL)
5446 		return;
5447 
5448 	/* get path from file struct here */
5449 	fad = F2A(fp);
5450 	ASSERT(fad);
5451 
5452 	/*
5453 	 * already processed this file for read attempt
5454 	 *
5455 	 * XXX might be better to turn off auditing in a aui_read() routine.
5456 	 */
5457 	if (fad->fad_flags & FAD_READ) {
5458 		/* don't really want to audit every read attempt */
5459 		tad->tad_flag = 0;
5460 		/* free any residual audit data */
5461 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5462 		releasef(fd);
5463 		return;
5464 	}
5465 	/* mark things so we know what happened and don't repeat things */
5466 	fad->fad_flags |= FAD_READ;
5467 
5468 	if (fad->fad_aupath != NULL) {
5469 		au_uwrite(au_to_path(fad->fad_aupath));
5470 	} else {
5471 		au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd));
5472 	}
5473 
5474 	/* include attributes */
5475 	audit_attributes(fp->f_vnode);
5476 
5477 	/* decrement file descriptor reference count */
5478 	releasef(fd);
5479 }
5480 
5481 /*ARGSUSED*/
5482 static void
5483 auf_write(tad, error, rval)
5484 	struct t_audit_data *tad;
5485 	int error;
5486 	rval_t *rval;
5487 {
5488 	struct file *fp;
5489 	struct f_audit_data *fad;
5490 	int fd;
5491 	register struct a {
5492 		long	fd;
5493 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5494 	au_kcontext_t	*kctx = GET_KCTX_PZ;
5495 
5496 	fd = (int)uap->fd;
5497 
5498 	/*
5499 	 * convert file pointer to file descriptor
5500 	 *   Note: fd ref count incremented here.
5501 	 */
5502 	if ((fp = getf(fd)) == NULL)
5503 		return;
5504 
5505 	/* get path from file struct here */
5506 	fad = F2A(fp);
5507 	ASSERT(fad);
5508 
5509 	/*
5510 	 * already processed this file for write attempt
5511 	 *
5512 	 * XXX might be better to turn off auditing in a aus_write() routine.
5513 	 */
5514 	if (fad->fad_flags & FAD_WRITE) {
5515 		/* don't really want to audit every write attempt */
5516 		tad->tad_flag = 0;
5517 		/* free any residual audit data */
5518 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5519 		releasef(fd);
5520 		return;
5521 	}
5522 	/* mark things so we know what happened and don't repeat things */
5523 	fad->fad_flags |= FAD_WRITE;
5524 
5525 	if (fad->fad_aupath != NULL) {
5526 		au_uwrite(au_to_path(fad->fad_aupath));
5527 	} else {
5528 		au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd));
5529 	}
5530 
5531 	/* include attributes */
5532 	audit_attributes(fp->f_vnode);
5533 
5534 	/* decrement file descriptor reference count */
5535 	releasef(fd);
5536 }
5537 
5538 /*ARGSUSED*/
5539 static void
5540 auf_recv(tad, error, rval)
5541 	struct t_audit_data *tad;
5542 	int error;
5543 	rval_t *rval;
5544 {
5545 	struct sonode *so;
5546 	char so_laddr[sizeof (struct sockaddr_in6)];
5547 	char so_faddr[sizeof (struct sockaddr_in6)];
5548 	struct file *fp;
5549 	struct f_audit_data *fad;
5550 	int fd;
5551 	int err;
5552 	socklen_t len;
5553 	short so_family, so_type;
5554 	register struct a {
5555 		long	fd;
5556 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5557 	au_kcontext_t	*kctx = GET_KCTX_PZ;
5558 
5559 	/*
5560 	 * If there was an error, then nothing to do. Only generate
5561 	 * audit record on first successful recv.
5562 	 */
5563 	if (error) {
5564 		/* Turn off audit record generation here. */
5565 		tad->tad_flag = 0;
5566 		/* free any residual audit data */
5567 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5568 		return;
5569 	}
5570 
5571 	fd = (int)uap->fd;
5572 
5573 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
5574 		/* Turn off audit record generation here. */
5575 		tad->tad_flag = 0;
5576 		/* free any residual audit data */
5577 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5578 		return;
5579 	}
5580 
5581 	/* get path from file struct here */
5582 	fad = F2A(fp);
5583 	ASSERT(fad);
5584 
5585 	/*
5586 	 * already processed this file for read attempt
5587 	 */
5588 	if (fad->fad_flags & FAD_READ) {
5589 		releasef(fd);
5590 		/* don't really want to audit every recv call */
5591 		tad->tad_flag = 0;
5592 		/* free any residual audit data */
5593 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5594 		return;
5595 	}
5596 
5597 	/* mark things so we know what happened and don't repeat things */
5598 	fad->fad_flags |= FAD_READ;
5599 
5600 	so_family = so->so_family;
5601 	so_type   = so->so_type;
5602 
5603 	switch (so_family) {
5604 	case AF_INET:
5605 	case AF_INET6:
5606 		/*
5607 		 * Only for connections.
5608 		 * XXX - do we need to worry about SOCK_DGRAM or other types???
5609 		 */
5610 		if (so->so_state & SS_ISBOUND) {
5611 
5612 			bzero((void *)so_laddr, sizeof (so_laddr));
5613 			bzero((void *)so_faddr, sizeof (so_faddr));
5614 
5615 			/* get local and foreign addresses */
5616 			len = sizeof (so_laddr);
5617 			(void) socket_getsockname(so,
5618 			    (struct sockaddr *)so_laddr, &len, CRED());
5619 			len = sizeof (so_faddr);
5620 			(void) socket_getpeername(so,
5621 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
5622 
5623 			/*
5624 			 * only way to drop out of switch. Note that we
5625 			 * we release fd below.
5626 			 */
5627 
5628 			break;
5629 		}
5630 
5631 		releasef(fd);
5632 
5633 		/* don't really want to audit every recv call */
5634 		tad->tad_flag = 0;
5635 		/* free any residual audit data */
5636 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5637 
5638 		return;
5639 
5640 	case AF_UNIX:
5641 
5642 		if (fad->fad_aupath != NULL) {
5643 			au_uwrite(au_to_path(fad->fad_aupath));
5644 		} else {
5645 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
5646 		}
5647 
5648 		audit_attributes(fp->f_vnode);
5649 
5650 		releasef(fd);
5651 
5652 		return;
5653 
5654 	default:
5655 		releasef(fd);
5656 
5657 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
5658 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
5659 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
5660 
5661 		return;
5662 	}
5663 
5664 	releasef(fd);
5665 
5666 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
5667 
5668 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
5669 
5670 }
5671 
5672 /*ARGSUSED*/
5673 static void
5674 auf_send(tad, error, rval)
5675 	struct t_audit_data *tad;
5676 	int error;
5677 	rval_t *rval;
5678 {
5679 	struct sonode *so;
5680 	char so_laddr[sizeof (struct sockaddr_in6)];
5681 	char so_faddr[sizeof (struct sockaddr_in6)];
5682 	struct file *fp;
5683 	struct f_audit_data *fad;
5684 	int fd;
5685 	int err;
5686 	socklen_t len;
5687 	short so_family, so_type;
5688 	register struct a {
5689 		long	fd;
5690 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5691 	au_kcontext_t	*kctx = GET_KCTX_PZ;
5692 
5693 	fd = (int)uap->fd;
5694 
5695 	/*
5696 	 * If there was an error, then nothing to do. Only generate
5697 	 * audit record on first successful send.
5698 	 */
5699 	if (error != 0) {
5700 		/* Turn off audit record generation here. */
5701 		tad->tad_flag = 0;
5702 		/* free any residual audit data */
5703 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5704 		return;
5705 	}
5706 
5707 	fd = (int)uap->fd;
5708 
5709 	if ((so = getsonode(fd, &err, &fp)) == NULL) {
5710 		/* Turn off audit record generation here. */
5711 		tad->tad_flag = 0;
5712 		/* free any residual audit data */
5713 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5714 		return;
5715 	}
5716 
5717 	/* get path from file struct here */
5718 	fad = F2A(fp);
5719 	ASSERT(fad);
5720 
5721 	/*
5722 	 * already processed this file for write attempt
5723 	 */
5724 	if (fad->fad_flags & FAD_WRITE) {
5725 		releasef(fd);
5726 		/* don't really want to audit every send call */
5727 		tad->tad_flag = 0;
5728 		/* free any residual audit data */
5729 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5730 		return;
5731 	}
5732 
5733 	/* mark things so we know what happened and don't repeat things */
5734 	fad->fad_flags |= FAD_WRITE;
5735 
5736 	so_family = so->so_family;
5737 	so_type   = so->so_type;
5738 
5739 	switch (so_family) {
5740 	case AF_INET:
5741 	case AF_INET6:
5742 		/*
5743 		 * Only for connections.
5744 		 * XXX - do we need to worry about SOCK_DGRAM or other types???
5745 		 */
5746 		if (so->so_state & SS_ISBOUND) {
5747 
5748 			bzero((void *)so_laddr, sizeof (so_laddr));
5749 			bzero((void *)so_faddr, sizeof (so_faddr));
5750 
5751 			/* get local and foreign addresses */
5752 			len = sizeof (so_laddr);
5753 			(void) socket_getsockname(so,
5754 			    (struct sockaddr *)so_laddr, &len, CRED());
5755 			len = sizeof (so_faddr);
5756 			(void) socket_getpeername(so,
5757 			    (struct sockaddr *)so_faddr, &len, B_FALSE, CRED());
5758 
5759 			/*
5760 			 * only way to drop out of switch. Note that we
5761 			 * we release fd below.
5762 			 */
5763 
5764 			break;
5765 		}
5766 
5767 		releasef(fd);
5768 		/* don't really want to audit every send call */
5769 		tad->tad_flag = 0;
5770 		/* free any residual audit data */
5771 		au_close(kctx, &(u_ad), 0, 0, 0, NULL);
5772 
5773 		return;
5774 
5775 	case AF_UNIX:
5776 
5777 		if (fad->fad_aupath != NULL) {
5778 			au_uwrite(au_to_path(fad->fad_aupath));
5779 		} else {
5780 			au_uwrite(au_to_arg32(1, "no path: fd", fd));
5781 		}
5782 
5783 		audit_attributes(fp->f_vnode);
5784 
5785 		releasef(fd);
5786 
5787 		return;
5788 
5789 	default:
5790 		releasef(fd);
5791 
5792 		au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
5793 		au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family));
5794 		au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type));
5795 
5796 		return;
5797 	}
5798 
5799 	releasef(fd);
5800 
5801 	au_uwrite(au_to_arg32(1, "so", (uint32_t)fd));
5802 
5803 	au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr));
5804 }
5805 
5806 static au_event_t
5807 aui_forksys(au_event_t e)
5808 {
5809 	struct a {
5810 		long	subcode;
5811 		long	flags;
5812 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5813 
5814 	switch ((uint_t)uap->subcode) {
5815 	case 0:
5816 		e = AUE_FORK1;
5817 		break;
5818 	case 1:
5819 		e = AUE_FORKALL;
5820 		break;
5821 	case 2:
5822 		e = AUE_VFORK;
5823 		break;
5824 	default:
5825 		e = AUE_NULL;
5826 		break;
5827 	}
5828 
5829 	return (e);
5830 }
5831 
5832 /*ARGSUSED*/
5833 static au_event_t
5834 aui_portfs(au_event_t e)
5835 {
5836 	struct a {		/* portfs */
5837 		long	a1;
5838 		long	a2;
5839 		long	a3;
5840 	} *uap = (struct a *)ttolwp(curthread)->lwp_ap;
5841 
5842 	/*
5843 	 * check opcode
5844 	 */
5845 	switch (((uint_t)uap->a1) & PORT_CODE_MASK) {
5846 	case PORT_ASSOCIATE:
5847 		/* check source */
5848 		if (((uint_t)uap->a3 == PORT_SOURCE_FILE) ||
5849 		    ((uint_t)uap->a3 == PORT_SOURCE_FD)) {
5850 			e = AUE_PORTFS_ASSOCIATE;
5851 		} else {
5852 			e = AUE_NULL;
5853 		}
5854 		break;
5855 	case PORT_DISSOCIATE:
5856 		/* check source */
5857 		if (((uint_t)uap->a3 == PORT_SOURCE_FILE) ||
5858 		    ((uint_t)uap->a3 == PORT_SOURCE_FD)) {
5859 			e = AUE_PORTFS_DISSOCIATE;
5860 		} else {
5861 			e = AUE_NULL;
5862 		}
5863 		break;
5864 	default:
5865 		e = AUE_NULL;
5866 	}
5867 	return (e);
5868 }
5869