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