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