xref: /freebsd-src/sys/security/audit/audit_bsm.c (revision fdafd315ad0d0f28a11b9fb4476a9ab059c62b92)
1718c8510SRobert Watson /*
251369649SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
351369649SPedro F. Giffuni  *
44ba1f444SRobert Watson  * Copyright (c) 1999-2009 Apple Inc.
5759c8caaSRobert Watson  * Copyright (c) 2016-2017 Robert N. M. Watson
6718c8510SRobert Watson  * All rights reserved.
7718c8510SRobert Watson  *
8759c8caaSRobert Watson  * Portions of this software were developed by BAE Systems, the University of
9759c8caaSRobert Watson  * Cambridge Computer Laboratory, and Memorial University under DARPA/AFRL
10759c8caaSRobert Watson  * contract FA8650-15-C-7558 ("CADETS"), as part of the DARPA Transparent
11759c8caaSRobert Watson  * Computing (TC) research program.
12759c8caaSRobert Watson  *
13718c8510SRobert Watson  * Redistribution and use in source and binary forms, with or without
14718c8510SRobert Watson  * modification, are permitted provided that the following conditions
15718c8510SRobert Watson  * are met:
16718c8510SRobert Watson  * 1.  Redistributions of source code must retain the above copyright
17718c8510SRobert Watson  *     notice, this list of conditions and the following disclaimer.
18718c8510SRobert Watson  * 2.  Redistributions in binary form must reproduce the above copyright
19718c8510SRobert Watson  *     notice, this list of conditions and the following disclaimer in the
20718c8510SRobert Watson  *     documentation and/or other materials provided with the distribution.
21bc9a43d6SRobert Watson  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
22718c8510SRobert Watson  *     its contributors may be used to endorse or promote products derived
23718c8510SRobert Watson  *     from this software without specific prior written permission.
24718c8510SRobert Watson  *
25718c8510SRobert Watson  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
26718c8510SRobert Watson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27718c8510SRobert Watson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28718c8510SRobert Watson  * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
29718c8510SRobert Watson  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30718c8510SRobert Watson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31718c8510SRobert Watson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32718c8510SRobert Watson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33718c8510SRobert Watson  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
34718c8510SRobert Watson  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35718c8510SRobert Watson  * POSSIBILITY OF SUCH DAMAGE.
36718c8510SRobert Watson  */
37718c8510SRobert Watson 
38718c8510SRobert Watson #include <sys/param.h>
39718c8510SRobert Watson #include <sys/vnode.h>
40718c8510SRobert Watson #include <sys/ipc.h>
41718c8510SRobert Watson #include <sys/lock.h>
42718c8510SRobert Watson #include <sys/malloc.h>
43718c8510SRobert Watson #include <sys/mutex.h>
44718c8510SRobert Watson #include <sys/socket.h>
4565ee602eSWayne Salamon #include <sys/extattr.h>
46718c8510SRobert Watson #include <sys/fcntl.h>
47718c8510SRobert Watson #include <sys/user.h>
48718c8510SRobert Watson #include <sys/systm.h>
49718c8510SRobert Watson 
50718c8510SRobert Watson #include <bsm/audit.h>
51718c8510SRobert Watson #include <bsm/audit_internal.h>
52718c8510SRobert Watson #include <bsm/audit_record.h>
53718c8510SRobert Watson #include <bsm/audit_kevents.h>
54718c8510SRobert Watson 
55718c8510SRobert Watson #include <security/audit/audit.h>
56718c8510SRobert Watson #include <security/audit/audit_private.h>
57718c8510SRobert Watson 
58718c8510SRobert Watson #include <netinet/in_systm.h>
59718c8510SRobert Watson #include <netinet/in.h>
60718c8510SRobert Watson #include <netinet/ip.h>
61718c8510SRobert Watson 
62718c8510SRobert Watson MALLOC_DEFINE(M_AUDITBSM, "audit_bsm", "Audit BSM data");
63718c8510SRobert Watson 
64718c8510SRobert Watson static void	audit_sys_auditon(struct audit_record *ar,
65718c8510SRobert Watson 		    struct au_record *rec);
66718c8510SRobert Watson 
67718c8510SRobert Watson /*
68718c8510SRobert Watson  * Initialize the BSM auditing subsystem.
69718c8510SRobert Watson  */
70718c8510SRobert Watson void
kau_init(void)71718c8510SRobert Watson kau_init(void)
72718c8510SRobert Watson {
73718c8510SRobert Watson 
74718c8510SRobert Watson 	au_evclassmap_init();
75759c8caaSRobert Watson 	au_evnamemap_init();
76718c8510SRobert Watson }
77718c8510SRobert Watson 
78718c8510SRobert Watson /*
79871499feSRobert Watson  * This call reserves memory for the audit record.  Memory must be guaranteed
80871499feSRobert Watson  * before any auditable event can be generated.  The au_record structure
81871499feSRobert Watson  * maintains a reference to the memory allocated above and also the list of
82f1cb6030SRobert Watson  * tokens associated with this record.
83718c8510SRobert Watson  */
84718c8510SRobert Watson static struct au_record *
kau_open(void)85718c8510SRobert Watson kau_open(void)
86718c8510SRobert Watson {
87718c8510SRobert Watson 	struct au_record *rec;
88718c8510SRobert Watson 
89718c8510SRobert Watson 	rec = malloc(sizeof(*rec), M_AUDITBSM, M_WAITOK);
9004f11621SRobert Watson 	rec->data = NULL;
91718c8510SRobert Watson 	TAILQ_INIT(&rec->token_q);
92718c8510SRobert Watson 	rec->len = 0;
93718c8510SRobert Watson 	rec->used = 1;
94718c8510SRobert Watson 
95718c8510SRobert Watson 	return (rec);
96718c8510SRobert Watson }
97718c8510SRobert Watson 
98718c8510SRobert Watson /*
99718c8510SRobert Watson  * Store the token with the record descriptor.
100718c8510SRobert Watson  */
101718c8510SRobert Watson static void
kau_write(struct au_record * rec,struct au_token * tok)102718c8510SRobert Watson kau_write(struct au_record *rec, struct au_token *tok)
103718c8510SRobert Watson {
104718c8510SRobert Watson 
105718c8510SRobert Watson 	KASSERT(tok != NULL, ("kau_write: tok == NULL"));
106718c8510SRobert Watson 
107718c8510SRobert Watson 	TAILQ_INSERT_TAIL(&rec->token_q, tok, tokens);
108718c8510SRobert Watson 	rec->len += tok->len;
109718c8510SRobert Watson }
110718c8510SRobert Watson 
111718c8510SRobert Watson /*
112718c8510SRobert Watson  * Close out the audit record by adding the header token, identifying any
113718c8510SRobert Watson  * missing tokens.  Write out the tokens to the record memory.
114718c8510SRobert Watson  */
115718c8510SRobert Watson static void
kau_close(struct au_record * rec,struct timespec * ctime,short event)116718c8510SRobert Watson kau_close(struct au_record *rec, struct timespec *ctime, short event)
117718c8510SRobert Watson {
118718c8510SRobert Watson 	u_char *dptr;
119718c8510SRobert Watson 	size_t tot_rec_size;
120718c8510SRobert Watson 	token_t *cur, *hdr, *trail;
121718c8510SRobert Watson 	struct timeval tm;
122ffbcef5aSChristian S.J. Peron 	size_t hdrsize;
123ffbcef5aSChristian S.J. Peron 	struct auditinfo_addr ak;
124ffbcef5aSChristian S.J. Peron 	struct in6_addr *ap;
125718c8510SRobert Watson 
126ffbcef5aSChristian S.J. Peron 	audit_get_kinfo(&ak);
127ffbcef5aSChristian S.J. Peron 	hdrsize = 0;
128ffbcef5aSChristian S.J. Peron 	switch (ak.ai_termid.at_type) {
129ffbcef5aSChristian S.J. Peron 	case AU_IPv4:
130ffbcef5aSChristian S.J. Peron 		hdrsize = (ak.ai_termid.at_addr[0] == INADDR_ANY) ?
131ffbcef5aSChristian S.J. Peron 		    AUDIT_HEADER_SIZE : AUDIT_HEADER_EX_SIZE(&ak);
132ffbcef5aSChristian S.J. Peron 		break;
133ffbcef5aSChristian S.J. Peron 	case AU_IPv6:
134ffbcef5aSChristian S.J. Peron 		ap = (struct in6_addr *)&ak.ai_termid.at_addr[0];
135ffbcef5aSChristian S.J. Peron 		hdrsize = (IN6_IS_ADDR_UNSPECIFIED(ap)) ? AUDIT_HEADER_SIZE :
136ffbcef5aSChristian S.J. Peron 		    AUDIT_HEADER_EX_SIZE(&ak);
137ffbcef5aSChristian S.J. Peron 		break;
138ffbcef5aSChristian S.J. Peron 	default:
139ffbcef5aSChristian S.J. Peron 		panic("kau_close: invalid address family");
140ffbcef5aSChristian S.J. Peron 	}
141ffbcef5aSChristian S.J. Peron 	tot_rec_size = rec->len + hdrsize + AUDIT_TRAILER_SIZE;
14204f11621SRobert Watson 	rec->data = malloc(tot_rec_size, M_AUDITBSM, M_WAITOK | M_ZERO);
143d8c0f4dcSRobert Watson 
144718c8510SRobert Watson 	tm.tv_usec = ctime->tv_nsec / 1000;
145718c8510SRobert Watson 	tm.tv_sec = ctime->tv_sec;
146ffbcef5aSChristian S.J. Peron 	if (hdrsize != AUDIT_HEADER_SIZE)
147ffbcef5aSChristian S.J. Peron 		hdr = au_to_header32_ex_tm(tot_rec_size, event, 0, tm, &ak);
148ffbcef5aSChristian S.J. Peron 	else
1494b6d6bcfSRobert Watson 		hdr = au_to_header32_tm(tot_rec_size, event, 0, tm);
150718c8510SRobert Watson 	TAILQ_INSERT_HEAD(&rec->token_q, hdr, tokens);
151718c8510SRobert Watson 
152718c8510SRobert Watson 	trail = au_to_trailer(tot_rec_size);
153718c8510SRobert Watson 	TAILQ_INSERT_TAIL(&rec->token_q, trail, tokens);
154718c8510SRobert Watson 
155718c8510SRobert Watson 	rec->len = tot_rec_size;
156718c8510SRobert Watson 	dptr = rec->data;
157718c8510SRobert Watson 	TAILQ_FOREACH(cur, &rec->token_q, tokens) {
158718c8510SRobert Watson 		memcpy(dptr, cur->t_data, cur->len);
159718c8510SRobert Watson 		dptr += cur->len;
160718c8510SRobert Watson 	}
161718c8510SRobert Watson }
162718c8510SRobert Watson 
163718c8510SRobert Watson /*
164871499feSRobert Watson  * Free a BSM audit record by releasing all the tokens and clearing the audit
165871499feSRobert Watson  * record information.
166718c8510SRobert Watson  */
167718c8510SRobert Watson void
kau_free(struct au_record * rec)168718c8510SRobert Watson kau_free(struct au_record *rec)
169718c8510SRobert Watson {
170718c8510SRobert Watson 	struct au_token *tok;
171718c8510SRobert Watson 
172871499feSRobert Watson 	/* Free the token list. */
173718c8510SRobert Watson 	while ((tok = TAILQ_FIRST(&rec->token_q))) {
174718c8510SRobert Watson 		TAILQ_REMOVE(&rec->token_q, tok, tokens);
175718c8510SRobert Watson 		free(tok->t_data, M_AUDITBSM);
176718c8510SRobert Watson 		free(tok, M_AUDITBSM);
177718c8510SRobert Watson 	}
178718c8510SRobert Watson 
179718c8510SRobert Watson 	rec->used = 0;
180718c8510SRobert Watson 	rec->len = 0;
181718c8510SRobert Watson 	free(rec->data, M_AUDITBSM);
182718c8510SRobert Watson 	free(rec, M_AUDITBSM);
183718c8510SRobert Watson }
184718c8510SRobert Watson 
185718c8510SRobert Watson /*
186d8c0f4dcSRobert Watson  * XXX: May want turn some (or all) of these macros into functions in order
18798ee1b30SRobert Watson  * to reduce the generated code size.
188718c8510SRobert Watson  *
189718c8510SRobert Watson  * XXXAUDIT: These macros assume that 'kar', 'ar', 'rec', and 'tok' in the
190718c8510SRobert Watson  * caller are OK with this.
191718c8510SRobert Watson  */
192e4b4bbb6SRobert Watson #define	ATFD1_TOKENS(argnum) do {					\
193e4b4bbb6SRobert Watson 	if (ARG_IS_VALID(kar, ARG_ATFD1)) {				\
194e4b4bbb6SRobert Watson 		tok = au_to_arg32(argnum, "at fd 1", ar->ar_arg_atfd1);	\
195e4b4bbb6SRobert Watson 		kau_write(rec, tok);					\
196e4b4bbb6SRobert Watson 	}								\
197e4b4bbb6SRobert Watson } while (0)
198e4b4bbb6SRobert Watson 
199e4b4bbb6SRobert Watson #define	ATFD2_TOKENS(argnum) do {					\
200e4b4bbb6SRobert Watson 	if (ARG_IS_VALID(kar, ARG_ATFD2)) {				\
201e4b4bbb6SRobert Watson 		tok = au_to_arg32(argnum, "at fd 2", ar->ar_arg_atfd2);	\
202e4b4bbb6SRobert Watson 		kau_write(rec, tok);					\
203e4b4bbb6SRobert Watson 	}								\
204e4b4bbb6SRobert Watson } while (0)
205e4b4bbb6SRobert Watson 
206718c8510SRobert Watson #define	UPATH1_TOKENS do {						\
207718c8510SRobert Watson 	if (ARG_IS_VALID(kar, ARG_UPATH1)) {				\
208718c8510SRobert Watson 		tok = au_to_path(ar->ar_arg_upath1);			\
209718c8510SRobert Watson 		kau_write(rec, tok);					\
210718c8510SRobert Watson 	}								\
211718c8510SRobert Watson } while (0)
212718c8510SRobert Watson 
213718c8510SRobert Watson #define	UPATH2_TOKENS do {						\
214718c8510SRobert Watson 	if (ARG_IS_VALID(kar, ARG_UPATH2)) {				\
215718c8510SRobert Watson 		tok = au_to_path(ar->ar_arg_upath2);			\
216718c8510SRobert Watson 		kau_write(rec, tok);					\
217718c8510SRobert Watson 	}								\
218718c8510SRobert Watson } while (0)
219718c8510SRobert Watson 
220718c8510SRobert Watson #define	VNODE1_TOKENS do {						\
221e4b4bbb6SRobert Watson 	if (ARG_IS_VALID(kar, ARG_ATFD)) {				\
222e4b4bbb6SRobert Watson 		tok = au_to_arg32(1, "at fd", ar->ar_arg_atfd);		\
223e4b4bbb6SRobert Watson 		kau_write(rec, tok);					\
224e4b4bbb6SRobert Watson 	}								\
225718c8510SRobert Watson 	if (ARG_IS_VALID(kar, ARG_VNODE1)) {				\
226718c8510SRobert Watson 		tok = au_to_attr32(&ar->ar_arg_vnode1);			\
227718c8510SRobert Watson 		kau_write(rec, tok);					\
228718c8510SRobert Watson 	}								\
229718c8510SRobert Watson } while (0)
230718c8510SRobert Watson 
231718c8510SRobert Watson #define	UPATH1_VNODE1_TOKENS do {					\
232718c8510SRobert Watson 	UPATH1_TOKENS;							\
233718c8510SRobert Watson 	if (ARG_IS_VALID(kar, ARG_VNODE1)) {				\
234718c8510SRobert Watson 		tok = au_to_attr32(&ar->ar_arg_vnode1);			\
235718c8510SRobert Watson 		kau_write(rec, tok);					\
236718c8510SRobert Watson 	}								\
237718c8510SRobert Watson } while (0)
238718c8510SRobert Watson 
239718c8510SRobert Watson #define	VNODE2_TOKENS do {						\
240718c8510SRobert Watson 	if (ARG_IS_VALID(kar, ARG_VNODE2)) {				\
241718c8510SRobert Watson 		tok = au_to_attr32(&ar->ar_arg_vnode2);			\
242718c8510SRobert Watson 		kau_write(rec, tok);					\
243718c8510SRobert Watson 	}								\
244718c8510SRobert Watson } while (0)
245718c8510SRobert Watson 
246718c8510SRobert Watson #define	FD_VNODE1_TOKENS do {						\
247718c8510SRobert Watson 	if (ARG_IS_VALID(kar, ARG_VNODE1)) {				\
248718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FD)) {			\
249718c8510SRobert Watson 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);	\
250718c8510SRobert Watson 			kau_write(rec, tok);				\
251718c8510SRobert Watson 		}							\
252718c8510SRobert Watson 		tok = au_to_attr32(&ar->ar_arg_vnode1);			\
253718c8510SRobert Watson 		kau_write(rec, tok);					\
254718c8510SRobert Watson 	} else {							\
255718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FD)) {			\
256871499feSRobert Watson 			tok = au_to_arg32(1, "non-file: fd",		\
257871499feSRobert Watson 			    ar->ar_arg_fd);				\
258718c8510SRobert Watson 			kau_write(rec, tok);				\
259718c8510SRobert Watson 		}							\
260718c8510SRobert Watson 	}								\
261718c8510SRobert Watson } while (0)
262718c8510SRobert Watson 
263718c8510SRobert Watson #define	PROCESS_PID_TOKENS(argn) do {					\
2645619113cSRobert Watson 	if ((ar->ar_arg_pid > 0) /* Reference a single process */	\
265718c8510SRobert Watson 	    && (ARG_IS_VALID(kar, ARG_PROCESS))) {			\
266088b56a8SChristian S.J. Peron 		tok = au_to_process32_ex(ar->ar_arg_auid,		\
267718c8510SRobert Watson 		    ar->ar_arg_euid, ar->ar_arg_egid,			\
268718c8510SRobert Watson 		    ar->ar_arg_ruid, ar->ar_arg_rgid,			\
269718c8510SRobert Watson 		    ar->ar_arg_pid, ar->ar_arg_asid,			\
270088b56a8SChristian S.J. Peron 		    &ar->ar_arg_termid_addr);				\
271718c8510SRobert Watson 		kau_write(rec, tok);					\
2725619113cSRobert Watson 	} else if (ARG_IS_VALID(kar, ARG_PID)) {			\
2735619113cSRobert Watson 		tok = au_to_arg32(argn, "process", ar->ar_arg_pid);	\
274718c8510SRobert Watson 		kau_write(rec, tok);					\
275718c8510SRobert Watson 	}								\
2761814e5b7SRobert Watson } while (0)
277718c8510SRobert Watson 
2782a565838SRobert Watson #define	EXTATTR_TOKENS(namespace_argnum) do {				\
27965ee602eSWayne Salamon 	if (ARG_IS_VALID(kar, ARG_VALUE)) {				\
28065ee602eSWayne Salamon 		switch (ar->ar_arg_value) {				\
28165ee602eSWayne Salamon 		case EXTATTR_NAMESPACE_USER:				\
28265ee602eSWayne Salamon 			tok = au_to_text(EXTATTR_NAMESPACE_USER_STRING);\
28365ee602eSWayne Salamon 			break;						\
28465ee602eSWayne Salamon 		case EXTATTR_NAMESPACE_SYSTEM:				\
28565ee602eSWayne Salamon 			tok = au_to_text(EXTATTR_NAMESPACE_SYSTEM_STRING);\
28665ee602eSWayne Salamon 			break;						\
28765ee602eSWayne Salamon 		default:						\
2882a565838SRobert Watson 			tok = au_to_arg32((namespace_argnum),		\
2892a565838SRobert Watson 			    "attrnamespace", ar->ar_arg_value);		\
29065ee602eSWayne Salamon 			break;						\
29165ee602eSWayne Salamon 		}							\
29265ee602eSWayne Salamon 		kau_write(rec, tok);					\
29365ee602eSWayne Salamon 	}								\
29465ee602eSWayne Salamon 	/* attrname is in the text field */				\
29565ee602eSWayne Salamon 	if (ARG_IS_VALID(kar, ARG_TEXT)) {				\
29665ee602eSWayne Salamon 		tok = au_to_text(ar->ar_arg_text);			\
29765ee602eSWayne Salamon 		kau_write(rec, tok);					\
29865ee602eSWayne Salamon 	}								\
29965ee602eSWayne Salamon } while (0)
30065ee602eSWayne Salamon 
301718c8510SRobert Watson /*
3022a565838SRobert Watson  * Not all pointer arguments to system calls are of interest, but in some
303deedc899SRobert Watson  * cases they reflect delegation of rights, such as mmap(2) followed by
3042a565838SRobert Watson  * minherit(2) before execve(2), so do the best we can.
3052a565838SRobert Watson  */
3062a565838SRobert Watson #define	ADDR_TOKEN(argnum, argname) do {				\
3072a565838SRobert Watson 	if (ARG_IS_VALID(kar, ARG_ADDR)) {				\
3082a565838SRobert Watson 		if (sizeof(void *) == sizeof(uint32_t))			\
3092a565838SRobert Watson 			tok = au_to_arg32((argnum), (argname),		\
3102a565838SRobert Watson 			    (uint32_t)(uintptr_t)ar->ar_arg_addr);	\
3112a565838SRobert Watson 		else							\
3122a565838SRobert Watson 			tok = au_to_arg64((argnum), (argname),		\
3132a565838SRobert Watson 			    (uint64_t)(uintptr_t)ar->ar_arg_addr);	\
3142a565838SRobert Watson 		kau_write(rec, tok);					\
3152a565838SRobert Watson 	}								\
3162a565838SRobert Watson } while (0)
3172a565838SRobert Watson 
3182a565838SRobert Watson /*
319718c8510SRobert Watson  * Implement auditing for the auditon() system call. The audit tokens that
320718c8510SRobert Watson  * are generated depend on the command that was sent into the auditon()
321718c8510SRobert Watson  * system call.
322718c8510SRobert Watson  */
323718c8510SRobert Watson static void
audit_sys_auditon(struct audit_record * ar,struct au_record * rec)324718c8510SRobert Watson audit_sys_auditon(struct audit_record *ar, struct au_record *rec)
325718c8510SRobert Watson {
326718c8510SRobert Watson 	struct au_token *tok;
327718c8510SRobert Watson 
3282a565838SRobert Watson 	tok = au_to_arg32(3, "length", ar->ar_arg_len);
3292a565838SRobert Watson 	kau_write(rec, tok);
330718c8510SRobert Watson 	switch (ar->ar_arg_cmd) {
3314df4e335SRobert Watson 	case A_OLDSETPOLICY:
3324df4e335SRobert Watson 		if ((size_t)ar->ar_arg_len == sizeof(int64_t)) {
3334df4e335SRobert Watson 			tok = au_to_arg64(2, "policy",
3344df4e335SRobert Watson 			    ar->ar_arg_auditon.au_policy64);
3354df4e335SRobert Watson 			kau_write(rec, tok);
3364df4e335SRobert Watson 			break;
3374df4e335SRobert Watson 		}
3384df4e335SRobert Watson 		/* FALLTHROUGH */
3392a565838SRobert Watson 
340718c8510SRobert Watson 	case A_SETPOLICY:
3412a565838SRobert Watson 		tok = au_to_arg32(2, "policy", ar->ar_arg_auditon.au_policy);
342718c8510SRobert Watson 		kau_write(rec, tok);
343718c8510SRobert Watson 		break;
344718c8510SRobert Watson 
345718c8510SRobert Watson 	case A_SETKMASK:
346718c8510SRobert Watson 		tok = au_to_arg32(2, "setkmask:as_success",
347718c8510SRobert Watson 		    ar->ar_arg_auditon.au_mask.am_success);
348718c8510SRobert Watson 		kau_write(rec, tok);
349718c8510SRobert Watson 		tok = au_to_arg32(2, "setkmask:as_failure",
350718c8510SRobert Watson 		    ar->ar_arg_auditon.au_mask.am_failure);
351718c8510SRobert Watson 		kau_write(rec, tok);
352718c8510SRobert Watson 		break;
353718c8510SRobert Watson 
3544df4e335SRobert Watson 	case A_OLDSETQCTRL:
3554df4e335SRobert Watson 		if ((size_t)ar->ar_arg_len == sizeof(au_qctrl64_t)) {
3564df4e335SRobert Watson 			tok = au_to_arg64(2, "setqctrl:aq_hiwater",
3574df4e335SRobert Watson 			    ar->ar_arg_auditon.au_qctrl64.aq64_hiwater);
3584df4e335SRobert Watson 			kau_write(rec, tok);
3594df4e335SRobert Watson 			tok = au_to_arg64(2, "setqctrl:aq_lowater",
3604df4e335SRobert Watson 			    ar->ar_arg_auditon.au_qctrl64.aq64_lowater);
3614df4e335SRobert Watson 			kau_write(rec, tok);
3624df4e335SRobert Watson 			tok = au_to_arg64(2, "setqctrl:aq_bufsz",
3634df4e335SRobert Watson 			    ar->ar_arg_auditon.au_qctrl64.aq64_bufsz);
3644df4e335SRobert Watson 			kau_write(rec, tok);
3654df4e335SRobert Watson 			tok = au_to_arg64(2, "setqctrl:aq_delay",
3664df4e335SRobert Watson 			    ar->ar_arg_auditon.au_qctrl64.aq64_delay);
3674df4e335SRobert Watson 			kau_write(rec, tok);
3684df4e335SRobert Watson 			tok = au_to_arg64(2, "setqctrl:aq_minfree",
3694df4e335SRobert Watson 			    ar->ar_arg_auditon.au_qctrl64.aq64_minfree);
3704df4e335SRobert Watson 			kau_write(rec, tok);
3714df4e335SRobert Watson 			break;
3724df4e335SRobert Watson 		}
3734df4e335SRobert Watson 		/* FALLTHROUGH */
3742a565838SRobert Watson 
375718c8510SRobert Watson 	case A_SETQCTRL:
3762a565838SRobert Watson 		tok = au_to_arg32(2, "setqctrl:aq_hiwater",
377718c8510SRobert Watson 		    ar->ar_arg_auditon.au_qctrl.aq_hiwater);
378718c8510SRobert Watson 		kau_write(rec, tok);
3794df4e335SRobert Watson 		tok = au_to_arg32(2, "setqctrl:aq_lowater",
380718c8510SRobert Watson 		    ar->ar_arg_auditon.au_qctrl.aq_lowater);
381718c8510SRobert Watson 		kau_write(rec, tok);
3824df4e335SRobert Watson 		tok = au_to_arg32(2, "setqctrl:aq_bufsz",
383718c8510SRobert Watson 		    ar->ar_arg_auditon.au_qctrl.aq_bufsz);
384718c8510SRobert Watson 		kau_write(rec, tok);
3854df4e335SRobert Watson 		tok = au_to_arg32(2, "setqctrl:aq_delay",
386718c8510SRobert Watson 		    ar->ar_arg_auditon.au_qctrl.aq_delay);
387718c8510SRobert Watson 		kau_write(rec, tok);
3884df4e335SRobert Watson 		tok = au_to_arg32(2, "setqctrl:aq_minfree",
389718c8510SRobert Watson 		    ar->ar_arg_auditon.au_qctrl.aq_minfree);
390718c8510SRobert Watson 		kau_write(rec, tok);
391718c8510SRobert Watson 		break;
392718c8510SRobert Watson 
393718c8510SRobert Watson 	case A_SETUMASK:
3942a565838SRobert Watson 		tok = au_to_arg32(2, "setumask:as_success",
395718c8510SRobert Watson 		    ar->ar_arg_auditon.au_auinfo.ai_mask.am_success);
396718c8510SRobert Watson 		kau_write(rec, tok);
3972a565838SRobert Watson 		tok = au_to_arg32(2, "setumask:as_failure",
398718c8510SRobert Watson 		    ar->ar_arg_auditon.au_auinfo.ai_mask.am_failure);
399718c8510SRobert Watson 		kau_write(rec, tok);
400718c8510SRobert Watson 		break;
401718c8510SRobert Watson 
402718c8510SRobert Watson 	case A_SETSMASK:
4034df4e335SRobert Watson 		tok = au_to_arg32(2, "setsmask:as_success",
404718c8510SRobert Watson 		    ar->ar_arg_auditon.au_auinfo.ai_mask.am_success);
405718c8510SRobert Watson 		kau_write(rec, tok);
4064df4e335SRobert Watson 		tok = au_to_arg32(2, "setsmask:as_failure",
407718c8510SRobert Watson 		    ar->ar_arg_auditon.au_auinfo.ai_mask.am_failure);
408718c8510SRobert Watson 		kau_write(rec, tok);
409718c8510SRobert Watson 		break;
410718c8510SRobert Watson 
4114df4e335SRobert Watson 	case A_OLDSETCOND:
4124df4e335SRobert Watson 		if ((size_t)ar->ar_arg_len == sizeof(int64_t)) {
4134df4e335SRobert Watson 			tok = au_to_arg64(2, "setcond",
4144df4e335SRobert Watson 			    ar->ar_arg_auditon.au_cond64);
4154df4e335SRobert Watson 			kau_write(rec, tok);
4164df4e335SRobert Watson 			break;
4174df4e335SRobert Watson 		}
4184df4e335SRobert Watson 		/* FALLTHROUGH */
4192a565838SRobert Watson 
420718c8510SRobert Watson 	case A_SETCOND:
4212a565838SRobert Watson 		tok = au_to_arg32(2, "setcond", ar->ar_arg_auditon.au_cond);
422718c8510SRobert Watson 		kau_write(rec, tok);
423718c8510SRobert Watson 		break;
424718c8510SRobert Watson 
425718c8510SRobert Watson 	case A_SETCLASS:
426718c8510SRobert Watson 		tok = au_to_arg32(2, "setclass:ec_event",
427718c8510SRobert Watson 		    ar->ar_arg_auditon.au_evclass.ec_number);
428718c8510SRobert Watson 		kau_write(rec, tok);
4294df4e335SRobert Watson 		tok = au_to_arg32(2, "setclass:ec_class",
430718c8510SRobert Watson 		    ar->ar_arg_auditon.au_evclass.ec_class);
431718c8510SRobert Watson 		kau_write(rec, tok);
432718c8510SRobert Watson 		break;
433718c8510SRobert Watson 
434718c8510SRobert Watson 	case A_SETPMASK:
435718c8510SRobert Watson 		tok = au_to_arg32(2, "setpmask:as_success",
436718c8510SRobert Watson 		    ar->ar_arg_auditon.au_aupinfo.ap_mask.am_success);
437718c8510SRobert Watson 		kau_write(rec, tok);
438718c8510SRobert Watson 		tok = au_to_arg32(2, "setpmask:as_failure",
439718c8510SRobert Watson 		    ar->ar_arg_auditon.au_aupinfo.ap_mask.am_failure);
440718c8510SRobert Watson 		kau_write(rec, tok);
441718c8510SRobert Watson 		break;
442718c8510SRobert Watson 
443718c8510SRobert Watson 	case A_SETFSIZE:
444718c8510SRobert Watson 		tok = au_to_arg32(2, "setfsize:filesize",
445718c8510SRobert Watson 		    ar->ar_arg_auditon.au_fstat.af_filesz);
446718c8510SRobert Watson 		kau_write(rec, tok);
447718c8510SRobert Watson 		break;
448718c8510SRobert Watson 
449718c8510SRobert Watson 	default:
450718c8510SRobert Watson 		break;
451718c8510SRobert Watson 	}
452718c8510SRobert Watson }
453718c8510SRobert Watson 
454718c8510SRobert Watson /*
455871499feSRobert Watson  * Convert an internal kernel audit record to a BSM record and return a
456871499feSRobert Watson  * success/failure indicator. The BSM record is passed as an out parameter to
457871499feSRobert Watson  * this function.
458871499feSRobert Watson  *
459718c8510SRobert Watson  * Return conditions:
460718c8510SRobert Watson  *   BSM_SUCCESS: The BSM record is valid
461718c8510SRobert Watson  *   BSM_FAILURE: Failure; the BSM record is NULL.
462718c8510SRobert Watson  *   BSM_NOAUDIT: The event is not auditable for BSM; the BSM record is NULL.
463718c8510SRobert Watson  */
464718c8510SRobert Watson int
kaudit_to_bsm(struct kaudit_record * kar,struct au_record ** pau)465718c8510SRobert Watson kaudit_to_bsm(struct kaudit_record *kar, struct au_record **pau)
466718c8510SRobert Watson {
46714bc5135SChristian S.J. Peron 	struct au_token *tok, *subj_tok, *jail_tok;
468718c8510SRobert Watson 	struct au_record *rec;
469718c8510SRobert Watson 	au_tid_t tid;
470718c8510SRobert Watson 	struct audit_record *ar;
471718c8510SRobert Watson 	int ctr;
472718c8510SRobert Watson 
473718c8510SRobert Watson 	KASSERT(kar != NULL, ("kaudit_to_bsm: kar == NULL"));
474718c8510SRobert Watson 
475718c8510SRobert Watson 	*pau = NULL;
476718c8510SRobert Watson 	ar = &kar->k_ar;
477718c8510SRobert Watson 	rec = kau_open();
478718c8510SRobert Watson 
47930d0721bSRobert Watson 	/*
48014bc5135SChristian S.J. Peron 	 * Create the subject token.  If this credential was jailed be sure to
48114bc5135SChristian S.J. Peron 	 * generate a zonename token.
48230d0721bSRobert Watson 	 */
48314bc5135SChristian S.J. Peron 	if (ar->ar_jailname[0] != '\0')
48414bc5135SChristian S.J. Peron 		jail_tok = au_to_zonename(ar->ar_jailname);
48514bc5135SChristian S.J. Peron 	else
48614bc5135SChristian S.J. Peron 		jail_tok = NULL;
487f0cbfcc4SChristian S.J. Peron 	switch (ar->ar_subj_term_addr.at_type) {
488f0cbfcc4SChristian S.J. Peron 	case AU_IPv4:
489f0cbfcc4SChristian S.J. Peron 		tid.port = ar->ar_subj_term_addr.at_port;
490f0cbfcc4SChristian S.J. Peron 		tid.machine = ar->ar_subj_term_addr.at_addr[0];
491718c8510SRobert Watson 		subj_tok = au_to_subject32(ar->ar_subj_auid,  /* audit ID */
492718c8510SRobert Watson 		    ar->ar_subj_cred.cr_uid, /* eff uid */
493718c8510SRobert Watson 		    ar->ar_subj_egid,	/* eff group id */
494718c8510SRobert Watson 		    ar->ar_subj_ruid,	/* real uid */
495718c8510SRobert Watson 		    ar->ar_subj_rgid,	/* real group id */
496718c8510SRobert Watson 		    ar->ar_subj_pid,	/* process id */
497718c8510SRobert Watson 		    ar->ar_subj_asid,	/* session ID */
498718c8510SRobert Watson 		    &tid);
499f0cbfcc4SChristian S.J. Peron 		break;
500f0cbfcc4SChristian S.J. Peron 	case AU_IPv6:
501f0cbfcc4SChristian S.J. Peron 		subj_tok = au_to_subject32_ex(ar->ar_subj_auid,
502f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_cred.cr_uid,
503f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_egid,
504f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_ruid,
505f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_rgid,
506f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_pid,
507f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_asid,
508f0cbfcc4SChristian S.J. Peron 		    &ar->ar_subj_term_addr);
509f0cbfcc4SChristian S.J. Peron 		break;
510f0cbfcc4SChristian S.J. Peron 	default:
511f0cbfcc4SChristian S.J. Peron 		bzero(&tid, sizeof(tid));
512f0cbfcc4SChristian S.J. Peron 		subj_tok = au_to_subject32(ar->ar_subj_auid,
513f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_cred.cr_uid,
514f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_egid,
515f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_ruid,
516f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_rgid,
517f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_pid,
518f0cbfcc4SChristian S.J. Peron 		    ar->ar_subj_asid,
519f0cbfcc4SChristian S.J. Peron 		    &tid);
520f0cbfcc4SChristian S.J. Peron 	}
521718c8510SRobert Watson 
522871499feSRobert Watson 	/*
523871499feSRobert Watson 	 * The logic inside each case fills in the tokens required for the
524718c8510SRobert Watson 	 * event, except for the header, trailer, and return tokens.  The
525718c8510SRobert Watson 	 * header and trailer tokens are added by the kau_close() function.
526718c8510SRobert Watson 	 * The return token is added outside of the switch statement.
527718c8510SRobert Watson 	 */
528718c8510SRobert Watson 	switch(ar->ar_event) {
529718c8510SRobert Watson 	case AUE_ACCEPT:
530b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FD)) {
531b65ec5e5SRobert Watson 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
532b65ec5e5SRobert Watson 			kau_write(rec, tok);
533b65ec5e5SRobert Watson 		}
534b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SADDRINET)) {
535b65ec5e5SRobert Watson 			tok = au_to_sock_inet((struct sockaddr_in *)
536b65ec5e5SRobert Watson 			    &ar->ar_arg_sockaddr);
537b65ec5e5SRobert Watson 			kau_write(rec, tok);
538b65ec5e5SRobert Watson 		}
539b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SADDRUNIX)) {
540b65ec5e5SRobert Watson 			tok = au_to_sock_unix((struct sockaddr_un *)
541b65ec5e5SRobert Watson 			    &ar->ar_arg_sockaddr);
542b65ec5e5SRobert Watson 			kau_write(rec, tok);
543b65ec5e5SRobert Watson 			UPATH1_TOKENS;
544b65ec5e5SRobert Watson 		}
545b65ec5e5SRobert Watson 		break;
546b65ec5e5SRobert Watson 
547718c8510SRobert Watson 	case AUE_BIND:
548cd109a68SChristian S.J. Peron 	case AUE_LISTEN:
549718c8510SRobert Watson 	case AUE_CONNECT:
55042edcb00SRobert Watson 	case AUE_RECV:
551718c8510SRobert Watson 	case AUE_RECVFROM:
552718c8510SRobert Watson 	case AUE_RECVMSG:
55342edcb00SRobert Watson 	case AUE_SEND:
554718c8510SRobert Watson 	case AUE_SENDMSG:
555718c8510SRobert Watson 	case AUE_SENDTO:
556871499feSRobert Watson 		/*
557871499feSRobert Watson 		 * Socket-related events.
558871499feSRobert Watson 		 */
559718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FD)) {
560718c8510SRobert Watson 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
561718c8510SRobert Watson 			kau_write(rec, tok);
562718c8510SRobert Watson 		}
563718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SADDRINET)) {
564871499feSRobert Watson 			tok = au_to_sock_inet((struct sockaddr_in *)
565871499feSRobert Watson 			    &ar->ar_arg_sockaddr);
566718c8510SRobert Watson 			kau_write(rec, tok);
567718c8510SRobert Watson 		}
568718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SADDRUNIX)) {
569871499feSRobert Watson 			tok = au_to_sock_unix((struct sockaddr_un *)
570871499feSRobert Watson 			    &ar->ar_arg_sockaddr);
571718c8510SRobert Watson 			kau_write(rec, tok);
572718c8510SRobert Watson 			UPATH1_TOKENS;
573718c8510SRobert Watson 		}
574718c8510SRobert Watson 		/* XXX Need to handle ARG_SADDRINET6 */
575718c8510SRobert Watson 		break;
576718c8510SRobert Watson 
5777493f24eSPawel Jakub Dawidek 	case AUE_BINDAT:
5787493f24eSPawel Jakub Dawidek 	case AUE_CONNECTAT:
5797493f24eSPawel Jakub Dawidek 		ATFD1_TOKENS(1);
5807493f24eSPawel Jakub Dawidek 		if (ARG_IS_VALID(kar, ARG_FD)) {
5817493f24eSPawel Jakub Dawidek 			tok = au_to_arg32(2, "fd", ar->ar_arg_fd);
5827493f24eSPawel Jakub Dawidek 			kau_write(rec, tok);
5837493f24eSPawel Jakub Dawidek 		}
5847493f24eSPawel Jakub Dawidek 		if (ARG_IS_VALID(kar, ARG_SADDRUNIX)) {
5857493f24eSPawel Jakub Dawidek 			tok = au_to_sock_unix((struct sockaddr_un *)
5867493f24eSPawel Jakub Dawidek 			    &ar->ar_arg_sockaddr);
5877493f24eSPawel Jakub Dawidek 			kau_write(rec, tok);
5887493f24eSPawel Jakub Dawidek 			UPATH1_TOKENS;
5897493f24eSPawel Jakub Dawidek 		}
5907493f24eSPawel Jakub Dawidek 		break;
5917493f24eSPawel Jakub Dawidek 
592b65ec5e5SRobert Watson 	case AUE_SENDFILE:
593b65ec5e5SRobert Watson 		FD_VNODE1_TOKENS;
594b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SADDRINET)) {
595b65ec5e5SRobert Watson 			tok = au_to_sock_inet((struct sockaddr_in *)
596b65ec5e5SRobert Watson 			    &ar->ar_arg_sockaddr);
597b65ec5e5SRobert Watson 			kau_write(rec, tok);
598b65ec5e5SRobert Watson 		}
599b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SADDRUNIX)) {
600b65ec5e5SRobert Watson 			tok = au_to_sock_unix((struct sockaddr_un *)
601b65ec5e5SRobert Watson 			    &ar->ar_arg_sockaddr);
602b65ec5e5SRobert Watson 			kau_write(rec, tok);
603b65ec5e5SRobert Watson 			UPATH1_TOKENS;
604b65ec5e5SRobert Watson 		}
605b65ec5e5SRobert Watson 		/* XXX Need to handle ARG_SADDRINET6 */
606b65ec5e5SRobert Watson 		break;
607b65ec5e5SRobert Watson 
608718c8510SRobert Watson 	case AUE_SOCKET:
609718c8510SRobert Watson 	case AUE_SOCKETPAIR:
610718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SOCKINFO)) {
611718c8510SRobert Watson 			tok = au_to_arg32(1, "domain",
612718c8510SRobert Watson 			    ar->ar_arg_sockinfo.so_domain);
613718c8510SRobert Watson 			kau_write(rec, tok);
614718c8510SRobert Watson 			tok = au_to_arg32(2, "type",
615718c8510SRobert Watson 			    ar->ar_arg_sockinfo.so_type);
616718c8510SRobert Watson 			kau_write(rec, tok);
617718c8510SRobert Watson 			tok = au_to_arg32(3, "protocol",
618718c8510SRobert Watson 			    ar->ar_arg_sockinfo.so_protocol);
619718c8510SRobert Watson 			kau_write(rec, tok);
620718c8510SRobert Watson 		}
621718c8510SRobert Watson 		break;
622718c8510SRobert Watson 
623718c8510SRobert Watson 	case AUE_SETSOCKOPT:
624718c8510SRobert Watson 	case AUE_SHUTDOWN:
625718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FD)) {
626718c8510SRobert Watson 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
627718c8510SRobert Watson 			kau_write(rec, tok);
628718c8510SRobert Watson 		}
629718c8510SRobert Watson 		break;
630718c8510SRobert Watson 
631718c8510SRobert Watson 	case AUE_ACCT:
632718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_UPATH1)) {
633718c8510SRobert Watson 			UPATH1_VNODE1_TOKENS;
634718c8510SRobert Watson 		} else {
635718c8510SRobert Watson 			tok = au_to_arg32(1, "accounting off", 0);
636718c8510SRobert Watson 			kau_write(rec, tok);
637718c8510SRobert Watson 		}
638718c8510SRobert Watson 		break;
639718c8510SRobert Watson 
640718c8510SRobert Watson 	case AUE_SETAUID:
641718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_AUID)) {
642718c8510SRobert Watson 			tok = au_to_arg32(2, "setauid", ar->ar_arg_auid);
643718c8510SRobert Watson 			kau_write(rec, tok);
644718c8510SRobert Watson 		}
645718c8510SRobert Watson 		break;
646718c8510SRobert Watson 
647718c8510SRobert Watson 	case AUE_SETAUDIT:
648cac465aaSChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_AUID) &&
649cac465aaSChristian S.J. Peron 		    ARG_IS_VALID(kar, ARG_ASID) &&
650cac465aaSChristian S.J. Peron 		    ARG_IS_VALID(kar, ARG_AMASK) &&
651cac465aaSChristian S.J. Peron 		    ARG_IS_VALID(kar, ARG_TERMID)) {
652871499feSRobert Watson 			tok = au_to_arg32(1, "setaudit:auid",
653871499feSRobert Watson 			    ar->ar_arg_auid);
654718c8510SRobert Watson 			kau_write(rec, tok);
655718c8510SRobert Watson 			tok = au_to_arg32(1, "setaudit:port",
656718c8510SRobert Watson 			    ar->ar_arg_termid.port);
657718c8510SRobert Watson 			kau_write(rec, tok);
658718c8510SRobert Watson 			tok = au_to_arg32(1, "setaudit:machine",
659718c8510SRobert Watson 			    ar->ar_arg_termid.machine);
660718c8510SRobert Watson 			kau_write(rec, tok);
661718c8510SRobert Watson 			tok = au_to_arg32(1, "setaudit:as_success",
662718c8510SRobert Watson 			    ar->ar_arg_amask.am_success);
663718c8510SRobert Watson 			kau_write(rec, tok);
664718c8510SRobert Watson 			tok = au_to_arg32(1, "setaudit:as_failure",
665718c8510SRobert Watson 			    ar->ar_arg_amask.am_failure);
666718c8510SRobert Watson 			kau_write(rec, tok);
667871499feSRobert Watson 			tok = au_to_arg32(1, "setaudit:asid",
668871499feSRobert Watson 			    ar->ar_arg_asid);
669718c8510SRobert Watson 			kau_write(rec, tok);
670718c8510SRobert Watson 		}
671718c8510SRobert Watson 		break;
672718c8510SRobert Watson 
673718c8510SRobert Watson 	case AUE_SETAUDIT_ADDR:
674cac465aaSChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_AUID) &&
675cac465aaSChristian S.J. Peron 		    ARG_IS_VALID(kar, ARG_ASID) &&
676cac465aaSChristian S.J. Peron 		    ARG_IS_VALID(kar, ARG_AMASK) &&
677cac465aaSChristian S.J. Peron 		    ARG_IS_VALID(kar, ARG_TERMID_ADDR)) {
678cac465aaSChristian S.J. Peron 			tok = au_to_arg32(1, "setaudit_addr:auid",
679cac465aaSChristian S.J. Peron 			    ar->ar_arg_auid);
680cac465aaSChristian S.J. Peron 			kau_write(rec, tok);
681cac465aaSChristian S.J. Peron 			tok = au_to_arg32(1, "setaudit_addr:as_success",
682cac465aaSChristian S.J. Peron 			    ar->ar_arg_amask.am_success);
683cac465aaSChristian S.J. Peron 			kau_write(rec, tok);
684cac465aaSChristian S.J. Peron 			tok = au_to_arg32(1, "setaudit_addr:as_failure",
685cac465aaSChristian S.J. Peron 			    ar->ar_arg_amask.am_failure);
686cac465aaSChristian S.J. Peron 			kau_write(rec, tok);
687cac465aaSChristian S.J. Peron 			tok = au_to_arg32(1, "setaudit_addr:asid",
688cac465aaSChristian S.J. Peron 			    ar->ar_arg_asid);
689cac465aaSChristian S.J. Peron 			kau_write(rec, tok);
690cac465aaSChristian S.J. Peron 			tok = au_to_arg32(1, "setaudit_addr:type",
691cac465aaSChristian S.J. Peron 			    ar->ar_arg_termid_addr.at_type);
692cac465aaSChristian S.J. Peron 			kau_write(rec, tok);
693cac465aaSChristian S.J. Peron 			tok = au_to_arg32(1, "setaudit_addr:port",
694cac465aaSChristian S.J. Peron 			    ar->ar_arg_termid_addr.at_port);
695cac465aaSChristian S.J. Peron 			kau_write(rec, tok);
696cac465aaSChristian S.J. Peron 			if (ar->ar_arg_termid_addr.at_type == AU_IPv6)
697cac465aaSChristian S.J. Peron 				tok = au_to_in_addr_ex((struct in6_addr *)
698cac465aaSChristian S.J. Peron 				    &ar->ar_arg_termid_addr.at_addr[0]);
699cac465aaSChristian S.J. Peron 			if (ar->ar_arg_termid_addr.at_type == AU_IPv4)
700cac465aaSChristian S.J. Peron 				tok = au_to_in_addr((struct in_addr *)
701cac465aaSChristian S.J. Peron 				    &ar->ar_arg_termid_addr.at_addr[0]);
702cac465aaSChristian S.J. Peron 			kau_write(rec, tok);
703cac465aaSChristian S.J. Peron 		}
704cac465aaSChristian S.J. Peron 		break;
705718c8510SRobert Watson 
706718c8510SRobert Watson 	case AUE_AUDITON:
707871499feSRobert Watson 		/*
708871499feSRobert Watson 		 * For AUDITON commands without own event, audit the cmd.
709871499feSRobert Watson 		 */
710718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
711718c8510SRobert Watson 			tok = au_to_arg32(1, "cmd", ar->ar_arg_cmd);
712718c8510SRobert Watson 			kau_write(rec, tok);
713718c8510SRobert Watson 		}
714a760c0b2SRobert Watson 		/* FALLTHROUGH */
715718c8510SRobert Watson 
716718c8510SRobert Watson 	case AUE_AUDITON_GETCAR:
717718c8510SRobert Watson 	case AUE_AUDITON_GETCLASS:
718718c8510SRobert Watson 	case AUE_AUDITON_GETCOND:
719718c8510SRobert Watson 	case AUE_AUDITON_GETCWD:
720718c8510SRobert Watson 	case AUE_AUDITON_GETKMASK:
721718c8510SRobert Watson 	case AUE_AUDITON_GETSTAT:
722718c8510SRobert Watson 	case AUE_AUDITON_GPOLICY:
723718c8510SRobert Watson 	case AUE_AUDITON_GQCTRL:
724718c8510SRobert Watson 	case AUE_AUDITON_SETCLASS:
725718c8510SRobert Watson 	case AUE_AUDITON_SETCOND:
726718c8510SRobert Watson 	case AUE_AUDITON_SETKMASK:
727718c8510SRobert Watson 	case AUE_AUDITON_SETSMASK:
728718c8510SRobert Watson 	case AUE_AUDITON_SETSTAT:
729718c8510SRobert Watson 	case AUE_AUDITON_SETUMASK:
730718c8510SRobert Watson 	case AUE_AUDITON_SPOLICY:
731718c8510SRobert Watson 	case AUE_AUDITON_SQCTRL:
732871499feSRobert Watson 		if (ARG_IS_VALID(kar, ARG_AUDITON))
733718c8510SRobert Watson 			audit_sys_auditon(ar, rec);
734718c8510SRobert Watson 		break;
735718c8510SRobert Watson 
736718c8510SRobert Watson 	case AUE_AUDITCTL:
737718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
738718c8510SRobert Watson 		break;
739718c8510SRobert Watson 
740718c8510SRobert Watson 	case AUE_EXIT:
741718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_EXIT)) {
742718c8510SRobert Watson 			tok = au_to_exit(ar->ar_arg_exitretval,
743718c8510SRobert Watson 			    ar->ar_arg_exitstatus);
744718c8510SRobert Watson 			kau_write(rec, tok);
745718c8510SRobert Watson 		}
746718c8510SRobert Watson 		break;
747718c8510SRobert Watson 
748718c8510SRobert Watson 	case AUE_ADJTIME:
74942edcb00SRobert Watson 	case AUE_CLOCK_SETTIME:
750718c8510SRobert Watson 	case AUE_AUDIT:
75142edcb00SRobert Watson 	case AUE_DUP2:
752718c8510SRobert Watson 	case AUE_GETAUDIT:
753718c8510SRobert Watson 	case AUE_GETAUDIT_ADDR:
754718c8510SRobert Watson 	case AUE_GETAUID:
75542edcb00SRobert Watson 	case AUE_GETCWD:
756718c8510SRobert Watson 	case AUE_GETFSSTAT:
75742edcb00SRobert Watson 	case AUE_GETRESUID:
75842edcb00SRobert Watson 	case AUE_GETRESGID:
75942edcb00SRobert Watson 	case AUE_KQUEUE:
76042edcb00SRobert Watson 	case AUE_MODLOAD:
76142edcb00SRobert Watson 	case AUE_MODUNLOAD:
76242edcb00SRobert Watson 	case AUE_MSGSYS:
76342edcb00SRobert Watson 	case AUE_NTP_ADJTIME:
764718c8510SRobert Watson 	case AUE_PIPE:
7656196f898SRobert Watson 	case AUE_POSIX_OPENPT:
76642edcb00SRobert Watson 	case AUE_PROFILE:
76742edcb00SRobert Watson 	case AUE_RTPRIO:
76842edcb00SRobert Watson 	case AUE_SEMSYS:
76912395dc9SAlan Somers 	case AUE_SETFIB:
77042edcb00SRobert Watson 	case AUE_SHMSYS:
771718c8510SRobert Watson 	case AUE_SETPGRP:
772718c8510SRobert Watson 	case AUE_SETRLIMIT:
773718c8510SRobert Watson 	case AUE_SETSID:
774718c8510SRobert Watson 	case AUE_SETTIMEOFDAY:
77542edcb00SRobert Watson 	case AUE_SYSARCH:
77642edcb00SRobert Watson 
777871499feSRobert Watson 		/*
778871499feSRobert Watson 		 * Header, subject, and return tokens added at end.
779871499feSRobert Watson 		 */
780718c8510SRobert Watson 		break;
781718c8510SRobert Watson 
782b65ec5e5SRobert Watson 	case AUE_ACL_DELETE_FD:
783b65ec5e5SRobert Watson 	case AUE_ACL_DELETE_FILE:
784b65ec5e5SRobert Watson 	case AUE_ACL_CHECK_FD:
785b65ec5e5SRobert Watson 	case AUE_ACL_CHECK_FILE:
786b65ec5e5SRobert Watson 	case AUE_ACL_CHECK_LINK:
787b65ec5e5SRobert Watson 	case AUE_ACL_DELETE_LINK:
788b65ec5e5SRobert Watson 	case AUE_ACL_GET_FD:
789b65ec5e5SRobert Watson 	case AUE_ACL_GET_FILE:
790b65ec5e5SRobert Watson 	case AUE_ACL_GET_LINK:
791b65ec5e5SRobert Watson 	case AUE_ACL_SET_FD:
792b65ec5e5SRobert Watson 	case AUE_ACL_SET_FILE:
793b65ec5e5SRobert Watson 	case AUE_ACL_SET_LINK:
794b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
795b65ec5e5SRobert Watson 			tok = au_to_arg32(1, "type", ar->ar_arg_value);
796b65ec5e5SRobert Watson 			kau_write(rec, tok);
797b65ec5e5SRobert Watson 		}
798b65ec5e5SRobert Watson 		ATFD1_TOKENS(1);
799b65ec5e5SRobert Watson 		UPATH1_VNODE1_TOKENS;
800b65ec5e5SRobert Watson 		break;
801b65ec5e5SRobert Watson 
8023580f3cfSChristian S.J. Peron 	/*
8033580f3cfSChristian S.J. Peron 	 * NB: We may want to verify that the appropriate
8043580f3cfSChristian S.J. Peron 	 * audit args are being processed here, but I think
8053580f3cfSChristian S.J. Peron 	 * a bit analysis is required.
8063580f3cfSChristian S.J. Peron 	 *
8073580f3cfSChristian S.J. Peron 	 * Process AUE_JAIL_SET in the next block so we can pickup any path
8083580f3cfSChristian S.J. Peron 	 * related tokens that might exist.
8093580f3cfSChristian S.J. Peron 	 */
8103580f3cfSChristian S.J. Peron 	case AUE_JAIL_GET:
8113580f3cfSChristian S.J. Peron 	case AUE_JAIL_ATTACH:
8123580f3cfSChristian S.J. Peron 	case AUE_JAIL_REMOVE:
8133580f3cfSChristian S.J. Peron 		break;
8143580f3cfSChristian S.J. Peron 
8153580f3cfSChristian S.J. Peron 	case AUE_JAIL_SET:
816718c8510SRobert Watson 	case AUE_CHDIR:
817718c8510SRobert Watson 	case AUE_CHROOT:
818e4b4bbb6SRobert Watson 	case AUE_FSTATAT:
819e4b4bbb6SRobert Watson 	case AUE_FUTIMESAT:
820718c8510SRobert Watson 	case AUE_GETATTRLIST:
82142edcb00SRobert Watson 	case AUE_JAIL:
822600d74bfSChristian S.J. Peron 	case AUE_LUTIMES:
823718c8510SRobert Watson 	case AUE_NFS_GETFH:
82412395dc9SAlan Somers 	case AUE_LGETFH:
825718c8510SRobert Watson 	case AUE_LSTAT:
82624ffe724SChristian S.J. Peron 	case AUE_LPATHCONF:
827718c8510SRobert Watson 	case AUE_PATHCONF:
828718c8510SRobert Watson 	case AUE_READLINK:
82980a044eaSPawel Jakub Dawidek 	case AUE_READLINKAT:
830718c8510SRobert Watson 	case AUE_REVOKE:
831718c8510SRobert Watson 	case AUE_RMDIR:
832718c8510SRobert Watson 	case AUE_SEARCHFS:
833718c8510SRobert Watson 	case AUE_SETATTRLIST:
834718c8510SRobert Watson 	case AUE_STAT:
835718c8510SRobert Watson 	case AUE_STATFS:
83642edcb00SRobert Watson 	case AUE_SWAPON:
83742edcb00SRobert Watson 	case AUE_SWAPOFF:
838718c8510SRobert Watson 	case AUE_TRUNCATE:
839718c8510SRobert Watson 	case AUE_UNDELETE:
840718c8510SRobert Watson 	case AUE_UNLINK:
841e4b4bbb6SRobert Watson 	case AUE_UNLINKAT:
842718c8510SRobert Watson 	case AUE_UTIMES:
8430573d0a9SMateusz Guzik 	case AUE_REALPATHAT:
844e4b4bbb6SRobert Watson 		ATFD1_TOKENS(1);
845718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
846718c8510SRobert Watson 		break;
847718c8510SRobert Watson 
84803f7b004SRobert Watson 	case AUE_ACCESS:
84903f7b004SRobert Watson 	case AUE_EACCESS:
85080a044eaSPawel Jakub Dawidek 	case AUE_FACCESSAT:
85180a044eaSPawel Jakub Dawidek 		ATFD1_TOKENS(1);
85203f7b004SRobert Watson 		UPATH1_VNODE1_TOKENS;
85303f7b004SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
8542a565838SRobert Watson 			tok = au_to_arg32(2, "mode", ar->ar_arg_value);
85503f7b004SRobert Watson 			kau_write(rec, tok);
85603f7b004SRobert Watson 		}
85703f7b004SRobert Watson 		break;
85803f7b004SRobert Watson 
85942edcb00SRobert Watson 	case AUE_FHSTATFS:
86042edcb00SRobert Watson 	case AUE_FHOPEN:
86142edcb00SRobert Watson 	case AUE_FHSTAT:
86242edcb00SRobert Watson 		/* XXXRW: Need to audit vnode argument. */
86342edcb00SRobert Watson 		break;
86442edcb00SRobert Watson 
865718c8510SRobert Watson 	case AUE_CHFLAGS:
866718c8510SRobert Watson 	case AUE_LCHFLAGS:
86712395dc9SAlan Somers 	case AUE_CHFLAGSAT:
868718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
869718c8510SRobert Watson 			tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
870718c8510SRobert Watson 			kau_write(rec, tok);
871718c8510SRobert Watson 		}
872718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
873718c8510SRobert Watson 		break;
874718c8510SRobert Watson 
875718c8510SRobert Watson 	case AUE_CHMOD:
876718c8510SRobert Watson 	case AUE_LCHMOD:
877718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
878871499feSRobert Watson 			tok = au_to_arg32(2, "new file mode",
879871499feSRobert Watson 			    ar->ar_arg_mode);
880718c8510SRobert Watson 			kau_write(rec, tok);
881718c8510SRobert Watson 		}
882718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
883718c8510SRobert Watson 		break;
884718c8510SRobert Watson 
885e4b4bbb6SRobert Watson 	case AUE_FCHMODAT:
886e4b4bbb6SRobert Watson 		ATFD1_TOKENS(1);
887e4b4bbb6SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
888e4b4bbb6SRobert Watson 			tok = au_to_arg32(3, "new file mode",
889e4b4bbb6SRobert Watson 			    ar->ar_arg_mode);
890e4b4bbb6SRobert Watson 			kau_write(rec, tok);
891e4b4bbb6SRobert Watson 		}
892e4b4bbb6SRobert Watson 		UPATH1_VNODE1_TOKENS;
893e4b4bbb6SRobert Watson 		break;
894e4b4bbb6SRobert Watson 
895718c8510SRobert Watson 	case AUE_CHOWN:
896718c8510SRobert Watson 	case AUE_LCHOWN:
897718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_UID)) {
898718c8510SRobert Watson 			tok = au_to_arg32(2, "new file uid", ar->ar_arg_uid);
899718c8510SRobert Watson 			kau_write(rec, tok);
900718c8510SRobert Watson 		}
901718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_GID)) {
902718c8510SRobert Watson 			tok = au_to_arg32(3, "new file gid", ar->ar_arg_gid);
903718c8510SRobert Watson 			kau_write(rec, tok);
904718c8510SRobert Watson 		}
905718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
906718c8510SRobert Watson 		break;
907718c8510SRobert Watson 
908e4b4bbb6SRobert Watson 	case AUE_FCHOWNAT:
909e4b4bbb6SRobert Watson 		ATFD1_TOKENS(1);
910e4b4bbb6SRobert Watson 		if (ARG_IS_VALID(kar, ARG_UID)) {
911e4b4bbb6SRobert Watson 			tok = au_to_arg32(3, "new file uid", ar->ar_arg_uid);
912e4b4bbb6SRobert Watson 			kau_write(rec, tok);
913e4b4bbb6SRobert Watson 		}
914e4b4bbb6SRobert Watson 		if (ARG_IS_VALID(kar, ARG_GID)) {
915e4b4bbb6SRobert Watson 			tok = au_to_arg32(4, "new file gid", ar->ar_arg_gid);
916e4b4bbb6SRobert Watson 			kau_write(rec, tok);
917e4b4bbb6SRobert Watson 		}
918e4b4bbb6SRobert Watson 		UPATH1_VNODE1_TOKENS;
919e4b4bbb6SRobert Watson 		break;
920e4b4bbb6SRobert Watson 
921718c8510SRobert Watson 	case AUE_EXCHANGEDATA:
922718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
923718c8510SRobert Watson 		UPATH2_TOKENS;
924718c8510SRobert Watson 		break;
925718c8510SRobert Watson 
926718c8510SRobert Watson 	case AUE_CLOSE:
927718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FD)) {
9282a565838SRobert Watson 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
929718c8510SRobert Watson 			kau_write(rec, tok);
930718c8510SRobert Watson 		}
931718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
932718c8510SRobert Watson 		break;
933718c8510SRobert Watson 
934583450efSChristian S.J. Peron 	case AUE_CLOSEFROM:
935583450efSChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_FD)) {
936583450efSChristian S.J. Peron 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
937583450efSChristian S.J. Peron 			kau_write(rec, tok);
938583450efSChristian S.J. Peron 		}
939583450efSChristian S.J. Peron 		break;
940583450efSChristian S.J. Peron 
941fa323503SAlex Richardson 	case AUE_CLOSERANGE:
942fa323503SAlex Richardson 		if (ARG_IS_VALID(kar, ARG_FD)) {
943fa323503SAlex Richardson 			tok = au_to_arg32(1, "lowfd", ar->ar_arg_fd);
944fa323503SAlex Richardson 			kau_write(rec, tok);
945fa323503SAlex Richardson 		}
946fa323503SAlex Richardson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
947fa323503SAlex Richardson 			tok = au_to_arg32(2, "highfd", ar->ar_arg_cmd);
948fa323503SAlex Richardson 			kau_write(rec, tok);
949fa323503SAlex Richardson 		}
950fa323503SAlex Richardson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
951fa323503SAlex Richardson 			tok = au_to_arg32(3, "flags", ar->ar_arg_fflags);
952fa323503SAlex Richardson 			kau_write(rec, tok);
953fa323503SAlex Richardson 		}
954fa323503SAlex Richardson 		break;
955fa323503SAlex Richardson 
95657274c51SChristian S.J. Peron 	case AUE_CORE:
95757274c51SChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_SIGNUM)) {
9582a565838SRobert Watson 			tok = au_to_arg32(1, "signal", ar->ar_arg_signum);
95957274c51SChristian S.J. Peron 			kau_write(rec, tok);
96057274c51SChristian S.J. Peron 		}
96157274c51SChristian S.J. Peron 		UPATH1_VNODE1_TOKENS;
96257274c51SChristian S.J. Peron 		break;
96357274c51SChristian S.J. Peron 
96465ee602eSWayne Salamon 	case AUE_EXTATTRCTL:
96565ee602eSWayne Salamon 		UPATH1_VNODE1_TOKENS;
96665ee602eSWayne Salamon 		if (ARG_IS_VALID(kar, ARG_CMD)) {
96765ee602eSWayne Salamon 			tok = au_to_arg32(2, "cmd", ar->ar_arg_cmd);
96865ee602eSWayne Salamon 			kau_write(rec, tok);
96965ee602eSWayne Salamon 		}
97065ee602eSWayne Salamon 		/* extattrctl(2) filename parameter is in upath2/vnode2 */
97165ee602eSWayne Salamon 		UPATH2_TOKENS;
97265ee602eSWayne Salamon 		VNODE2_TOKENS;
9732a565838SRobert Watson 		EXTATTR_TOKENS(4);
97465ee602eSWayne Salamon 		break;
97565ee602eSWayne Salamon 
97665ee602eSWayne Salamon 	case AUE_EXTATTR_GET_FILE:
97765ee602eSWayne Salamon 	case AUE_EXTATTR_SET_FILE:
97865ee602eSWayne Salamon 	case AUE_EXTATTR_LIST_FILE:
97965ee602eSWayne Salamon 	case AUE_EXTATTR_DELETE_FILE:
98065ee602eSWayne Salamon 	case AUE_EXTATTR_GET_LINK:
98165ee602eSWayne Salamon 	case AUE_EXTATTR_SET_LINK:
98265ee602eSWayne Salamon 	case AUE_EXTATTR_LIST_LINK:
98365ee602eSWayne Salamon 	case AUE_EXTATTR_DELETE_LINK:
98465ee602eSWayne Salamon 		UPATH1_VNODE1_TOKENS;
9852a565838SRobert Watson 		EXTATTR_TOKENS(2);
98665ee602eSWayne Salamon 		break;
98765ee602eSWayne Salamon 
98865ee602eSWayne Salamon 	case AUE_EXTATTR_GET_FD:
98965ee602eSWayne Salamon 	case AUE_EXTATTR_SET_FD:
99065ee602eSWayne Salamon 	case AUE_EXTATTR_LIST_FD:
99165ee602eSWayne Salamon 	case AUE_EXTATTR_DELETE_FD:
99265ee602eSWayne Salamon 		if (ARG_IS_VALID(kar, ARG_FD)) {
99365ee602eSWayne Salamon 			tok = au_to_arg32(2, "fd", ar->ar_arg_fd);
99465ee602eSWayne Salamon 			kau_write(rec, tok);
99565ee602eSWayne Salamon 		}
9962a565838SRobert Watson 		EXTATTR_TOKENS(2);
99765ee602eSWayne Salamon 		break;
99865ee602eSWayne Salamon 
9993f397884SRobert Watson 	case AUE_FEXECVE:
10003f397884SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FD)) {
10013f397884SRobert Watson 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
10023f397884SRobert Watson 			kau_write(rec, tok);
10033f397884SRobert Watson 		}
10043f397884SRobert Watson 		/* FALLTHROUGH */
10053f397884SRobert Watson 
1006ae1078d6SWayne Salamon 	case AUE_EXECVE:
10078b14aeeeSRobert Watson 	case AUE_MAC_EXECVE:
1008ae1078d6SWayne Salamon 		if (ARG_IS_VALID(kar, ARG_ARGV)) {
1009ae1078d6SWayne Salamon 			tok = au_to_exec_args(ar->ar_arg_argv,
1010ae1078d6SWayne Salamon 			    ar->ar_arg_argc);
1011ae1078d6SWayne Salamon 			kau_write(rec, tok);
1012ae1078d6SWayne Salamon 		}
1013ae1078d6SWayne Salamon 		if (ARG_IS_VALID(kar, ARG_ENVV)) {
1014ae1078d6SWayne Salamon 			tok = au_to_exec_env(ar->ar_arg_envv,
1015ae1078d6SWayne Salamon 			    ar->ar_arg_envc);
1016ae1078d6SWayne Salamon 			kau_write(rec, tok);
1017ae1078d6SWayne Salamon 		}
1018ae1078d6SWayne Salamon 		UPATH1_VNODE1_TOKENS;
1019ae1078d6SWayne Salamon 		break;
1020ae1078d6SWayne Salamon 
1021718c8510SRobert Watson 	case AUE_FCHMOD:
1022718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
1023871499feSRobert Watson 			tok = au_to_arg32(2, "new file mode",
1024871499feSRobert Watson 			    ar->ar_arg_mode);
1025718c8510SRobert Watson 			kau_write(rec, tok);
1026718c8510SRobert Watson 		}
1027718c8510SRobert Watson 		FD_VNODE1_TOKENS;
1028718c8510SRobert Watson 		break;
1029718c8510SRobert Watson 
103042edcb00SRobert Watson 	/*
103142edcb00SRobert Watson 	 * XXXRW: Some of these need to handle non-vnode cases as well.
103242edcb00SRobert Watson 	 */
1033718c8510SRobert Watson 	case AUE_FCHDIR:
1034718c8510SRobert Watson 	case AUE_FPATHCONF:
103542edcb00SRobert Watson 	case AUE_FSTAT:
1036718c8510SRobert Watson 	case AUE_FSTATFS:
1037718c8510SRobert Watson 	case AUE_FSYNC:
1038718c8510SRobert Watson 	case AUE_FTRUNCATE:
1039718c8510SRobert Watson 	case AUE_FUTIMES:
1040718c8510SRobert Watson 	case AUE_GETDIRENTRIES:
1041718c8510SRobert Watson 	case AUE_GETDIRENTRIESATTR:
1042422d7866SRobert Watson 	case AUE_LSEEK:
104342edcb00SRobert Watson 	case AUE_POLL:
1044b65ec5e5SRobert Watson 	case AUE_POSIX_FALLOCATE:
10452aa8c039SRobert Watson 	case AUE_PREAD:
10462aa8c039SRobert Watson 	case AUE_PWRITE:
104742edcb00SRobert Watson 	case AUE_READ:
104842edcb00SRobert Watson 	case AUE_READV:
104942edcb00SRobert Watson 	case AUE_WRITE:
105042edcb00SRobert Watson 	case AUE_WRITEV:
1051718c8510SRobert Watson 		FD_VNODE1_TOKENS;
1052718c8510SRobert Watson 		break;
1053718c8510SRobert Watson 
1054718c8510SRobert Watson 	case AUE_FCHOWN:
1055718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_UID)) {
1056718c8510SRobert Watson 			tok = au_to_arg32(2, "new file uid", ar->ar_arg_uid);
1057718c8510SRobert Watson 			kau_write(rec, tok);
1058718c8510SRobert Watson 		}
1059718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_GID)) {
1060718c8510SRobert Watson 			tok = au_to_arg32(3, "new file gid", ar->ar_arg_gid);
1061718c8510SRobert Watson 			kau_write(rec, tok);
1062718c8510SRobert Watson 		}
1063718c8510SRobert Watson 		FD_VNODE1_TOKENS;
1064718c8510SRobert Watson 		break;
1065718c8510SRobert Watson 
1066718c8510SRobert Watson 	case AUE_FCNTL:
1067718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
10684df4e335SRobert Watson 			tok = au_to_arg32(2, "cmd",
10694df4e335SRobert Watson 			    au_fcntl_cmd_to_bsm(ar->ar_arg_cmd));
1070718c8510SRobert Watson 			kau_write(rec, tok);
1071718c8510SRobert Watson 		}
1072718c8510SRobert Watson 		FD_VNODE1_TOKENS;
1073718c8510SRobert Watson 		break;
1074718c8510SRobert Watson 
1075718c8510SRobert Watson 	case AUE_FCHFLAGS:
1076718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1077718c8510SRobert Watson 			tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
1078718c8510SRobert Watson 			kau_write(rec, tok);
1079718c8510SRobert Watson 		}
1080718c8510SRobert Watson 		FD_VNODE1_TOKENS;
1081718c8510SRobert Watson 		break;
1082718c8510SRobert Watson 
1083718c8510SRobert Watson 	case AUE_FLOCK:
1084718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1085718c8510SRobert Watson 			tok = au_to_arg32(2, "operation", ar->ar_arg_cmd);
1086718c8510SRobert Watson 			kau_write(rec, tok);
1087718c8510SRobert Watson 		}
1088718c8510SRobert Watson 		FD_VNODE1_TOKENS;
1089718c8510SRobert Watson 		break;
1090718c8510SRobert Watson 
1091*0dc332bfSKa Ho Ng 	case AUE_FSPACECTL:
1092*0dc332bfSKa Ho Ng 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1093*0dc332bfSKa Ho Ng 			tok = au_to_arg32(2, "operation", ar->ar_arg_cmd);
1094*0dc332bfSKa Ho Ng 			kau_write(rec, tok);
1095*0dc332bfSKa Ho Ng 		}
1096*0dc332bfSKa Ho Ng 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1097*0dc332bfSKa Ho Ng 			tok = au_to_arg32(4, "flags", ar->ar_arg_fflags);
1098*0dc332bfSKa Ho Ng 			kau_write(rec, tok);
1099*0dc332bfSKa Ho Ng 		}
1100*0dc332bfSKa Ho Ng 		FD_VNODE1_TOKENS;
1101*0dc332bfSKa Ho Ng 		break;
1102*0dc332bfSKa Ho Ng 
1103718c8510SRobert Watson 	case AUE_RFORK:
1104718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1105718c8510SRobert Watson 			tok = au_to_arg32(1, "flags", ar->ar_arg_fflags);
1106718c8510SRobert Watson 			kau_write(rec, tok);
1107718c8510SRobert Watson 		}
1108a760c0b2SRobert Watson 		/* FALLTHROUGH */
1109a760c0b2SRobert Watson 
1110718c8510SRobert Watson 	case AUE_FORK:
1111718c8510SRobert Watson 	case AUE_VFORK:
1112718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_PID)) {
1113718c8510SRobert Watson 			tok = au_to_arg32(0, "child PID", ar->ar_arg_pid);
1114718c8510SRobert Watson 			kau_write(rec, tok);
1115718c8510SRobert Watson 		}
1116718c8510SRobert Watson 		break;
1117718c8510SRobert Watson 
1118718c8510SRobert Watson 	case AUE_IOCTL:
1119718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1120718c8510SRobert Watson 			tok = au_to_arg32(2, "cmd", ar->ar_arg_cmd);
1121718c8510SRobert Watson 			kau_write(rec, tok);
1122718c8510SRobert Watson 		}
1123871499feSRobert Watson 		if (ARG_IS_VALID(kar, ARG_VNODE1))
1124718c8510SRobert Watson 			FD_VNODE1_TOKENS;
1125871499feSRobert Watson 		else {
1126718c8510SRobert Watson 			if (ARG_IS_VALID(kar, ARG_SOCKINFO)) {
1127718c8510SRobert Watson 				tok = kau_to_socket(&ar->ar_arg_sockinfo);
1128718c8510SRobert Watson 				kau_write(rec, tok);
1129718c8510SRobert Watson 			} else {
1130718c8510SRobert Watson 				if (ARG_IS_VALID(kar, ARG_FD)) {
1131718c8510SRobert Watson 					tok = au_to_arg32(1, "fd",
1132718c8510SRobert Watson 					    ar->ar_arg_fd);
1133718c8510SRobert Watson 					kau_write(rec, tok);
1134718c8510SRobert Watson 				}
1135718c8510SRobert Watson 			}
1136718c8510SRobert Watson 		}
1137718c8510SRobert Watson 		break;
1138718c8510SRobert Watson 
1139718c8510SRobert Watson 	case AUE_KILL:
114042edcb00SRobert Watson 	case AUE_KILLPG:
1141718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SIGNUM)) {
1142718c8510SRobert Watson 			tok = au_to_arg32(2, "signal", ar->ar_arg_signum);
1143718c8510SRobert Watson 			kau_write(rec, tok);
1144718c8510SRobert Watson 		}
1145718c8510SRobert Watson 		PROCESS_PID_TOKENS(1);
1146718c8510SRobert Watson 		break;
1147718c8510SRobert Watson 
1148718c8510SRobert Watson 	case AUE_KTRACE:
1149718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1150718c8510SRobert Watson 			tok = au_to_arg32(2, "ops", ar->ar_arg_cmd);
1151718c8510SRobert Watson 			kau_write(rec, tok);
1152718c8510SRobert Watson 		}
1153718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
1154718c8510SRobert Watson 			tok = au_to_arg32(3, "trpoints", ar->ar_arg_value);
1155718c8510SRobert Watson 			kau_write(rec, tok);
1156718c8510SRobert Watson 		}
1157718c8510SRobert Watson 		PROCESS_PID_TOKENS(4);
1158718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
1159718c8510SRobert Watson 		break;
1160718c8510SRobert Watson 
1161718c8510SRobert Watson 	case AUE_LINK:
1162e4b4bbb6SRobert Watson 	case AUE_LINKAT:
1163718c8510SRobert Watson 	case AUE_RENAME:
1164e4b4bbb6SRobert Watson 	case AUE_RENAMEAT:
1165e4b4bbb6SRobert Watson 		ATFD1_TOKENS(1);
1166718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
1167e4b4bbb6SRobert Watson 		ATFD2_TOKENS(3);
1168718c8510SRobert Watson 		UPATH2_TOKENS;
1169718c8510SRobert Watson 		break;
1170718c8510SRobert Watson 
1171718c8510SRobert Watson 	case AUE_LOADSHFILE:
11722a565838SRobert Watson 		ADDR_TOKEN(4, "base addr");
1173718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
1174718c8510SRobert Watson 		break;
1175718c8510SRobert Watson 
1176718c8510SRobert Watson 	case AUE_MKDIR:
117780a044eaSPawel Jakub Dawidek 	case AUE_MKDIRAT:
117880a044eaSPawel Jakub Dawidek 	case AUE_MKFIFO:
117980a044eaSPawel Jakub Dawidek 	case AUE_MKFIFOAT:
118080a044eaSPawel Jakub Dawidek 		ATFD1_TOKENS(1);
1181718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
1182718c8510SRobert Watson 			tok = au_to_arg32(2, "mode", ar->ar_arg_mode);
1183718c8510SRobert Watson 			kau_write(rec, tok);
1184718c8510SRobert Watson 		}
1185718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
1186718c8510SRobert Watson 		break;
1187718c8510SRobert Watson 
1188718c8510SRobert Watson 	case AUE_MKNOD:
118980a044eaSPawel Jakub Dawidek 	case AUE_MKNODAT:
119080a044eaSPawel Jakub Dawidek 		ATFD1_TOKENS(1);
1191718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
1192718c8510SRobert Watson 			tok = au_to_arg32(2, "mode", ar->ar_arg_mode);
1193718c8510SRobert Watson 			kau_write(rec, tok);
1194718c8510SRobert Watson 		}
1195718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_DEV)) {
1196718c8510SRobert Watson 			tok = au_to_arg32(3, "dev", ar->ar_arg_dev);
1197718c8510SRobert Watson 			kau_write(rec, tok);
1198718c8510SRobert Watson 		}
1199718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
1200718c8510SRobert Watson 		break;
1201718c8510SRobert Watson 
1202718c8510SRobert Watson 	case AUE_MMAP:
1203718c8510SRobert Watson 	case AUE_MUNMAP:
1204718c8510SRobert Watson 	case AUE_MPROTECT:
1205718c8510SRobert Watson 	case AUE_MLOCK:
1206718c8510SRobert Watson 	case AUE_MUNLOCK:
1207718c8510SRobert Watson 	case AUE_MINHERIT:
12082a565838SRobert Watson 		ADDR_TOKEN(1, "addr");
1209718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_LEN)) {
1210718c8510SRobert Watson 			tok = au_to_arg32(2, "len", ar->ar_arg_len);
1211718c8510SRobert Watson 			kau_write(rec, tok);
1212718c8510SRobert Watson 		}
1213718c8510SRobert Watson 		if (ar->ar_event == AUE_MMAP)
1214718c8510SRobert Watson 			FD_VNODE1_TOKENS;
1215718c8510SRobert Watson 		if (ar->ar_event == AUE_MPROTECT) {
1216718c8510SRobert Watson 			if (ARG_IS_VALID(kar, ARG_VALUE)) {
1217718c8510SRobert Watson 				tok = au_to_arg32(3, "protection",
1218718c8510SRobert Watson 				    ar->ar_arg_value);
1219718c8510SRobert Watson 				kau_write(rec, tok);
1220718c8510SRobert Watson 			}
1221718c8510SRobert Watson 		}
1222718c8510SRobert Watson 		if (ar->ar_event == AUE_MINHERIT) {
1223718c8510SRobert Watson 			if (ARG_IS_VALID(kar, ARG_VALUE)) {
1224718c8510SRobert Watson 				tok = au_to_arg32(3, "inherit",
1225718c8510SRobert Watson 				    ar->ar_arg_value);
1226718c8510SRobert Watson 				kau_write(rec, tok);
1227718c8510SRobert Watson 			}
1228718c8510SRobert Watson 		}
1229718c8510SRobert Watson 		break;
1230718c8510SRobert Watson 
1231718c8510SRobert Watson 	case AUE_MOUNT:
123242edcb00SRobert Watson 	case AUE_NMOUNT:
1233718c8510SRobert Watson 		/* XXX Need to handle NFS mounts */
1234718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1235718c8510SRobert Watson 			tok = au_to_arg32(3, "flags", ar->ar_arg_fflags);
1236718c8510SRobert Watson 			kau_write(rec, tok);
1237718c8510SRobert Watson 		}
1238718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_TEXT)) {
1239718c8510SRobert Watson 			tok = au_to_text(ar->ar_arg_text);
1240718c8510SRobert Watson 			kau_write(rec, tok);
1241718c8510SRobert Watson 		}
1242a760c0b2SRobert Watson 		/* FALLTHROUGH */
1243871499feSRobert Watson 
12444ba1f444SRobert Watson 	case AUE_NFS_SVC:
12454ba1f444SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
12462a565838SRobert Watson 			tok = au_to_arg32(1, "flags", ar->ar_arg_cmd);
12474ba1f444SRobert Watson 			kau_write(rec, tok);
12484ba1f444SRobert Watson 		}
12494ba1f444SRobert Watson 		break;
12504ba1f444SRobert Watson 
1251718c8510SRobert Watson 	case AUE_UMOUNT:
12526d5a6156SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
12532a565838SRobert Watson 			tok = au_to_arg32(2, "flags", ar->ar_arg_value);
12546d5a6156SRobert Watson 			kau_write(rec, tok);
12556d5a6156SRobert Watson 		}
1256718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
12576d5a6156SRobert Watson 		if (ARG_IS_VALID(kar, ARG_TEXT)) {
12586d5a6156SRobert Watson 			tok = au_to_text(ar->ar_arg_text);
12596d5a6156SRobert Watson 			kau_write(rec, tok);
12606d5a6156SRobert Watson 		}
1261718c8510SRobert Watson 		break;
1262718c8510SRobert Watson 
1263718c8510SRobert Watson 	case AUE_MSGCTL:
1264303d3f35SRobert Watson 		ar->ar_event = audit_msgctl_to_event(ar->ar_arg_svipc_cmd);
1265718c8510SRobert Watson 		/* Fall through */
1266871499feSRobert Watson 
1267718c8510SRobert Watson 	case AUE_MSGRCV:
1268718c8510SRobert Watson 	case AUE_MSGSND:
1269718c8510SRobert Watson 		tok = au_to_arg32(1, "msg ID", ar->ar_arg_svipc_id);
1270718c8510SRobert Watson 		kau_write(rec, tok);
1271718c8510SRobert Watson 		if (ar->ar_errno != EINVAL) {
1272718c8510SRobert Watson 			tok = au_to_ipc(AT_IPC_MSG, ar->ar_arg_svipc_id);
1273718c8510SRobert Watson 			kau_write(rec, tok);
1274718c8510SRobert Watson 		}
1275718c8510SRobert Watson 		break;
1276718c8510SRobert Watson 
1277718c8510SRobert Watson 	case AUE_MSGGET:
1278718c8510SRobert Watson 		if (ar->ar_errno == 0) {
1279718c8510SRobert Watson 			if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
1280718c8510SRobert Watson 				tok = au_to_ipc(AT_IPC_MSG,
1281718c8510SRobert Watson 				    ar->ar_arg_svipc_id);
1282718c8510SRobert Watson 				kau_write(rec, tok);
1283718c8510SRobert Watson 			}
1284718c8510SRobert Watson 		}
1285718c8510SRobert Watson 		break;
1286718c8510SRobert Watson 
1287718c8510SRobert Watson 	case AUE_RESETSHFILE:
12882a565838SRobert Watson 		ADDR_TOKEN(1, "base addr");
1289718c8510SRobert Watson 		break;
1290718c8510SRobert Watson 
1291718c8510SRobert Watson 	case AUE_OPEN_RC:
1292718c8510SRobert Watson 	case AUE_OPEN_RTC:
1293718c8510SRobert Watson 	case AUE_OPEN_RWC:
1294718c8510SRobert Watson 	case AUE_OPEN_RWTC:
1295718c8510SRobert Watson 	case AUE_OPEN_WC:
1296718c8510SRobert Watson 	case AUE_OPEN_WTC:
129742edcb00SRobert Watson 	case AUE_CREAT:
1298718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
1299718c8510SRobert Watson 			tok = au_to_arg32(3, "mode", ar->ar_arg_mode);
1300718c8510SRobert Watson 			kau_write(rec, tok);
1301718c8510SRobert Watson 		}
1302a760c0b2SRobert Watson 		/* FALLTHROUGH */
1303718c8510SRobert Watson 
1304718c8510SRobert Watson 	case AUE_OPEN_R:
1305718c8510SRobert Watson 	case AUE_OPEN_RT:
1306718c8510SRobert Watson 	case AUE_OPEN_RW:
1307718c8510SRobert Watson 	case AUE_OPEN_RWT:
1308718c8510SRobert Watson 	case AUE_OPEN_W:
1309718c8510SRobert Watson 	case AUE_OPEN_WT:
1310718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1311718c8510SRobert Watson 			tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
1312718c8510SRobert Watson 			kau_write(rec, tok);
1313718c8510SRobert Watson 		}
1314718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
1315718c8510SRobert Watson 		break;
1316718c8510SRobert Watson 
1317e4b4bbb6SRobert Watson 	case AUE_OPENAT_RC:
1318e4b4bbb6SRobert Watson 	case AUE_OPENAT_RTC:
1319e4b4bbb6SRobert Watson 	case AUE_OPENAT_RWC:
1320e4b4bbb6SRobert Watson 	case AUE_OPENAT_RWTC:
1321e4b4bbb6SRobert Watson 	case AUE_OPENAT_WC:
1322e4b4bbb6SRobert Watson 	case AUE_OPENAT_WTC:
1323e4b4bbb6SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
1324e4b4bbb6SRobert Watson 			tok = au_to_arg32(3, "mode", ar->ar_arg_mode);
1325e4b4bbb6SRobert Watson 			kau_write(rec, tok);
1326e4b4bbb6SRobert Watson 		}
1327e4b4bbb6SRobert Watson 		/* FALLTHROUGH */
1328e4b4bbb6SRobert Watson 
1329e4b4bbb6SRobert Watson 	case AUE_OPENAT_R:
1330e4b4bbb6SRobert Watson 	case AUE_OPENAT_RT:
1331e4b4bbb6SRobert Watson 	case AUE_OPENAT_RW:
1332e4b4bbb6SRobert Watson 	case AUE_OPENAT_RWT:
1333e4b4bbb6SRobert Watson 	case AUE_OPENAT_W:
1334e4b4bbb6SRobert Watson 	case AUE_OPENAT_WT:
1335e4b4bbb6SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1336e4b4bbb6SRobert Watson 			tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
1337e4b4bbb6SRobert Watson 			kau_write(rec, tok);
1338e4b4bbb6SRobert Watson 		}
1339e4b4bbb6SRobert Watson 		ATFD1_TOKENS(1);
1340e4b4bbb6SRobert Watson 		UPATH1_VNODE1_TOKENS;
1341e4b4bbb6SRobert Watson 		break;
1342e4b4bbb6SRobert Watson 
1343757a5642SChristian S.J. Peron 	case AUE_PDKILL:
1344757a5642SChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_FD)) {
1345757a5642SChristian S.J. Peron 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
1346757a5642SChristian S.J. Peron 			kau_write(rec, tok);
1347757a5642SChristian S.J. Peron 		}
1348757a5642SChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_SIGNUM)) {
1349757a5642SChristian S.J. Peron 			tok = au_to_arg32(2, "signal", ar->ar_arg_signum);
1350757a5642SChristian S.J. Peron 			kau_write(rec, tok);
1351757a5642SChristian S.J. Peron 		}
1352757a5642SChristian S.J. Peron 		PROCESS_PID_TOKENS(1);
1353757a5642SChristian S.J. Peron 		break;
1354757a5642SChristian S.J. Peron 	case AUE_PDFORK:
1355757a5642SChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_PID)) {
1356757a5642SChristian S.J. Peron 			tok = au_to_arg32(0, "child PID", ar->ar_arg_pid);
1357757a5642SChristian S.J. Peron 			kau_write(rec, tok);
1358757a5642SChristian S.J. Peron 		}
1359757a5642SChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1360757a5642SChristian S.J. Peron 			tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
1361757a5642SChristian S.J. Peron 			kau_write(rec, tok);
1362757a5642SChristian S.J. Peron 		}
1363757a5642SChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_FD)) {
1364757a5642SChristian S.J. Peron 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
1365757a5642SChristian S.J. Peron 			kau_write(rec, tok);
1366757a5642SChristian S.J. Peron 		}
1367757a5642SChristian S.J. Peron 		break;
1368757a5642SChristian S.J. Peron 	case AUE_PDGETPID:
1369757a5642SChristian S.J. Peron 		if (ARG_IS_VALID(kar, ARG_FD)) {
1370757a5642SChristian S.J. Peron 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
1371757a5642SChristian S.J. Peron 			kau_write(rec, tok);
1372757a5642SChristian S.J. Peron 		}
1373757a5642SChristian S.J. Peron 		break;
1374757a5642SChristian S.J. Peron 
1375b65ec5e5SRobert Watson 	case AUE_PROCCTL:
1376b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
1377b65ec5e5SRobert Watson 			tok = au_to_arg32(1, "idtype", ar->ar_arg_value);
1378b65ec5e5SRobert Watson 			kau_write(rec, tok);
1379b65ec5e5SRobert Watson 		}
1380b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1381b65ec5e5SRobert Watson 			tok = au_to_arg32(2, "com", ar->ar_arg_cmd);
1382b65ec5e5SRobert Watson 			kau_write(rec, tok);
1383b65ec5e5SRobert Watson 		}
1384b65ec5e5SRobert Watson 		PROCESS_PID_TOKENS(3);
1385b65ec5e5SRobert Watson 		break;
1386b65ec5e5SRobert Watson 
1387718c8510SRobert Watson 	case AUE_PTRACE:
1388718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1389718c8510SRobert Watson 			tok = au_to_arg32(1, "request", ar->ar_arg_cmd);
1390718c8510SRobert Watson 			kau_write(rec, tok);
1391718c8510SRobert Watson 		}
1392718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
1393718c8510SRobert Watson 			tok = au_to_arg32(4, "data", ar->ar_arg_value);
1394718c8510SRobert Watson 			kau_write(rec, tok);
1395718c8510SRobert Watson 		}
1396718c8510SRobert Watson 		PROCESS_PID_TOKENS(2);
1397718c8510SRobert Watson 		break;
1398718c8510SRobert Watson 
1399718c8510SRobert Watson 	case AUE_QUOTACTL:
1400718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1401718c8510SRobert Watson 			tok = au_to_arg32(2, "command", ar->ar_arg_cmd);
1402718c8510SRobert Watson 			kau_write(rec, tok);
1403718c8510SRobert Watson 		}
1404718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_UID)) {
1405718c8510SRobert Watson 			tok = au_to_arg32(3, "uid", ar->ar_arg_uid);
1406718c8510SRobert Watson 			kau_write(rec, tok);
1407718c8510SRobert Watson 		}
14082a565838SRobert Watson 		if (ARG_IS_VALID(kar, ARG_GID)) {
14092a565838SRobert Watson 			tok = au_to_arg32(3, "gid", ar->ar_arg_gid);
14102a565838SRobert Watson 			kau_write(rec, tok);
14112a565838SRobert Watson 		}
1412718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
1413718c8510SRobert Watson 		break;
1414718c8510SRobert Watson 
1415718c8510SRobert Watson 	case AUE_REBOOT:
1416718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1417718c8510SRobert Watson 			tok = au_to_arg32(1, "howto", ar->ar_arg_cmd);
1418718c8510SRobert Watson 			kau_write(rec, tok);
1419718c8510SRobert Watson 		}
1420718c8510SRobert Watson 		break;
1421718c8510SRobert Watson 
1422718c8510SRobert Watson 	case AUE_SEMCTL:
1423303d3f35SRobert Watson 		ar->ar_event = audit_semctl_to_event(ar->ar_arg_svipc_cmd);
1424718c8510SRobert Watson 		/* Fall through */
1425871499feSRobert Watson 
1426718c8510SRobert Watson 	case AUE_SEMOP:
1427718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
1428718c8510SRobert Watson 			tok = au_to_arg32(1, "sem ID", ar->ar_arg_svipc_id);
1429718c8510SRobert Watson 			kau_write(rec, tok);
1430718c8510SRobert Watson 			if (ar->ar_errno != EINVAL) {
1431718c8510SRobert Watson 				tok = au_to_ipc(AT_IPC_SEM,
1432718c8510SRobert Watson 				    ar->ar_arg_svipc_id);
1433718c8510SRobert Watson 				kau_write(rec, tok);
1434718c8510SRobert Watson 			}
1435718c8510SRobert Watson 		}
1436718c8510SRobert Watson 		break;
1437871499feSRobert Watson 
1438718c8510SRobert Watson 	case AUE_SEMGET:
1439718c8510SRobert Watson 		if (ar->ar_errno == 0) {
1440718c8510SRobert Watson 			if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
1441718c8510SRobert Watson 				tok = au_to_ipc(AT_IPC_SEM,
1442718c8510SRobert Watson 				    ar->ar_arg_svipc_id);
1443718c8510SRobert Watson 				kau_write(rec, tok);
1444718c8510SRobert Watson 			}
1445718c8510SRobert Watson 		}
1446718c8510SRobert Watson 		break;
1447871499feSRobert Watson 
1448718c8510SRobert Watson 	case AUE_SETEGID:
1449718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_EGID)) {
14502a565838SRobert Watson 			tok = au_to_arg32(1, "egid", ar->ar_arg_egid);
1451718c8510SRobert Watson 			kau_write(rec, tok);
1452718c8510SRobert Watson 		}
1453718c8510SRobert Watson 		break;
1454871499feSRobert Watson 
1455718c8510SRobert Watson 	case AUE_SETEUID:
1456718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_EUID)) {
14572a565838SRobert Watson 			tok = au_to_arg32(1, "euid", ar->ar_arg_euid);
1458718c8510SRobert Watson 			kau_write(rec, tok);
1459718c8510SRobert Watson 		}
1460718c8510SRobert Watson 		break;
1461871499feSRobert Watson 
1462718c8510SRobert Watson 	case AUE_SETREGID:
1463718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_RGID)) {
1464718c8510SRobert Watson 			tok = au_to_arg32(1, "rgid", ar->ar_arg_rgid);
1465718c8510SRobert Watson 			kau_write(rec, tok);
1466718c8510SRobert Watson 		}
1467718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_EGID)) {
1468718c8510SRobert Watson 			tok = au_to_arg32(2, "egid", ar->ar_arg_egid);
1469718c8510SRobert Watson 			kau_write(rec, tok);
1470718c8510SRobert Watson 		}
1471718c8510SRobert Watson 		break;
1472871499feSRobert Watson 
1473718c8510SRobert Watson 	case AUE_SETREUID:
1474718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_RUID)) {
1475718c8510SRobert Watson 			tok = au_to_arg32(1, "ruid", ar->ar_arg_ruid);
1476718c8510SRobert Watson 			kau_write(rec, tok);
1477718c8510SRobert Watson 		}
1478718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_EUID)) {
1479718c8510SRobert Watson 			tok = au_to_arg32(2, "euid", ar->ar_arg_euid);
1480718c8510SRobert Watson 			kau_write(rec, tok);
1481718c8510SRobert Watson 		}
1482718c8510SRobert Watson 		break;
1483871499feSRobert Watson 
1484718c8510SRobert Watson 	case AUE_SETRESGID:
1485718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_RGID)) {
1486718c8510SRobert Watson 			tok = au_to_arg32(1, "rgid", ar->ar_arg_rgid);
1487718c8510SRobert Watson 			kau_write(rec, tok);
1488718c8510SRobert Watson 		}
1489718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_EGID)) {
1490718c8510SRobert Watson 			tok = au_to_arg32(2, "egid", ar->ar_arg_egid);
1491718c8510SRobert Watson 			kau_write(rec, tok);
1492718c8510SRobert Watson 		}
1493718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SGID)) {
1494718c8510SRobert Watson 			tok = au_to_arg32(3, "sgid", ar->ar_arg_sgid);
1495718c8510SRobert Watson 			kau_write(rec, tok);
1496718c8510SRobert Watson 		}
1497718c8510SRobert Watson 		break;
1498871499feSRobert Watson 
1499718c8510SRobert Watson 	case AUE_SETRESUID:
1500718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_RUID)) {
1501718c8510SRobert Watson 			tok = au_to_arg32(1, "ruid", ar->ar_arg_ruid);
1502718c8510SRobert Watson 			kau_write(rec, tok);
1503718c8510SRobert Watson 		}
1504718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_EUID)) {
1505718c8510SRobert Watson 			tok = au_to_arg32(2, "euid", ar->ar_arg_euid);
1506718c8510SRobert Watson 			kau_write(rec, tok);
1507718c8510SRobert Watson 		}
1508718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SUID)) {
1509718c8510SRobert Watson 			tok = au_to_arg32(3, "suid", ar->ar_arg_suid);
1510718c8510SRobert Watson 			kau_write(rec, tok);
1511718c8510SRobert Watson 		}
1512718c8510SRobert Watson 		break;
1513871499feSRobert Watson 
1514718c8510SRobert Watson 	case AUE_SETGID:
1515718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_GID)) {
1516718c8510SRobert Watson 			tok = au_to_arg32(1, "gid", ar->ar_arg_gid);
1517718c8510SRobert Watson 			kau_write(rec, tok);
1518718c8510SRobert Watson 		}
1519718c8510SRobert Watson 		break;
1520871499feSRobert Watson 
1521718c8510SRobert Watson 	case AUE_SETUID:
1522718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_UID)) {
1523718c8510SRobert Watson 			tok = au_to_arg32(1, "uid", ar->ar_arg_uid);
1524718c8510SRobert Watson 			kau_write(rec, tok);
1525718c8510SRobert Watson 		}
1526718c8510SRobert Watson 		break;
1527871499feSRobert Watson 
1528718c8510SRobert Watson 	case AUE_SETGROUPS:
1529718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_GROUPSET)) {
1530718c8510SRobert Watson 			for(ctr = 0; ctr < ar->ar_arg_groups.gidset_size; ctr++)
1531718c8510SRobert Watson 			{
15320f7e334aSChristian S.J. Peron 				tok = au_to_arg32(1, "setgroups",
15330f7e334aSChristian S.J. Peron 				    ar->ar_arg_groups.gidset[ctr]);
1534718c8510SRobert Watson 				kau_write(rec, tok);
1535718c8510SRobert Watson 			}
1536718c8510SRobert Watson 		}
1537718c8510SRobert Watson 		break;
1538718c8510SRobert Watson 
1539718c8510SRobert Watson 	case AUE_SETLOGIN:
154070a98c11SRobert Watson 		if (ARG_IS_VALID(kar, ARG_LOGIN)) {
154170a98c11SRobert Watson 			tok = au_to_text(ar->ar_arg_login);
1542718c8510SRobert Watson 			kau_write(rec, tok);
1543718c8510SRobert Watson 		}
1544718c8510SRobert Watson 		break;
1545718c8510SRobert Watson 
15461018b2ffSChristian S.J. Peron 	case AUE_SETLOGINCLASS:
15471018b2ffSChristian S.J. Peron 		break;
15481018b2ffSChristian S.J. Peron 
1549718c8510SRobert Watson 	case AUE_SETPRIORITY:
1550718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CMD)) {
1551718c8510SRobert Watson 			tok = au_to_arg32(1, "which", ar->ar_arg_cmd);
1552718c8510SRobert Watson 			kau_write(rec, tok);
1553718c8510SRobert Watson 		}
1554718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_UID)) {
1555718c8510SRobert Watson 			tok = au_to_arg32(2, "who", ar->ar_arg_uid);
1556718c8510SRobert Watson 			kau_write(rec, tok);
1557718c8510SRobert Watson 		}
15582a565838SRobert Watson 		PROCESS_PID_TOKENS(2);
1559718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
15602a565838SRobert Watson 			tok = au_to_arg32(3, "priority", ar->ar_arg_value);
1561718c8510SRobert Watson 			kau_write(rec, tok);
1562718c8510SRobert Watson 		}
1563718c8510SRobert Watson 		break;
1564718c8510SRobert Watson 
1565718c8510SRobert Watson 	case AUE_SETPRIVEXEC:
1566718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
1567718c8510SRobert Watson 			tok = au_to_arg32(1, "flag", ar->ar_arg_value);
1568718c8510SRobert Watson 			kau_write(rec, tok);
1569718c8510SRobert Watson 		}
1570718c8510SRobert Watson 		break;
1571718c8510SRobert Watson 
1572718c8510SRobert Watson 	/* AUE_SHMAT, AUE_SHMCTL, AUE_SHMDT and AUE_SHMGET are SysV IPC */
1573718c8510SRobert Watson 	case AUE_SHMAT:
1574718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
1575718c8510SRobert Watson 			tok = au_to_arg32(1, "shmid", ar->ar_arg_svipc_id);
1576718c8510SRobert Watson 			kau_write(rec, tok);
1577718c8510SRobert Watson 			/* XXXAUDIT: Does having the ipc token make sense? */
1578718c8510SRobert Watson 			tok = au_to_ipc(AT_IPC_SHM, ar->ar_arg_svipc_id);
1579718c8510SRobert Watson 			kau_write(rec, tok);
1580718c8510SRobert Watson 		}
1581718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SVIPC_ADDR)) {
1582718c8510SRobert Watson 			tok = au_to_arg32(2, "shmaddr",
1583a02a1efaSRobert Watson 			    (int)(uintptr_t)ar->ar_arg_svipc_addr);
1584718c8510SRobert Watson 			kau_write(rec, tok);
1585718c8510SRobert Watson 		}
1586718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SVIPC_PERM)) {
1587718c8510SRobert Watson 			tok = au_to_ipc_perm(&ar->ar_arg_svipc_perm);
1588718c8510SRobert Watson 			kau_write(rec, tok);
1589718c8510SRobert Watson 		}
1590718c8510SRobert Watson 		break;
1591718c8510SRobert Watson 
1592718c8510SRobert Watson 	case AUE_SHMCTL:
1593718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
1594718c8510SRobert Watson 			tok = au_to_arg32(1, "shmid", ar->ar_arg_svipc_id);
1595718c8510SRobert Watson 			kau_write(rec, tok);
1596718c8510SRobert Watson 			/* XXXAUDIT: Does having the ipc token make sense? */
1597718c8510SRobert Watson 			tok = au_to_ipc(AT_IPC_SHM, ar->ar_arg_svipc_id);
1598718c8510SRobert Watson 			kau_write(rec, tok);
1599718c8510SRobert Watson 		}
1600718c8510SRobert Watson 		switch (ar->ar_arg_svipc_cmd) {
1601718c8510SRobert Watson 		case IPC_STAT:
1602718c8510SRobert Watson 			ar->ar_event = AUE_SHMCTL_STAT;
1603718c8510SRobert Watson 			break;
1604718c8510SRobert Watson 		case IPC_RMID:
1605718c8510SRobert Watson 			ar->ar_event = AUE_SHMCTL_RMID;
1606718c8510SRobert Watson 			break;
1607718c8510SRobert Watson 		case IPC_SET:
1608718c8510SRobert Watson 			ar->ar_event = AUE_SHMCTL_SET;
1609718c8510SRobert Watson 			if (ARG_IS_VALID(kar, ARG_SVIPC_PERM)) {
1610718c8510SRobert Watson 				tok = au_to_ipc_perm(&ar->ar_arg_svipc_perm);
1611718c8510SRobert Watson 				kau_write(rec, tok);
1612718c8510SRobert Watson 			}
1613718c8510SRobert Watson 			break;
1614718c8510SRobert Watson 		default:
1615718c8510SRobert Watson 			break;	/* We will audit a bad command */
1616718c8510SRobert Watson 		}
1617718c8510SRobert Watson 		break;
1618718c8510SRobert Watson 
1619718c8510SRobert Watson 	case AUE_SHMDT:
1620718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SVIPC_ADDR)) {
1621718c8510SRobert Watson 			tok = au_to_arg32(1, "shmaddr",
1622a02a1efaSRobert Watson 			    (int)(uintptr_t)ar->ar_arg_svipc_addr);
1623718c8510SRobert Watson 			kau_write(rec, tok);
1624718c8510SRobert Watson 		}
1625718c8510SRobert Watson 		break;
1626718c8510SRobert Watson 
1627718c8510SRobert Watson 	case AUE_SHMGET:
1628718c8510SRobert Watson 		/* This is unusual; the return value is in an argument token */
1629718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SVIPC_ID)) {
1630718c8510SRobert Watson 			tok = au_to_arg32(0, "shmid", ar->ar_arg_svipc_id);
1631718c8510SRobert Watson 			kau_write(rec, tok);
1632718c8510SRobert Watson 			tok = au_to_ipc(AT_IPC_SHM, ar->ar_arg_svipc_id);
1633718c8510SRobert Watson 			kau_write(rec, tok);
1634718c8510SRobert Watson 		}
1635718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_SVIPC_PERM)) {
1636718c8510SRobert Watson 			tok = au_to_ipc_perm(&ar->ar_arg_svipc_perm);
1637718c8510SRobert Watson 			kau_write(rec, tok);
1638718c8510SRobert Watson 		}
1639718c8510SRobert Watson 		break;
1640718c8510SRobert Watson 
16412d5603feSDavid Bright 	/* shm_rename is a non-Posix extension to the Posix shm implementation */
16422d5603feSDavid Bright 	case AUE_SHMRENAME:
16432d5603feSDavid Bright 		UPATH1_TOKENS;
16442d5603feSDavid Bright 		UPATH2_TOKENS;
16452d5603feSDavid Bright 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
16462d5603feSDavid Bright 			tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
16472d5603feSDavid Bright 			kau_write(rec, tok);
16482d5603feSDavid Bright 		}
16492d5603feSDavid Bright 		break;
16502d5603feSDavid Bright 
1651718c8510SRobert Watson 	/* AUE_SHMOPEN, AUE_SHMUNLINK, AUE_SEMOPEN, AUE_SEMCLOSE
1652718c8510SRobert Watson 	 * and AUE_SEMUNLINK are Posix IPC */
1653718c8510SRobert Watson 	case AUE_SHMOPEN:
1654b65ec5e5SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1655718c8510SRobert Watson 			tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
1656718c8510SRobert Watson 			kau_write(rec, tok);
1657718c8510SRobert Watson 		}
1658718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
1659718c8510SRobert Watson 			tok = au_to_arg32(3, "mode", ar->ar_arg_mode);
1660718c8510SRobert Watson 			kau_write(rec, tok);
1661718c8510SRobert Watson 		}
1662a760c0b2SRobert Watson 		/* FALLTHROUGH */
1663a760c0b2SRobert Watson 
1664718c8510SRobert Watson 	case AUE_SHMUNLINK:
1665b65ec5e5SRobert Watson 		UPATH1_TOKENS;
1666718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_POSIX_IPC_PERM)) {
1667718c8510SRobert Watson 			struct ipc_perm perm;
166830d0721bSRobert Watson 
1669718c8510SRobert Watson 			perm.uid = ar->ar_arg_pipc_perm.pipc_uid;
1670718c8510SRobert Watson 			perm.gid = ar->ar_arg_pipc_perm.pipc_gid;
1671718c8510SRobert Watson 			perm.cuid = ar->ar_arg_pipc_perm.pipc_uid;
1672718c8510SRobert Watson 			perm.cgid = ar->ar_arg_pipc_perm.pipc_gid;
1673718c8510SRobert Watson 			perm.mode = ar->ar_arg_pipc_perm.pipc_mode;
1674718c8510SRobert Watson 			perm.seq = 0;
1675718c8510SRobert Watson 			perm.key = 0;
1676718c8510SRobert Watson 			tok = au_to_ipc_perm(&perm);
1677718c8510SRobert Watson 			kau_write(rec, tok);
1678718c8510SRobert Watson 		}
1679718c8510SRobert Watson 		break;
1680718c8510SRobert Watson 
1681718c8510SRobert Watson 	case AUE_SEMOPEN:
1682718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FFLAGS)) {
1683718c8510SRobert Watson 			tok = au_to_arg32(2, "flags", ar->ar_arg_fflags);
1684718c8510SRobert Watson 			kau_write(rec, tok);
1685718c8510SRobert Watson 		}
1686718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MODE)) {
1687718c8510SRobert Watson 			tok = au_to_arg32(3, "mode", ar->ar_arg_mode);
1688718c8510SRobert Watson 			kau_write(rec, tok);
1689718c8510SRobert Watson 		}
1690718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
1691718c8510SRobert Watson 			tok = au_to_arg32(4, "value", ar->ar_arg_value);
1692718c8510SRobert Watson 			kau_write(rec, tok);
1693718c8510SRobert Watson 		}
1694a760c0b2SRobert Watson 		/* FALLTHROUGH */
1695871499feSRobert Watson 
1696718c8510SRobert Watson 	case AUE_SEMUNLINK:
1697718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_TEXT)) {
1698718c8510SRobert Watson 			tok = au_to_text(ar->ar_arg_text);
1699718c8510SRobert Watson 			kau_write(rec, tok);
1700718c8510SRobert Watson 		}
1701718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_POSIX_IPC_PERM)) {
1702718c8510SRobert Watson 			struct ipc_perm perm;
170330d0721bSRobert Watson 
1704718c8510SRobert Watson 			perm.uid = ar->ar_arg_pipc_perm.pipc_uid;
1705718c8510SRobert Watson 			perm.gid = ar->ar_arg_pipc_perm.pipc_gid;
1706718c8510SRobert Watson 			perm.cuid = ar->ar_arg_pipc_perm.pipc_uid;
1707718c8510SRobert Watson 			perm.cgid = ar->ar_arg_pipc_perm.pipc_gid;
1708718c8510SRobert Watson 			perm.mode = ar->ar_arg_pipc_perm.pipc_mode;
1709718c8510SRobert Watson 			perm.seq = 0;
1710718c8510SRobert Watson 			perm.key = 0;
1711718c8510SRobert Watson 			tok = au_to_ipc_perm(&perm);
1712718c8510SRobert Watson 			kau_write(rec, tok);
1713718c8510SRobert Watson 		}
1714718c8510SRobert Watson 		break;
1715718c8510SRobert Watson 
1716718c8510SRobert Watson 	case AUE_SEMCLOSE:
1717718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_FD)) {
1718718c8510SRobert Watson 			tok = au_to_arg32(1, "sem", ar->ar_arg_fd);
1719718c8510SRobert Watson 			kau_write(rec, tok);
1720718c8510SRobert Watson 		}
1721718c8510SRobert Watson 		break;
1722718c8510SRobert Watson 
1723718c8510SRobert Watson 	case AUE_SYMLINK:
172480a044eaSPawel Jakub Dawidek 	case AUE_SYMLINKAT:
1725718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_TEXT)) {
1726718c8510SRobert Watson 			tok = au_to_text(ar->ar_arg_text);
1727718c8510SRobert Watson 			kau_write(rec, tok);
1728718c8510SRobert Watson 		}
172980a044eaSPawel Jakub Dawidek 		ATFD1_TOKENS(1);
1730718c8510SRobert Watson 		UPATH1_VNODE1_TOKENS;
1731718c8510SRobert Watson 		break;
1732718c8510SRobert Watson 
1733718c8510SRobert Watson 	case AUE_SYSCTL:
173493536b49SRobert Watson 	case AUE_SYSCTL_NONADMIN:
1735718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_CTLNAME | ARG_LEN)) {
1736718c8510SRobert Watson 			for (ctr = 0; ctr < ar->ar_arg_len; ctr++) {
1737871499feSRobert Watson 				tok = au_to_arg32(1, "name",
1738871499feSRobert Watson 				    ar->ar_arg_ctlname[ctr]);
1739718c8510SRobert Watson 				kau_write(rec, tok);
1740718c8510SRobert Watson 			}
1741718c8510SRobert Watson 		}
1742718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
1743718c8510SRobert Watson 			tok = au_to_arg32(5, "newval", ar->ar_arg_value);
1744718c8510SRobert Watson 			kau_write(rec, tok);
1745718c8510SRobert Watson 		}
1746718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_TEXT)) {
1747718c8510SRobert Watson 			tok = au_to_text(ar->ar_arg_text);
1748718c8510SRobert Watson 			kau_write(rec, tok);
1749718c8510SRobert Watson 		}
1750718c8510SRobert Watson 		break;
1751718c8510SRobert Watson 
1752718c8510SRobert Watson 	case AUE_UMASK:
1753718c8510SRobert Watson 		if (ARG_IS_VALID(kar, ARG_MASK)) {
1754718c8510SRobert Watson 			tok = au_to_arg32(1, "new mask", ar->ar_arg_mask);
1755718c8510SRobert Watson 			kau_write(rec, tok);
1756718c8510SRobert Watson 		}
1757718c8510SRobert Watson 		tok = au_to_arg32(0, "prev mask", ar->ar_retval);
1758718c8510SRobert Watson 		kau_write(rec, tok);
1759718c8510SRobert Watson 		break;
1760718c8510SRobert Watson 
1761718c8510SRobert Watson 	case AUE_WAIT4:
176298daa3e5SRobert Watson 	case AUE_WAIT6:
17632a565838SRobert Watson 		PROCESS_PID_TOKENS(1);
17642ef24ddeSRobert Watson 		if (ARG_IS_VALID(kar, ARG_VALUE)) {
17652a565838SRobert Watson 			tok = au_to_arg32(3, "options", ar->ar_arg_value);
17662ef24ddeSRobert Watson 			kau_write(rec, tok);
17672ef24ddeSRobert Watson 		}
1768718c8510SRobert Watson 		break;
1769718c8510SRobert Watson 
17702609222aSPawel Jakub Dawidek 	case AUE_CAP_RIGHTS_LIMIT:
1771778b0e42SJonathan Anderson 		/*
1772778b0e42SJonathan Anderson 		 * XXXRW/XXXJA: Would be nice to audit socket/etc information.
1773778b0e42SJonathan Anderson 		 */
1774778b0e42SJonathan Anderson 		FD_VNODE1_TOKENS;
1775778b0e42SJonathan Anderson 		if (ARG_IS_VALID(kar, ARG_RIGHTS)) {
17767008be5bSPawel Jakub Dawidek 			tok = au_to_rights(&ar->ar_arg_rights);
1777778b0e42SJonathan Anderson 			kau_write(rec, tok);
1778778b0e42SJonathan Anderson 		}
1779778b0e42SJonathan Anderson 		break;
1780778b0e42SJonathan Anderson 
17812609222aSPawel Jakub Dawidek 	case AUE_CAP_FCNTLS_GET:
17822609222aSPawel Jakub Dawidek 	case AUE_CAP_IOCTLS_GET:
17832609222aSPawel Jakub Dawidek 	case AUE_CAP_IOCTLS_LIMIT:
17842609222aSPawel Jakub Dawidek 	case AUE_CAP_RIGHTS_GET:
1785778b0e42SJonathan Anderson 		if (ARG_IS_VALID(kar, ARG_FD)) {
1786778b0e42SJonathan Anderson 			tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
1787778b0e42SJonathan Anderson 			kau_write(rec, tok);
1788778b0e42SJonathan Anderson 		}
1789778b0e42SJonathan Anderson 		break;
1790778b0e42SJonathan Anderson 
17912609222aSPawel Jakub Dawidek 	case AUE_CAP_FCNTLS_LIMIT:
17922609222aSPawel Jakub Dawidek 		FD_VNODE1_TOKENS;
17932609222aSPawel Jakub Dawidek 		if (ARG_IS_VALID(kar, ARG_FCNTL_RIGHTS)) {
17942609222aSPawel Jakub Dawidek 			tok = au_to_arg32(2, "fcntlrights",
17952609222aSPawel Jakub Dawidek 			    ar->ar_arg_fcntl_rights);
17962609222aSPawel Jakub Dawidek 			kau_write(rec, tok);
17972609222aSPawel Jakub Dawidek 		}
17982609222aSPawel Jakub Dawidek 		break;
17992609222aSPawel Jakub Dawidek 
1800778b0e42SJonathan Anderson 	case AUE_CAP_ENTER:
1801778b0e42SJonathan Anderson 	case AUE_CAP_GETMODE:
1802778b0e42SJonathan Anderson 		break;
1803778b0e42SJonathan Anderson 
1804b1c17068SChristian S.J. Peron 	case AUE_THR_NEW:
1805757a5642SChristian S.J. Peron 	case AUE_THR_KILL:
1806757a5642SChristian S.J. Peron 	case AUE_THR_EXIT:
1807b1c17068SChristian S.J. Peron 		break;
1808b1c17068SChristian S.J. Peron 
180942edcb00SRobert Watson 	case AUE_NULL:
1810871499feSRobert Watson 	default:
1811718c8510SRobert Watson 		printf("BSM conversion requested for unknown event %d\n",
1812718c8510SRobert Watson 		    ar->ar_event);
181330d0721bSRobert Watson 
181430d0721bSRobert Watson 		/*
181530d0721bSRobert Watson 		 * Write the subject token so it is properly freed here.
181630d0721bSRobert Watson 		 */
181714bc5135SChristian S.J. Peron 		if (jail_tok != NULL)
181814bc5135SChristian S.J. Peron 			kau_write(rec, jail_tok);
1819718c8510SRobert Watson 		kau_write(rec, subj_tok);
1820718c8510SRobert Watson 		kau_free(rec);
1821718c8510SRobert Watson 		return (BSM_NOAUDIT);
1822718c8510SRobert Watson 	}
1823718c8510SRobert Watson 
182414bc5135SChristian S.J. Peron 	if (jail_tok != NULL)
182514bc5135SChristian S.J. Peron 		kau_write(rec, jail_tok);
1826718c8510SRobert Watson 	kau_write(rec, subj_tok);
1827fcdb2e96SRobert Watson 	tok = au_to_return32(au_errno_to_bsm(ar->ar_errno), ar->ar_retval);
1828718c8510SRobert Watson 	kau_write(rec, tok);  /* Every record gets a return token */
1829718c8510SRobert Watson 
1830718c8510SRobert Watson 	kau_close(rec, &ar->ar_endtime, ar->ar_event);
1831718c8510SRobert Watson 
1832718c8510SRobert Watson 	*pau = rec;
1833718c8510SRobert Watson 	return (BSM_SUCCESS);
1834718c8510SRobert Watson }
1835718c8510SRobert Watson 
1836718c8510SRobert Watson /*
1837871499feSRobert Watson  * Verify that a record is a valid BSM record. This verification is simple
1838871499feSRobert Watson  * now, but may be expanded on sometime in the future.  Return 1 if the
1839871499feSRobert Watson  * record is good, 0 otherwise.
1840718c8510SRobert Watson  */
1841718c8510SRobert Watson int
bsm_rec_verify(void * rec)1842718c8510SRobert Watson bsm_rec_verify(void *rec)
1843718c8510SRobert Watson {
1844718c8510SRobert Watson 	char c = *(char *)rec;
1845871499feSRobert Watson 
1846718c8510SRobert Watson 	/*
1847718c8510SRobert Watson 	 * Check the token ID of the first token; it has to be a header
1848718c8510SRobert Watson 	 * token.
1849871499feSRobert Watson 	 *
1850871499feSRobert Watson 	 * XXXAUDIT There needs to be a token structure to map a token.
1851718c8510SRobert Watson 	 * XXXAUDIT 'Shouldn't be simply looking at the first char.
1852718c8510SRobert Watson 	 */
1853871499feSRobert Watson 	if ((c != AUT_HEADER32) && (c != AUT_HEADER32_EX) &&
1854871499feSRobert Watson 	    (c != AUT_HEADER64) && (c != AUT_HEADER64_EX))
1855718c8510SRobert Watson 		return (0);
1856718c8510SRobert Watson 	return (1);
1857718c8510SRobert Watson }
1858