152267f74SRobert Watson /*-
2aa772005SRobert Watson * Copyright (c) 2004-2009 Apple Inc.
3ca0716f5SRobert Watson * Copyright (c) 2005 SPARTA, Inc.
4ca0716f5SRobert Watson * Copyright (c) 2006 Robert N. M. Watson
5bc168a6cSRobert Watson * Copyright (c) 2006 Martin Voros
6ca0716f5SRobert Watson * All rights reserved.
7ca0716f5SRobert Watson *
8ca0716f5SRobert Watson * This code was developed in part by Robert N. M. Watson, Senior Principal
9ca0716f5SRobert Watson * Scientist, SPARTA, Inc.
10ca0716f5SRobert Watson *
11ca0716f5SRobert Watson * Redistribution and use in source and binary forms, with or without
12ca0716f5SRobert Watson * modification, are permitted provided that the following conditions
13ca0716f5SRobert Watson * are met:
14ca0716f5SRobert Watson * 1. Redistributions of source code must retain the above copyright
15ca0716f5SRobert Watson * notice, this list of conditions and the following disclaimer.
16ca0716f5SRobert Watson * 2. Redistributions in binary form must reproduce the above copyright
17ca0716f5SRobert Watson * notice, this list of conditions and the following disclaimer in the
18ca0716f5SRobert Watson * documentation and/or other materials provided with the distribution.
19aa772005SRobert Watson * 3. Neither the name of Apple Inc. ("Apple") nor the names of
20ca0716f5SRobert Watson * its contributors may be used to endorse or promote products derived
21ca0716f5SRobert Watson * from this software without specific prior written permission.
22ca0716f5SRobert Watson *
23ca0716f5SRobert Watson * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
24ca0716f5SRobert Watson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25ca0716f5SRobert Watson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26ca0716f5SRobert Watson * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
27ca0716f5SRobert Watson * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28ca0716f5SRobert Watson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29ca0716f5SRobert Watson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30ca0716f5SRobert Watson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31ca0716f5SRobert Watson * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32ca0716f5SRobert Watson * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33ca0716f5SRobert Watson * POSSIBILITY OF SUCH DAMAGE.
34ca0716f5SRobert Watson */
35ca0716f5SRobert Watson
36ca0716f5SRobert Watson #include <sys/types.h>
373b97a967SRobert Watson
383b97a967SRobert Watson #include <config/config.h>
39aa772005SRobert Watson
40aa772005SRobert Watson #ifdef USE_ENDIAN_H
413b97a967SRobert Watson #include <endian.h>
42aa772005SRobert Watson #endif
43aa772005SRobert Watson #ifdef USE_SYS_ENDIAN_H
44aa772005SRobert Watson #include <sys/endian.h>
45aa772005SRobert Watson #endif
46aa772005SRobert Watson #ifdef USE_MACHINE_ENDIAN_H
47aa772005SRobert Watson #include <machine/endian.h>
48aa772005SRobert Watson #endif
49aa772005SRobert Watson #ifdef USE_COMPAT_ENDIAN_H
503b97a967SRobert Watson #include <compat/endian.h>
51aa772005SRobert Watson #endif
52aa772005SRobert Watson #ifdef USE_COMPAT_ENDIAN_ENC_H
53aa772005SRobert Watson #include <compat/endian_enc.h>
54aa772005SRobert Watson #endif
55aa772005SRobert Watson
563b97a967SRobert Watson #ifdef HAVE_FULL_QUEUE_H
573b97a967SRobert Watson #include <sys/queue.h>
583b97a967SRobert Watson #else /* !HAVE_FULL_QUEUE_H */
593b97a967SRobert Watson #include <compat/queue.h>
603b97a967SRobert Watson #endif /* !HAVE_FULL_QUEUE_H */
613b97a967SRobert Watson
62ca0716f5SRobert Watson #include <sys/stat.h>
63ca0716f5SRobert Watson #include <sys/socket.h>
64ca0716f5SRobert Watson
65ca0716f5SRobert Watson #include <bsm/libbsm.h>
66ca0716f5SRobert Watson
67ca0716f5SRobert Watson #include <unistd.h>
68ca0716f5SRobert Watson #include <netinet/in.h>
69ca0716f5SRobert Watson #include <arpa/inet.h>
70ca0716f5SRobert Watson #include <errno.h>
71ca0716f5SRobert Watson #include <time.h>
72ca0716f5SRobert Watson #include <stdlib.h>
73ca0716f5SRobert Watson #include <stdio.h>
74ca0716f5SRobert Watson #include <string.h>
75ca0716f5SRobert Watson #include <pwd.h>
76ca0716f5SRobert Watson #include <grp.h>
77ca0716f5SRobert Watson
78aa772005SRobert Watson #ifdef HAVE_VIS
79aa772005SRobert Watson #include <vis.h>
80aa772005SRobert Watson #else
81aa772005SRobert Watson #include <compat/vis.h>
82aa772005SRobert Watson #endif
83aa772005SRobert Watson
84ca0716f5SRobert Watson #include <bsm/audit_internal.h>
85ca0716f5SRobert Watson
86ca0716f5SRobert Watson #define READ_TOKEN_BYTES(buf, len, dest, size, bytesread, err) do { \
8752267f74SRobert Watson if ((bytesread) + (size) > (u_int32_t)(len)) { \
8852267f74SRobert Watson (err) = 1; \
89ca0716f5SRobert Watson } else { \
9052267f74SRobert Watson memcpy((dest), (buf) + (bytesread), (size)); \
91ca0716f5SRobert Watson bytesread += size; \
92ca0716f5SRobert Watson } \
93ca0716f5SRobert Watson } while (0)
94ca0716f5SRobert Watson
95ca0716f5SRobert Watson #define READ_TOKEN_U_CHAR(buf, len, dest, bytesread, err) do { \
9652267f74SRobert Watson if ((bytesread) + sizeof(u_char) <= (u_int32_t)(len)) { \
9752267f74SRobert Watson (dest) = buf[(bytesread)]; \
9852267f74SRobert Watson (bytesread) += sizeof(u_char); \
99ca0716f5SRobert Watson } else \
10052267f74SRobert Watson (err) = 1; \
101ca0716f5SRobert Watson } while (0)
102ca0716f5SRobert Watson
103ca0716f5SRobert Watson #define READ_TOKEN_U_INT16(buf, len, dest, bytesread, err) do { \
10452267f74SRobert Watson if ((bytesread) + sizeof(u_int16_t) <= (u_int32_t)(len)) { \
10552267f74SRobert Watson (dest) = be16dec((buf) + (bytesread)); \
10652267f74SRobert Watson (bytesread) += sizeof(u_int16_t); \
107ca0716f5SRobert Watson } else \
10852267f74SRobert Watson (err) = 1; \
109ca0716f5SRobert Watson } while (0)
110ca0716f5SRobert Watson
111ca0716f5SRobert Watson #define READ_TOKEN_U_INT32(buf, len, dest, bytesread, err) do { \
11252267f74SRobert Watson if ((bytesread) + sizeof(u_int32_t) <= (u_int32_t)(len)) { \
11352267f74SRobert Watson (dest) = be32dec((buf) + (bytesread)); \
11452267f74SRobert Watson (bytesread) += sizeof(u_int32_t); \
115ca0716f5SRobert Watson } else \
11652267f74SRobert Watson (err) = 1; \
117ca0716f5SRobert Watson } while (0)
118ca0716f5SRobert Watson
119ca0716f5SRobert Watson #define READ_TOKEN_U_INT64(buf, len, dest, bytesread, err) do { \
12052267f74SRobert Watson if ((bytesread) + sizeof(u_int64_t) <= (u_int32_t)(len)) { \
12152267f74SRobert Watson dest = be64dec((buf) + (bytesread)); \
12252267f74SRobert Watson (bytesread) += sizeof(u_int64_t); \
123ca0716f5SRobert Watson } else \
12452267f74SRobert Watson (err) = 1; \
125ca0716f5SRobert Watson } while (0)
126ca0716f5SRobert Watson
127ca0716f5SRobert Watson #define SET_PTR(buf, len, ptr, size, bytesread, err) do { \
12852267f74SRobert Watson if ((bytesread) + (size) > (u_int32_t)(len)) \
129ca0716f5SRobert Watson (err) = 1; \
130ca0716f5SRobert Watson else { \
131ca0716f5SRobert Watson (ptr) = (buf) + (bytesread); \
132ca0716f5SRobert Watson (bytesread) += (size); \
133ca0716f5SRobert Watson } \
134ca0716f5SRobert Watson } while (0)
135ca0716f5SRobert Watson
136ca0716f5SRobert Watson /*
137bc168a6cSRobert Watson * XML option.
138bc168a6cSRobert Watson */
139bc168a6cSRobert Watson #define AU_PLAIN 0
140bc168a6cSRobert Watson #define AU_XML 1
141bc168a6cSRobert Watson
142bc168a6cSRobert Watson /*
143ca0716f5SRobert Watson * Prints the delimiter string.
144ca0716f5SRobert Watson */
145ca0716f5SRobert Watson static void
print_delim(FILE * fp,const char * del)146ca0716f5SRobert Watson print_delim(FILE *fp, const char *del)
147ca0716f5SRobert Watson {
148ca0716f5SRobert Watson
149ca0716f5SRobert Watson fprintf(fp, "%s", del);
150ca0716f5SRobert Watson }
151ca0716f5SRobert Watson
152ca0716f5SRobert Watson /*
153ca0716f5SRobert Watson * Prints a single byte in the given format.
154ca0716f5SRobert Watson */
155ca0716f5SRobert Watson static void
print_1_byte(FILE * fp,u_char val,const char * format)156ca0716f5SRobert Watson print_1_byte(FILE *fp, u_char val, const char *format)
157ca0716f5SRobert Watson {
158ca0716f5SRobert Watson
159ca0716f5SRobert Watson fprintf(fp, format, val);
160ca0716f5SRobert Watson }
161ca0716f5SRobert Watson
162ca0716f5SRobert Watson /*
163ca0716f5SRobert Watson * Print 2 bytes in the given format.
164ca0716f5SRobert Watson */
165ca0716f5SRobert Watson static void
print_2_bytes(FILE * fp,u_int16_t val,const char * format)166ca0716f5SRobert Watson print_2_bytes(FILE *fp, u_int16_t val, const char *format)
167ca0716f5SRobert Watson {
168ca0716f5SRobert Watson
169ca0716f5SRobert Watson fprintf(fp, format, val);
170ca0716f5SRobert Watson }
171ca0716f5SRobert Watson
172ca0716f5SRobert Watson /*
173ca0716f5SRobert Watson * Prints 4 bytes in the given format.
174ca0716f5SRobert Watson */
175ca0716f5SRobert Watson static void
print_4_bytes(FILE * fp,u_int32_t val,const char * format)176ca0716f5SRobert Watson print_4_bytes(FILE *fp, u_int32_t val, const char *format)
177ca0716f5SRobert Watson {
178ca0716f5SRobert Watson
179ca0716f5SRobert Watson fprintf(fp, format, val);
180ca0716f5SRobert Watson }
181ca0716f5SRobert Watson
182ca0716f5SRobert Watson /*
183ca0716f5SRobert Watson * Prints 8 bytes in the given format.
184ca0716f5SRobert Watson */
185ca0716f5SRobert Watson static void
print_8_bytes(FILE * fp,u_int64_t val,const char * format)186ca0716f5SRobert Watson print_8_bytes(FILE *fp, u_int64_t val, const char *format)
187ca0716f5SRobert Watson {
188ca0716f5SRobert Watson
189ca0716f5SRobert Watson fprintf(fp, format, val);
190ca0716f5SRobert Watson }
191ca0716f5SRobert Watson
192ca0716f5SRobert Watson /*
193ca0716f5SRobert Watson * Prints the given size of data bytes in hex.
194ca0716f5SRobert Watson */
195ca0716f5SRobert Watson static void
print_mem(FILE * fp,u_char * data,size_t len)196ca0716f5SRobert Watson print_mem(FILE *fp, u_char *data, size_t len)
197ca0716f5SRobert Watson {
19852267f74SRobert Watson u_int32_t i;
199ca0716f5SRobert Watson
200ca0716f5SRobert Watson if (len > 0) {
201ca0716f5SRobert Watson fprintf(fp, "0x");
202ca0716f5SRobert Watson for (i = 0; i < len; i++)
20306edd2f1SRobert Watson fprintf(fp, "%02x", data[i]);
204ca0716f5SRobert Watson }
205ca0716f5SRobert Watson }
206ca0716f5SRobert Watson
207ca0716f5SRobert Watson /*
208ca0716f5SRobert Watson * Prints the given data bytes as a string.
209ca0716f5SRobert Watson */
210ca0716f5SRobert Watson static void
print_string(FILE * fp,const char * str,size_t len)211bc168a6cSRobert Watson print_string(FILE *fp, const char *str, size_t len)
212ca0716f5SRobert Watson {
21352267f74SRobert Watson u_int32_t i;
214ca0716f5SRobert Watson
215ca0716f5SRobert Watson if (len > 0) {
216ca0716f5SRobert Watson for (i = 0; i < len; i++) {
217ca0716f5SRobert Watson if (str[i] != '\0')
218ca0716f5SRobert Watson fprintf(fp, "%c", str[i]);
219ca0716f5SRobert Watson }
220ca0716f5SRobert Watson }
221ca0716f5SRobert Watson }
222ca0716f5SRobert Watson
223ca0716f5SRobert Watson /*
224aa772005SRobert Watson * Prints the given data bytes as an XML-sanitized string.
225aa772005SRobert Watson */
226aa772005SRobert Watson static void
print_xml_string(FILE * fp,const char * str,size_t len)227aa772005SRobert Watson print_xml_string(FILE *fp, const char *str, size_t len)
228aa772005SRobert Watson {
229aa772005SRobert Watson u_int32_t i;
230aa772005SRobert Watson char visbuf[5];
231aa772005SRobert Watson
232aa772005SRobert Watson if (len == 0)
233aa772005SRobert Watson return;
234aa772005SRobert Watson
235aa772005SRobert Watson for (i = 0; i < len; i++) {
236aa772005SRobert Watson switch (str[i]) {
237aa772005SRobert Watson case '\0':
238aa772005SRobert Watson return;
239aa772005SRobert Watson
240aa772005SRobert Watson case '&':
241aa772005SRobert Watson (void) fprintf(fp, "&");
242aa772005SRobert Watson break;
243aa772005SRobert Watson
244aa772005SRobert Watson case '<':
245aa772005SRobert Watson (void) fprintf(fp, "<");
246aa772005SRobert Watson break;
247aa772005SRobert Watson
248aa772005SRobert Watson case '>':
249aa772005SRobert Watson (void) fprintf(fp, ">");
250aa772005SRobert Watson break;
251aa772005SRobert Watson
252aa772005SRobert Watson case '\"':
253aa772005SRobert Watson (void) fprintf(fp, """);
254aa772005SRobert Watson break;
255aa772005SRobert Watson
256aa772005SRobert Watson case '\'':
257aa772005SRobert Watson (void) fprintf(fp, "'");
258aa772005SRobert Watson break;
259aa772005SRobert Watson
260aa772005SRobert Watson default:
261aa772005SRobert Watson (void) vis(visbuf, str[i], VIS_CSTYLE, 0);
262aa772005SRobert Watson (void) fprintf(fp, "%s", visbuf);
263aa772005SRobert Watson break;
264aa772005SRobert Watson }
265aa772005SRobert Watson }
266aa772005SRobert Watson }
267aa772005SRobert Watson
268aa772005SRobert Watson /*
269b6a05070SChristian Brueffer * Prints the beginning of an attribute.
270bc168a6cSRobert Watson */
271bc168a6cSRobert Watson static void
open_attr(FILE * fp,const char * str)272bc168a6cSRobert Watson open_attr(FILE *fp, const char *str)
273bc168a6cSRobert Watson {
274bc168a6cSRobert Watson
275bc168a6cSRobert Watson fprintf(fp,"%s=\"", str);
276bc168a6cSRobert Watson }
277bc168a6cSRobert Watson
278bc168a6cSRobert Watson /*
279b6a05070SChristian Brueffer * Prints the end of an attribute.
280bc168a6cSRobert Watson */
281bc168a6cSRobert Watson static void
close_attr(FILE * fp)282bc168a6cSRobert Watson close_attr(FILE *fp)
283bc168a6cSRobert Watson {
284bc168a6cSRobert Watson
285bc168a6cSRobert Watson fprintf(fp,"\" ");
286bc168a6cSRobert Watson }
287bc168a6cSRobert Watson
288bc168a6cSRobert Watson /*
289b6a05070SChristian Brueffer * Prints the end of a tag.
290bc168a6cSRobert Watson */
291bc168a6cSRobert Watson static void
close_tag(FILE * fp,u_char type)292bc168a6cSRobert Watson close_tag(FILE *fp, u_char type)
293bc168a6cSRobert Watson {
294bc168a6cSRobert Watson
295bc168a6cSRobert Watson switch(type) {
296bc168a6cSRobert Watson case AUT_HEADER32:
297bc168a6cSRobert Watson fprintf(fp, ">");
298bc168a6cSRobert Watson break;
299bc168a6cSRobert Watson
300bc168a6cSRobert Watson case AUT_HEADER32_EX:
301bc168a6cSRobert Watson fprintf(fp, ">");
302bc168a6cSRobert Watson break;
303bc168a6cSRobert Watson
304bc168a6cSRobert Watson case AUT_HEADER64:
305bc168a6cSRobert Watson fprintf(fp, ">");
306bc168a6cSRobert Watson break;
307bc168a6cSRobert Watson
308bc168a6cSRobert Watson case AUT_HEADER64_EX:
309bc168a6cSRobert Watson fprintf(fp, ">");
310bc168a6cSRobert Watson break;
311bc168a6cSRobert Watson
312bc168a6cSRobert Watson case AUT_ARG32:
313bc168a6cSRobert Watson fprintf(fp, "/>");
314bc168a6cSRobert Watson break;
315bc168a6cSRobert Watson
316bc168a6cSRobert Watson case AUT_ARG64:
317bc168a6cSRobert Watson fprintf(fp, "/>");
318bc168a6cSRobert Watson break;
319bc168a6cSRobert Watson
320bc168a6cSRobert Watson case AUT_ATTR32:
321bc168a6cSRobert Watson fprintf(fp, "/>");
322bc168a6cSRobert Watson break;
323bc168a6cSRobert Watson
324bc168a6cSRobert Watson case AUT_ATTR64:
325bc168a6cSRobert Watson fprintf(fp, "/>");
326bc168a6cSRobert Watson break;
327bc168a6cSRobert Watson
328bc168a6cSRobert Watson case AUT_EXIT:
329bc168a6cSRobert Watson fprintf(fp, "/>");
330bc168a6cSRobert Watson break;
331bc168a6cSRobert Watson
332bc168a6cSRobert Watson case AUT_EXEC_ARGS:
333bc168a6cSRobert Watson fprintf(fp, "</exec_args>");
334bc168a6cSRobert Watson break;
335bc168a6cSRobert Watson
336bc168a6cSRobert Watson case AUT_EXEC_ENV:
337bc168a6cSRobert Watson fprintf(fp, "</exec_env>");
338bc168a6cSRobert Watson break;
339bc168a6cSRobert Watson
340bc168a6cSRobert Watson case AUT_OTHER_FILE32:
341bc168a6cSRobert Watson fprintf(fp, "</file>");
342bc168a6cSRobert Watson break;
343bc168a6cSRobert Watson
344bc168a6cSRobert Watson case AUT_NEWGROUPS:
345bc168a6cSRobert Watson fprintf(fp, "</group>");
346bc168a6cSRobert Watson break;
347bc168a6cSRobert Watson
348bc168a6cSRobert Watson case AUT_IN_ADDR:
349bc168a6cSRobert Watson fprintf(fp, "</ip_address>");
350bc168a6cSRobert Watson break;
351bc168a6cSRobert Watson
352bc168a6cSRobert Watson case AUT_IN_ADDR_EX:
353bc168a6cSRobert Watson fprintf(fp, "</ip_address>");
354bc168a6cSRobert Watson break;
355bc168a6cSRobert Watson
356bc168a6cSRobert Watson case AUT_IP:
357bc168a6cSRobert Watson fprintf(fp, "/>");
358bc168a6cSRobert Watson break;
359bc168a6cSRobert Watson
360bc168a6cSRobert Watson case AUT_IPC:
361bc168a6cSRobert Watson fprintf(fp, "/>");
362bc168a6cSRobert Watson break;
363bc168a6cSRobert Watson
364bc168a6cSRobert Watson case AUT_IPC_PERM:
365bc168a6cSRobert Watson fprintf(fp, "/>");
366bc168a6cSRobert Watson break;
367bc168a6cSRobert Watson
368bc168a6cSRobert Watson case AUT_IPORT:
369bc168a6cSRobert Watson fprintf(fp, "</ip_port>");
370bc168a6cSRobert Watson break;
371bc168a6cSRobert Watson
372bc168a6cSRobert Watson case AUT_OPAQUE:
373bc168a6cSRobert Watson fprintf(fp, "</opaque>");
374bc168a6cSRobert Watson break;
375bc168a6cSRobert Watson
376bc168a6cSRobert Watson case AUT_PATH:
377bc168a6cSRobert Watson fprintf(fp, "</path>");
378bc168a6cSRobert Watson break;
379bc168a6cSRobert Watson
380bc168a6cSRobert Watson case AUT_PROCESS32:
381bc168a6cSRobert Watson fprintf(fp, "/>");
382bc168a6cSRobert Watson break;
383bc168a6cSRobert Watson
384bc168a6cSRobert Watson case AUT_PROCESS32_EX:
385bc168a6cSRobert Watson fprintf(fp, "/>");
386bc168a6cSRobert Watson break;
387bc168a6cSRobert Watson
388bc168a6cSRobert Watson case AUT_PROCESS64:
389bc168a6cSRobert Watson fprintf(fp, "/>");
390bc168a6cSRobert Watson break;
391bc168a6cSRobert Watson
392bc168a6cSRobert Watson case AUT_PROCESS64_EX:
393bc168a6cSRobert Watson fprintf(fp, "/>");
394bc168a6cSRobert Watson break;
395bc168a6cSRobert Watson
396bc168a6cSRobert Watson case AUT_RETURN32:
397bc168a6cSRobert Watson fprintf(fp, "/>");
398bc168a6cSRobert Watson break;
399bc168a6cSRobert Watson
400bc168a6cSRobert Watson case AUT_RETURN64:
401bc168a6cSRobert Watson fprintf(fp, "/>");
402bc168a6cSRobert Watson break;
403bc168a6cSRobert Watson
404bc168a6cSRobert Watson case AUT_SEQ:
405bc168a6cSRobert Watson fprintf(fp, "/>");
406bc168a6cSRobert Watson break;
407bc168a6cSRobert Watson
408bc168a6cSRobert Watson case AUT_SOCKET:
409bc168a6cSRobert Watson fprintf(fp, "/>");
410bc168a6cSRobert Watson break;
411bc168a6cSRobert Watson
412bc168a6cSRobert Watson case AUT_SOCKINET32:
413bc168a6cSRobert Watson fprintf(fp, "/>");
414bc168a6cSRobert Watson break;
415bc168a6cSRobert Watson
416bc168a6cSRobert Watson case AUT_SOCKUNIX:
417bc168a6cSRobert Watson fprintf(fp, "/>");
418bc168a6cSRobert Watson break;
419bc168a6cSRobert Watson
420c0020399SRobert Watson case AUT_SOCKINET128:
421c0020399SRobert Watson fprintf(fp, "/>");
422c0020399SRobert Watson break;
423c0020399SRobert Watson
424bc168a6cSRobert Watson case AUT_SUBJECT32:
425bc168a6cSRobert Watson fprintf(fp, "/>");
426bc168a6cSRobert Watson break;
427bc168a6cSRobert Watson
428bc168a6cSRobert Watson case AUT_SUBJECT64:
429bc168a6cSRobert Watson fprintf(fp, "/>");
430bc168a6cSRobert Watson break;
431bc168a6cSRobert Watson
432bc168a6cSRobert Watson case AUT_SUBJECT32_EX:
433bc168a6cSRobert Watson fprintf(fp, "/>");
434bc168a6cSRobert Watson break;
435bc168a6cSRobert Watson
436bc168a6cSRobert Watson case AUT_SUBJECT64_EX:
437bc168a6cSRobert Watson fprintf(fp, "/>");
438bc168a6cSRobert Watson break;
439bc168a6cSRobert Watson
440bc168a6cSRobert Watson case AUT_TEXT:
441bc168a6cSRobert Watson fprintf(fp, "</text>");
442bc168a6cSRobert Watson break;
443bc168a6cSRobert Watson
444bc168a6cSRobert Watson case AUT_SOCKET_EX:
445bc168a6cSRobert Watson fprintf(fp, "/>");
446bc168a6cSRobert Watson break;
447bc168a6cSRobert Watson
448bc168a6cSRobert Watson case AUT_DATA:
449bc168a6cSRobert Watson fprintf(fp, "</arbitrary>");
450bc168a6cSRobert Watson break;
451bc168a6cSRobert Watson
452bc168a6cSRobert Watson case AUT_ZONENAME:
453bc168a6cSRobert Watson fprintf(fp, "/>");
454bc168a6cSRobert Watson break;
455bc168a6cSRobert Watson }
456bc168a6cSRobert Watson }
457bc168a6cSRobert Watson
458bc168a6cSRobert Watson /*
459ca0716f5SRobert Watson * Prints the token type in either the raw or the default form.
460ca0716f5SRobert Watson */
461ca0716f5SRobert Watson static void
print_tok_type(FILE * fp,u_char type,const char * tokname,int oflags)462aa772005SRobert Watson print_tok_type(FILE *fp, u_char type, const char *tokname, int oflags)
463ca0716f5SRobert Watson {
464ca0716f5SRobert Watson
465aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
466bc168a6cSRobert Watson switch(type) {
467bc168a6cSRobert Watson case AUT_HEADER32:
468bc168a6cSRobert Watson fprintf(fp, "<record ");
469bc168a6cSRobert Watson break;
470bc168a6cSRobert Watson
471bc168a6cSRobert Watson case AUT_HEADER32_EX:
472bc168a6cSRobert Watson fprintf(fp, "<record ");
473bc168a6cSRobert Watson break;
474bc168a6cSRobert Watson
475bc168a6cSRobert Watson case AUT_HEADER64:
476bc168a6cSRobert Watson fprintf(fp, "<record ");
477bc168a6cSRobert Watson break;
478bc168a6cSRobert Watson
479bc168a6cSRobert Watson case AUT_HEADER64_EX:
480bc168a6cSRobert Watson fprintf(fp, "<record ");
481bc168a6cSRobert Watson break;
482bc168a6cSRobert Watson
483bc168a6cSRobert Watson case AUT_TRAILER:
484bc168a6cSRobert Watson fprintf(fp, "</record>");
485bc168a6cSRobert Watson break;
486bc168a6cSRobert Watson
487bc168a6cSRobert Watson case AUT_ARG32:
488bc168a6cSRobert Watson fprintf(fp, "<argument ");
489bc168a6cSRobert Watson break;
490bc168a6cSRobert Watson
491bc168a6cSRobert Watson case AUT_ARG64:
492bc168a6cSRobert Watson fprintf(fp, "<argument ");
493bc168a6cSRobert Watson break;
494bc168a6cSRobert Watson
495bc168a6cSRobert Watson case AUT_ATTR32:
496bc168a6cSRobert Watson fprintf(fp, "<attribute ");
497bc168a6cSRobert Watson break;
498bc168a6cSRobert Watson
499bc168a6cSRobert Watson case AUT_ATTR64:
500bc168a6cSRobert Watson fprintf(fp, "<attribute ");
501bc168a6cSRobert Watson break;
502bc168a6cSRobert Watson
503bc168a6cSRobert Watson case AUT_EXIT:
504bc168a6cSRobert Watson fprintf(fp, "<exit ");
505bc168a6cSRobert Watson break;
506bc168a6cSRobert Watson
507bc168a6cSRobert Watson case AUT_EXEC_ARGS:
508bc168a6cSRobert Watson fprintf(fp, "<exec_args>");
509bc168a6cSRobert Watson break;
510bc168a6cSRobert Watson
511bc168a6cSRobert Watson case AUT_EXEC_ENV:
512bc168a6cSRobert Watson fprintf(fp, "<exec_env>");
513bc168a6cSRobert Watson break;
514bc168a6cSRobert Watson
515bc168a6cSRobert Watson case AUT_OTHER_FILE32:
516bc168a6cSRobert Watson fprintf(fp, "<file ");
517bc168a6cSRobert Watson break;
518bc168a6cSRobert Watson
519bc168a6cSRobert Watson case AUT_NEWGROUPS:
520bc168a6cSRobert Watson fprintf(fp, "<group>");
521bc168a6cSRobert Watson break;
522bc168a6cSRobert Watson
523bc168a6cSRobert Watson case AUT_IN_ADDR:
524bc168a6cSRobert Watson fprintf(fp, "<ip_address>");
525bc168a6cSRobert Watson break;
526bc168a6cSRobert Watson
527bc168a6cSRobert Watson case AUT_IN_ADDR_EX:
528bc168a6cSRobert Watson fprintf(fp, "<ip_address>");
529bc168a6cSRobert Watson break;
530bc168a6cSRobert Watson
531bc168a6cSRobert Watson case AUT_IP:
532bc168a6cSRobert Watson fprintf(fp, "<ip ");
533bc168a6cSRobert Watson break;
534bc168a6cSRobert Watson
535bc168a6cSRobert Watson case AUT_IPC:
536bc168a6cSRobert Watson fprintf(fp, "<IPC");
537bc168a6cSRobert Watson break;
538bc168a6cSRobert Watson
539bc168a6cSRobert Watson case AUT_IPC_PERM:
540bc168a6cSRobert Watson fprintf(fp, "<IPC_perm ");
541bc168a6cSRobert Watson break;
542bc168a6cSRobert Watson
543bc168a6cSRobert Watson case AUT_IPORT:
544bc168a6cSRobert Watson fprintf(fp, "<ip_port>");
545bc168a6cSRobert Watson break;
546bc168a6cSRobert Watson
547bc168a6cSRobert Watson case AUT_OPAQUE:
548bc168a6cSRobert Watson fprintf(fp, "<opaque>");
549bc168a6cSRobert Watson break;
550bc168a6cSRobert Watson
551bc168a6cSRobert Watson case AUT_PATH:
552bc168a6cSRobert Watson fprintf(fp, "<path>");
553bc168a6cSRobert Watson break;
554bc168a6cSRobert Watson
555bc168a6cSRobert Watson case AUT_PROCESS32:
556bc168a6cSRobert Watson fprintf(fp, "<process ");
557bc168a6cSRobert Watson break;
558bc168a6cSRobert Watson
559bc168a6cSRobert Watson case AUT_PROCESS32_EX:
560bc168a6cSRobert Watson fprintf(fp, "<process ");
561bc168a6cSRobert Watson break;
562bc168a6cSRobert Watson
563bc168a6cSRobert Watson case AUT_PROCESS64:
564bc168a6cSRobert Watson fprintf(fp, "<process ");
565bc168a6cSRobert Watson break;
566bc168a6cSRobert Watson
567bc168a6cSRobert Watson case AUT_PROCESS64_EX:
568bc168a6cSRobert Watson fprintf(fp, "<process ");
569bc168a6cSRobert Watson break;
570bc168a6cSRobert Watson
571bc168a6cSRobert Watson case AUT_RETURN32:
572bc168a6cSRobert Watson fprintf(fp, "<return ");
573bc168a6cSRobert Watson break;
574bc168a6cSRobert Watson
575bc168a6cSRobert Watson case AUT_RETURN64:
576bc168a6cSRobert Watson fprintf(fp, "<return ");
577bc168a6cSRobert Watson break;
578bc168a6cSRobert Watson
579bc168a6cSRobert Watson case AUT_SEQ:
580bc168a6cSRobert Watson fprintf(fp, "<sequence ");
581bc168a6cSRobert Watson break;
582bc168a6cSRobert Watson
583bc168a6cSRobert Watson case AUT_SOCKET:
584bc168a6cSRobert Watson fprintf(fp, "<socket ");
585bc168a6cSRobert Watson break;
586bc168a6cSRobert Watson
587bc168a6cSRobert Watson case AUT_SOCKINET32:
588c0020399SRobert Watson fprintf(fp, "<socket-inet ");
589bc168a6cSRobert Watson break;
590bc168a6cSRobert Watson
591bc168a6cSRobert Watson case AUT_SOCKUNIX:
592c0020399SRobert Watson fprintf(fp, "<socket-unix ");
593bc168a6cSRobert Watson break;
594bc168a6cSRobert Watson
595c0020399SRobert Watson case AUT_SOCKINET128:
596c0020399SRobert Watson fprintf(fp, "<socket-inet6 ");
597b6a05070SChristian Brueffer break;
598c0020399SRobert Watson
599bc168a6cSRobert Watson case AUT_SUBJECT32:
600bc168a6cSRobert Watson fprintf(fp, "<subject ");
601bc168a6cSRobert Watson break;
602bc168a6cSRobert Watson
603bc168a6cSRobert Watson case AUT_SUBJECT64:
604bc168a6cSRobert Watson fprintf(fp, "<subject ");
605bc168a6cSRobert Watson break;
606bc168a6cSRobert Watson
607bc168a6cSRobert Watson case AUT_SUBJECT32_EX:
608bc168a6cSRobert Watson fprintf(fp, "<subject ");
609bc168a6cSRobert Watson break;
610bc168a6cSRobert Watson
611bc168a6cSRobert Watson case AUT_SUBJECT64_EX:
612bc168a6cSRobert Watson fprintf(fp, "<subject ");
613bc168a6cSRobert Watson break;
614bc168a6cSRobert Watson
615bc168a6cSRobert Watson case AUT_TEXT:
616bc168a6cSRobert Watson fprintf(fp, "<text>");
617bc168a6cSRobert Watson break;
618bc168a6cSRobert Watson
619bc168a6cSRobert Watson case AUT_SOCKET_EX:
620bc168a6cSRobert Watson fprintf(fp, "<socket ");
621bc168a6cSRobert Watson break;
622bc168a6cSRobert Watson
623bc168a6cSRobert Watson case AUT_DATA:
624bc168a6cSRobert Watson fprintf(fp, "<arbitrary ");
625bc168a6cSRobert Watson break;
626bc168a6cSRobert Watson
627bc168a6cSRobert Watson case AUT_ZONENAME:
628bc168a6cSRobert Watson fprintf(fp, "<zone ");
629bc168a6cSRobert Watson break;
630bc168a6cSRobert Watson }
631bc168a6cSRobert Watson } else {
632aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
633ca0716f5SRobert Watson fprintf(fp, "%u", type);
634ca0716f5SRobert Watson else
635ca0716f5SRobert Watson fprintf(fp, "%s", tokname);
636ca0716f5SRobert Watson }
637bc168a6cSRobert Watson }
638ca0716f5SRobert Watson
639ca0716f5SRobert Watson /*
640ca0716f5SRobert Watson * Prints a user value.
641ca0716f5SRobert Watson */
642ca0716f5SRobert Watson static void
print_user(FILE * fp,u_int32_t usr,int oflags)643aa772005SRobert Watson print_user(FILE *fp, u_int32_t usr, int oflags)
644ca0716f5SRobert Watson {
645ca0716f5SRobert Watson struct passwd *pwent;
646ca0716f5SRobert Watson
647*ba10bfe5SEd Maste if (oflags & (AU_OFLAG_RAW | AU_OFLAG_NORESOLVE))
648ca0716f5SRobert Watson fprintf(fp, "%d", usr);
649ca0716f5SRobert Watson else {
650ca0716f5SRobert Watson pwent = getpwuid(usr);
651ca0716f5SRobert Watson if (pwent != NULL)
652ca0716f5SRobert Watson fprintf(fp, "%s", pwent->pw_name);
653ca0716f5SRobert Watson else
654ca0716f5SRobert Watson fprintf(fp, "%d", usr);
655ca0716f5SRobert Watson }
656ca0716f5SRobert Watson }
657ca0716f5SRobert Watson
658ca0716f5SRobert Watson /*
659ca0716f5SRobert Watson * Prints a group value.
660ca0716f5SRobert Watson */
661ca0716f5SRobert Watson static void
print_group(FILE * fp,u_int32_t grp,int oflags)662aa772005SRobert Watson print_group(FILE *fp, u_int32_t grp, int oflags)
663ca0716f5SRobert Watson {
664ca0716f5SRobert Watson struct group *grpent;
665ca0716f5SRobert Watson
666*ba10bfe5SEd Maste if (oflags & (AU_OFLAG_RAW | AU_OFLAG_NORESOLVE))
667ca0716f5SRobert Watson fprintf(fp, "%d", grp);
668ca0716f5SRobert Watson else {
669ca0716f5SRobert Watson grpent = getgrgid(grp);
670ca0716f5SRobert Watson if (grpent != NULL)
671ca0716f5SRobert Watson fprintf(fp, "%s", grpent->gr_name);
672ca0716f5SRobert Watson else
673ca0716f5SRobert Watson fprintf(fp, "%d", grp);
674ca0716f5SRobert Watson }
675ca0716f5SRobert Watson }
676ca0716f5SRobert Watson
677ca0716f5SRobert Watson /*
678ca0716f5SRobert Watson * Prints the event from the header token in either the short, default or raw
679ca0716f5SRobert Watson * form.
680ca0716f5SRobert Watson */
681ca0716f5SRobert Watson static void
print_event(FILE * fp,u_int16_t ev,int oflags)682aa772005SRobert Watson print_event(FILE *fp, u_int16_t ev, int oflags)
683ca0716f5SRobert Watson {
684ca0716f5SRobert Watson char event_ent_name[AU_EVENT_NAME_MAX];
685ca0716f5SRobert Watson char event_ent_desc[AU_EVENT_DESC_MAX];
686ca0716f5SRobert Watson struct au_event_ent e, *ep;
687ca0716f5SRobert Watson
688ca0716f5SRobert Watson bzero(&e, sizeof(e));
689ca0716f5SRobert Watson bzero(event_ent_name, sizeof(event_ent_name));
690ca0716f5SRobert Watson bzero(event_ent_desc, sizeof(event_ent_desc));
691ca0716f5SRobert Watson e.ae_name = event_ent_name;
692ca0716f5SRobert Watson e.ae_desc = event_ent_desc;
693ca0716f5SRobert Watson
694ca0716f5SRobert Watson ep = getauevnum_r(&e, ev);
695ca0716f5SRobert Watson if (ep == NULL) {
696ca0716f5SRobert Watson fprintf(fp, "%u", ev);
697ca0716f5SRobert Watson return;
698ca0716f5SRobert Watson }
699ca0716f5SRobert Watson
700aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
701ca0716f5SRobert Watson fprintf(fp, "%u", ev);
702aa772005SRobert Watson else if (oflags & AU_OFLAG_SHORT)
703ca0716f5SRobert Watson fprintf(fp, "%s", e.ae_name);
704ca0716f5SRobert Watson else
705ca0716f5SRobert Watson fprintf(fp, "%s", e.ae_desc);
706ca0716f5SRobert Watson }
707ca0716f5SRobert Watson
708ca0716f5SRobert Watson
709ca0716f5SRobert Watson /*
710ca0716f5SRobert Watson * Prints the event modifier from the header token in either the default or
711ca0716f5SRobert Watson * raw form.
712ca0716f5SRobert Watson */
713ca0716f5SRobert Watson static void
print_evmod(FILE * fp,u_int16_t evmod,int oflags)714aa772005SRobert Watson print_evmod(FILE *fp, u_int16_t evmod, int oflags)
715ca0716f5SRobert Watson {
716aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
717ca0716f5SRobert Watson fprintf(fp, "%u", evmod);
718ca0716f5SRobert Watson else
719ca0716f5SRobert Watson fprintf(fp, "%u", evmod);
720ca0716f5SRobert Watson }
721ca0716f5SRobert Watson
722ca0716f5SRobert Watson /*
723ca0716f5SRobert Watson * Prints seconds in the ctime format.
724ca0716f5SRobert Watson */
725ca0716f5SRobert Watson static void
print_sec32(FILE * fp,u_int32_t sec,int oflags)726aa772005SRobert Watson print_sec32(FILE *fp, u_int32_t sec, int oflags)
727ca0716f5SRobert Watson {
728ca0716f5SRobert Watson time_t timestamp;
729ca0716f5SRobert Watson char timestr[26];
730ca0716f5SRobert Watson
731aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
732ca0716f5SRobert Watson fprintf(fp, "%u", sec);
733ca0716f5SRobert Watson else {
734ca0716f5SRobert Watson timestamp = (time_t)sec;
735ca0716f5SRobert Watson ctime_r(×tamp, timestr);
736ca0716f5SRobert Watson timestr[24] = '\0'; /* No new line */
737ca0716f5SRobert Watson fprintf(fp, "%s", timestr);
738ca0716f5SRobert Watson }
739ca0716f5SRobert Watson }
740ca0716f5SRobert Watson
741ca0716f5SRobert Watson /*
742ca0716f5SRobert Watson * XXXRW: 64-bit token streams make use of 64-bit time stamps; since we
743ca0716f5SRobert Watson * assume a 32-bit time_t, we simply truncate for now.
744ca0716f5SRobert Watson */
745ca0716f5SRobert Watson static void
print_sec64(FILE * fp,u_int64_t sec,int oflags)746aa772005SRobert Watson print_sec64(FILE *fp, u_int64_t sec, int oflags)
747ca0716f5SRobert Watson {
748ca0716f5SRobert Watson time_t timestamp;
749ca0716f5SRobert Watson char timestr[26];
750ca0716f5SRobert Watson
751aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
752ca0716f5SRobert Watson fprintf(fp, "%u", (u_int32_t)sec);
753ca0716f5SRobert Watson else {
754ca0716f5SRobert Watson timestamp = (time_t)sec;
755ca0716f5SRobert Watson ctime_r(×tamp, timestr);
756ca0716f5SRobert Watson timestr[24] = '\0'; /* No new line */
757ca0716f5SRobert Watson fprintf(fp, "%s", timestr);
758ca0716f5SRobert Watson }
759ca0716f5SRobert Watson }
760ca0716f5SRobert Watson
761ca0716f5SRobert Watson /*
762ca0716f5SRobert Watson * Prints the excess milliseconds.
763ca0716f5SRobert Watson */
764ca0716f5SRobert Watson static void
print_msec32(FILE * fp,u_int32_t msec,int oflags)765aa772005SRobert Watson print_msec32(FILE *fp, u_int32_t msec, int oflags)
766ca0716f5SRobert Watson {
767aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
768ca0716f5SRobert Watson fprintf(fp, "%u", msec);
769ca0716f5SRobert Watson else
770ca0716f5SRobert Watson fprintf(fp, " + %u msec", msec);
771ca0716f5SRobert Watson }
772ca0716f5SRobert Watson
773ca0716f5SRobert Watson /*
774ca0716f5SRobert Watson * XXXRW: 64-bit token streams make use of 64-bit time stamps; since we assume
775ca0716f5SRobert Watson * a 32-bit msec, we simply truncate for now.
776ca0716f5SRobert Watson */
777ca0716f5SRobert Watson static void
print_msec64(FILE * fp,u_int64_t msec,int oflags)778aa772005SRobert Watson print_msec64(FILE *fp, u_int64_t msec, int oflags)
779ca0716f5SRobert Watson {
780ca0716f5SRobert Watson
781ca0716f5SRobert Watson msec &= 0xffffffff;
782aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
783ca0716f5SRobert Watson fprintf(fp, "%u", (u_int32_t)msec);
784ca0716f5SRobert Watson else
785ca0716f5SRobert Watson fprintf(fp, " + %u msec", (u_int32_t)msec);
786ca0716f5SRobert Watson }
787ca0716f5SRobert Watson
788ca0716f5SRobert Watson /*
789ca0716f5SRobert Watson * Prints a dotted form for the IP address.
790ca0716f5SRobert Watson */
791ca0716f5SRobert Watson static void
print_ip_address(FILE * fp,u_int32_t ip)792ca0716f5SRobert Watson print_ip_address(FILE *fp, u_int32_t ip)
793ca0716f5SRobert Watson {
794ca0716f5SRobert Watson struct in_addr ipaddr;
795ca0716f5SRobert Watson
796ca0716f5SRobert Watson ipaddr.s_addr = ip;
797ca0716f5SRobert Watson fprintf(fp, "%s", inet_ntoa(ipaddr));
798ca0716f5SRobert Watson }
799ca0716f5SRobert Watson
800ca0716f5SRobert Watson /*
801ca0716f5SRobert Watson * Prints a string value for the given ip address.
802ca0716f5SRobert Watson */
803ca0716f5SRobert Watson static void
print_ip_ex_address(FILE * fp,u_int32_t type,u_int32_t * ipaddr)804ca0716f5SRobert Watson print_ip_ex_address(FILE *fp, u_int32_t type, u_int32_t *ipaddr)
805ca0716f5SRobert Watson {
806ca0716f5SRobert Watson struct in_addr ipv4;
807ca0716f5SRobert Watson struct in6_addr ipv6;
808ca0716f5SRobert Watson char dst[INET6_ADDRSTRLEN];
809ca0716f5SRobert Watson
810ca0716f5SRobert Watson switch (type) {
811ca0716f5SRobert Watson case AU_IPv4:
812ca0716f5SRobert Watson ipv4.s_addr = (in_addr_t)(ipaddr[0]);
813ca0716f5SRobert Watson fprintf(fp, "%s", inet_ntop(AF_INET, &ipv4, dst,
814ca0716f5SRobert Watson INET6_ADDRSTRLEN));
815ca0716f5SRobert Watson break;
816ca0716f5SRobert Watson
817ca0716f5SRobert Watson case AU_IPv6:
8183b97a967SRobert Watson bcopy(ipaddr, &ipv6, sizeof(ipv6));
819ca0716f5SRobert Watson fprintf(fp, "%s", inet_ntop(AF_INET6, &ipv6, dst,
820ca0716f5SRobert Watson INET6_ADDRSTRLEN));
821ca0716f5SRobert Watson break;
822ca0716f5SRobert Watson
823ca0716f5SRobert Watson default:
824ca0716f5SRobert Watson fprintf(fp, "invalid");
825ca0716f5SRobert Watson }
826ca0716f5SRobert Watson }
827ca0716f5SRobert Watson
828ca0716f5SRobert Watson /*
829ca0716f5SRobert Watson * Prints return value as success or failure.
830ca0716f5SRobert Watson */
831ca0716f5SRobert Watson static void
print_retval(FILE * fp,u_char status,int oflags)832aa772005SRobert Watson print_retval(FILE *fp, u_char status, int oflags)
833ca0716f5SRobert Watson {
8347a0a89d2SRobert Watson int error;
8357a0a89d2SRobert Watson
836aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
837ca0716f5SRobert Watson fprintf(fp, "%u", status);
838ca0716f5SRobert Watson else {
8397a0a89d2SRobert Watson /*
8407a0a89d2SRobert Watson * Convert to a local error number and print the OS's version
8417a0a89d2SRobert Watson * of the error string if possible. We may want to provide
8427a0a89d2SRobert Watson * an au_strerror(3) in the future so that we can print
8437a0a89d2SRobert Watson * strings for non-local errors.
8447a0a89d2SRobert Watson */
8457a0a89d2SRobert Watson if (au_bsm_to_errno(status, &error) == 0) {
8467a0a89d2SRobert Watson if (error == 0)
847ca0716f5SRobert Watson fprintf(fp, "success");
848ca0716f5SRobert Watson else
8497a0a89d2SRobert Watson fprintf(fp, "failure : %s", strerror(error));
8507a0a89d2SRobert Watson } else
8517a0a89d2SRobert Watson fprintf(fp, "failure: Unknown error: %d", status);
852ca0716f5SRobert Watson }
853ca0716f5SRobert Watson }
854ca0716f5SRobert Watson
855ca0716f5SRobert Watson /*
856ca0716f5SRobert Watson * Prints the exit value.
857ca0716f5SRobert Watson */
858ca0716f5SRobert Watson static void
print_errval(FILE * fp,u_int32_t val)859ca0716f5SRobert Watson print_errval(FILE *fp, u_int32_t val)
860ca0716f5SRobert Watson {
861ca0716f5SRobert Watson
862ca0716f5SRobert Watson fprintf(fp, "Error %u", val);
863ca0716f5SRobert Watson }
864ca0716f5SRobert Watson
865ca0716f5SRobert Watson /*
866ca0716f5SRobert Watson * Prints IPC type.
867ca0716f5SRobert Watson */
868ca0716f5SRobert Watson static void
print_ipctype(FILE * fp,u_char type,int oflags)869aa772005SRobert Watson print_ipctype(FILE *fp, u_char type, int oflags)
870ca0716f5SRobert Watson {
871aa772005SRobert Watson if (oflags & AU_OFLAG_RAW)
872ca0716f5SRobert Watson fprintf(fp, "%u", type);
873ca0716f5SRobert Watson else {
874ca0716f5SRobert Watson if (type == AT_IPC_MSG)
875ca0716f5SRobert Watson fprintf(fp, "Message IPC");
876ca0716f5SRobert Watson else if (type == AT_IPC_SEM)
877ca0716f5SRobert Watson fprintf(fp, "Semaphore IPC");
878ca0716f5SRobert Watson else if (type == AT_IPC_SHM)
879ca0716f5SRobert Watson fprintf(fp, "Shared Memory IPC");
880ca0716f5SRobert Watson else
881ca0716f5SRobert Watson fprintf(fp, "%u", type);
882ca0716f5SRobert Watson }
883ca0716f5SRobert Watson }
884ca0716f5SRobert Watson
885ca0716f5SRobert Watson /*
886bc168a6cSRobert Watson * Print XML header.
887bc168a6cSRobert Watson */
888bc168a6cSRobert Watson void
au_print_xml_header(FILE * outfp)889bc168a6cSRobert Watson au_print_xml_header(FILE *outfp)
890bc168a6cSRobert Watson {
891bc168a6cSRobert Watson
892bc168a6cSRobert Watson fprintf(outfp, "<?xml version='1.0' ?>\n");
893bc168a6cSRobert Watson fprintf(outfp, "<audit>\n");
894bc168a6cSRobert Watson }
895bc168a6cSRobert Watson
896bc168a6cSRobert Watson /*
897bc168a6cSRobert Watson * Print XML footer.
898bc168a6cSRobert Watson */
899bc168a6cSRobert Watson void
au_print_xml_footer(FILE * outfp)900bc168a6cSRobert Watson au_print_xml_footer(FILE *outfp)
901bc168a6cSRobert Watson {
902bc168a6cSRobert Watson
903bc168a6cSRobert Watson fprintf(outfp, "</audit>\n");
904bc168a6cSRobert Watson }
905bc168a6cSRobert Watson
906bc168a6cSRobert Watson /*
907ca0716f5SRobert Watson * record byte count 4 bytes
908ca0716f5SRobert Watson * version # 1 byte [2]
909ca0716f5SRobert Watson * event type 2 bytes
910ca0716f5SRobert Watson * event modifier 2 bytes
911ca0716f5SRobert Watson * seconds of time 4 bytes/8 bytes (32-bit/64-bit value)
912ca0716f5SRobert Watson * milliseconds of time 4 bytes/8 bytes (32-bit/64-bit value)
913ca0716f5SRobert Watson */
914ca0716f5SRobert Watson static int
fetch_header32_tok(tokenstr_t * tok,u_char * buf,int len)915bc168a6cSRobert Watson fetch_header32_tok(tokenstr_t *tok, u_char *buf, int len)
916ca0716f5SRobert Watson {
917ca0716f5SRobert Watson int err = 0;
918ca0716f5SRobert Watson
919ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32.size, tok->len, err);
920ca0716f5SRobert Watson if (err)
921ca0716f5SRobert Watson return (-1);
922ca0716f5SRobert Watson
923ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.hdr32.version, tok->len, err);
924ca0716f5SRobert Watson if (err)
925ca0716f5SRobert Watson return (-1);
926ca0716f5SRobert Watson
927ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.hdr32.e_type, tok->len, err);
928ca0716f5SRobert Watson if (err)
929ca0716f5SRobert Watson return (-1);
930ca0716f5SRobert Watson
931ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.hdr32.e_mod, tok->len, err);
932ca0716f5SRobert Watson if (err)
933ca0716f5SRobert Watson return (-1);
934ca0716f5SRobert Watson
935ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32.s, tok->len, err);
936ca0716f5SRobert Watson if (err)
937ca0716f5SRobert Watson return (-1);
938ca0716f5SRobert Watson
939ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32.ms, tok->len, err);
940ca0716f5SRobert Watson if (err)
941ca0716f5SRobert Watson return (-1);
942ca0716f5SRobert Watson
943ca0716f5SRobert Watson return (0);
944ca0716f5SRobert Watson }
945ca0716f5SRobert Watson
946ca0716f5SRobert Watson static void
print_header32_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)947aa772005SRobert Watson print_header32_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
948ca0716f5SRobert Watson {
949ca0716f5SRobert Watson
950aa772005SRobert Watson print_tok_type(fp, tok->id, "header", oflags);
9519c994dd9SChristian Brueffer if (oflags & AU_OFLAG_XML) {
952bc168a6cSRobert Watson open_attr(fp, "version");
953bc168a6cSRobert Watson print_1_byte(fp, tok->tt.hdr32.version, "%u");
954bc168a6cSRobert Watson close_attr(fp);
955bc168a6cSRobert Watson open_attr(fp, "event");
956aa772005SRobert Watson print_event(fp, tok->tt.hdr32.e_type, oflags);
957bc168a6cSRobert Watson close_attr(fp);
958bc168a6cSRobert Watson open_attr(fp, "modifier");
959aa772005SRobert Watson print_evmod(fp, tok->tt.hdr32.e_mod, oflags);
960bc168a6cSRobert Watson close_attr(fp);
961bc168a6cSRobert Watson open_attr(fp, "time");
962aa772005SRobert Watson print_sec32(fp, tok->tt.hdr32.s, oflags);
963bc168a6cSRobert Watson close_attr(fp);
964bc168a6cSRobert Watson open_attr(fp, "msec");
965aa772005SRobert Watson print_msec32(fp, tok->tt.hdr32.ms, oflags);
966bc168a6cSRobert Watson close_attr(fp);
967bc168a6cSRobert Watson close_tag(fp, tok->id);
968bc168a6cSRobert Watson } else {
969ca0716f5SRobert Watson print_delim(fp, del);
970ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.hdr32.size, "%u");
971ca0716f5SRobert Watson print_delim(fp, del);
972ca0716f5SRobert Watson print_1_byte(fp, tok->tt.hdr32.version, "%u");
973ca0716f5SRobert Watson print_delim(fp, del);
974aa772005SRobert Watson print_event(fp, tok->tt.hdr32.e_type, oflags);
975ca0716f5SRobert Watson print_delim(fp, del);
976aa772005SRobert Watson print_evmod(fp, tok->tt.hdr32.e_mod, oflags);
977ca0716f5SRobert Watson print_delim(fp, del);
978aa772005SRobert Watson print_sec32(fp, tok->tt.hdr32.s, oflags);
979ca0716f5SRobert Watson print_delim(fp, del);
980aa772005SRobert Watson print_msec32(fp, tok->tt.hdr32.ms, oflags);
981ca0716f5SRobert Watson }
982bc168a6cSRobert Watson }
983ca0716f5SRobert Watson
984ca0716f5SRobert Watson /*
985ca0716f5SRobert Watson * The Solaris specifications for AUE_HEADER32_EX seem to differ a bit
986ca0716f5SRobert Watson * depending on the bit of the specifications found. The OpenSolaris source
987ca0716f5SRobert Watson * code uses a 4-byte address length, followed by some number of bytes of
988ca0716f5SRobert Watson * address data. This contrasts with the Solaris audit.log.5 man page, which
989ca0716f5SRobert Watson * specifies a 1-byte length field. We use the Solaris 10 definition so that
990ca0716f5SRobert Watson * we can parse audit trails from that system.
991ca0716f5SRobert Watson *
992ca0716f5SRobert Watson * record byte count 4 bytes
993ca0716f5SRobert Watson * version # 1 byte [2]
994ca0716f5SRobert Watson * event type 2 bytes
995ca0716f5SRobert Watson * event modifier 2 bytes
996ca0716f5SRobert Watson * address type/length 4 bytes
997ca0716f5SRobert Watson * [ Solaris man page: address type/length 1 byte]
998ca0716f5SRobert Watson * machine address 4 bytes/16 bytes (IPv4/IPv6 address)
999ca0716f5SRobert Watson * seconds of time 4 bytes/8 bytes (32/64-bits)
1000ca0716f5SRobert Watson * nanoseconds of time 4 bytes/8 bytes (32/64-bits)
1001ca0716f5SRobert Watson */
1002ca0716f5SRobert Watson static int
fetch_header32_ex_tok(tokenstr_t * tok,u_char * buf,int len)1003bc168a6cSRobert Watson fetch_header32_ex_tok(tokenstr_t *tok, u_char *buf, int len)
1004ca0716f5SRobert Watson {
1005ca0716f5SRobert Watson int err = 0;
1006ca0716f5SRobert Watson
1007ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32_ex.size, tok->len, err);
1008ca0716f5SRobert Watson if (err)
1009ca0716f5SRobert Watson return (-1);
1010ca0716f5SRobert Watson
1011ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.hdr32_ex.version, tok->len, err);
1012ca0716f5SRobert Watson if (err)
1013ca0716f5SRobert Watson return (-1);
1014ca0716f5SRobert Watson
1015ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.hdr32_ex.e_type, tok->len, err);
1016ca0716f5SRobert Watson if (err)
1017ca0716f5SRobert Watson return (-1);
1018ca0716f5SRobert Watson
1019ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.hdr32_ex.e_mod, tok->len, err);
1020ca0716f5SRobert Watson if (err)
1021ca0716f5SRobert Watson return (-1);
1022ca0716f5SRobert Watson
1023ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32_ex.ad_type, tok->len, err);
1024ca0716f5SRobert Watson if (err)
1025ca0716f5SRobert Watson return (-1);
1026ca0716f5SRobert Watson
1027ca0716f5SRobert Watson bzero(tok->tt.hdr32_ex.addr, sizeof(tok->tt.hdr32_ex.addr));
1028ca0716f5SRobert Watson switch (tok->tt.hdr32_ex.ad_type) {
1029ca0716f5SRobert Watson case AU_IPv4:
1030ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.hdr32_ex.addr[0],
1031ca0716f5SRobert Watson sizeof(tok->tt.hdr32_ex.addr[0]), tok->len, err);
1032ca0716f5SRobert Watson if (err)
1033ca0716f5SRobert Watson return (-1);
1034ca0716f5SRobert Watson break;
1035ca0716f5SRobert Watson
1036ca0716f5SRobert Watson case AU_IPv6:
1037ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, tok->tt.hdr32_ex.addr,
1038ca0716f5SRobert Watson sizeof(tok->tt.hdr32_ex.addr), tok->len, err);
1039ca0716f5SRobert Watson break;
1040ca0716f5SRobert Watson }
1041ca0716f5SRobert Watson
1042ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32_ex.s, tok->len, err);
1043ca0716f5SRobert Watson if (err)
1044ca0716f5SRobert Watson return (-1);
1045ca0716f5SRobert Watson
1046ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32_ex.ms, tok->len, err);
1047ca0716f5SRobert Watson if (err)
1048ca0716f5SRobert Watson return (-1);
1049ca0716f5SRobert Watson
1050ca0716f5SRobert Watson return (0);
1051ca0716f5SRobert Watson }
1052ca0716f5SRobert Watson
1053ca0716f5SRobert Watson static void
print_header32_ex_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1054aa772005SRobert Watson print_header32_ex_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1055ca0716f5SRobert Watson {
1056ca0716f5SRobert Watson
1057aa772005SRobert Watson print_tok_type(fp, tok->id, "header_ex", oflags);
1058aa772005SRobert Watson if (oflags & AU_OFLAG_RAW) {
1059bc168a6cSRobert Watson open_attr(fp, "version");
1060bc168a6cSRobert Watson print_1_byte(fp, tok->tt.hdr32_ex.version, "%u");
1061bc168a6cSRobert Watson close_attr(fp);
1062bc168a6cSRobert Watson open_attr(fp, "event");
1063aa772005SRobert Watson print_event(fp, tok->tt.hdr32_ex.e_type, oflags);
1064bc168a6cSRobert Watson close_attr(fp);
1065bc168a6cSRobert Watson open_attr(fp, "modifier");
1066aa772005SRobert Watson print_evmod(fp, tok->tt.hdr32_ex.e_mod, oflags);
1067bc168a6cSRobert Watson close_attr(fp);
106852267f74SRobert Watson open_attr(fp, "host");
1069bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.hdr32_ex.ad_type,
1070bc168a6cSRobert Watson tok->tt.hdr32_ex.addr);
107152267f74SRobert Watson close_attr(fp);
1072bc168a6cSRobert Watson open_attr(fp, "time");
1073aa772005SRobert Watson print_sec32(fp, tok->tt.hdr32_ex.s, oflags);
1074bc168a6cSRobert Watson close_attr(fp);
1075bc168a6cSRobert Watson open_attr(fp, "msec");
1076aa772005SRobert Watson print_msec32(fp, tok->tt.hdr32_ex.ms, oflags);
1077bc168a6cSRobert Watson close_attr(fp);
1078bc168a6cSRobert Watson close_tag(fp, tok->id);
1079bc168a6cSRobert Watson } else {
1080ca0716f5SRobert Watson print_delim(fp, del);
1081ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.hdr32_ex.size, "%u");
1082ca0716f5SRobert Watson print_delim(fp, del);
1083ca0716f5SRobert Watson print_1_byte(fp, tok->tt.hdr32_ex.version, "%u");
1084ca0716f5SRobert Watson print_delim(fp, del);
1085aa772005SRobert Watson print_event(fp, tok->tt.hdr32_ex.e_type, oflags);
1086ca0716f5SRobert Watson print_delim(fp, del);
1087aa772005SRobert Watson print_evmod(fp, tok->tt.hdr32_ex.e_mod, oflags);
1088ca0716f5SRobert Watson print_delim(fp, del);
1089ca0716f5SRobert Watson print_ip_ex_address(fp, tok->tt.hdr32_ex.ad_type,
1090ca0716f5SRobert Watson tok->tt.hdr32_ex.addr);
1091ca0716f5SRobert Watson print_delim(fp, del);
1092aa772005SRobert Watson print_sec32(fp, tok->tt.hdr32_ex.s, oflags);
1093ca0716f5SRobert Watson print_delim(fp, del);
1094aa772005SRobert Watson print_msec32(fp, tok->tt.hdr32_ex.ms, oflags);
1095ca0716f5SRobert Watson }
1096bc168a6cSRobert Watson }
1097ca0716f5SRobert Watson
1098ca0716f5SRobert Watson /*
1099ca0716f5SRobert Watson * record byte count 4 bytes
1100ca0716f5SRobert Watson * event type 2 bytes
1101ca0716f5SRobert Watson * event modifier 2 bytes
1102ca0716f5SRobert Watson * seconds of time 4 bytes/8 bytes (32-bit/64-bit value)
1103ca0716f5SRobert Watson * milliseconds of time 4 bytes/8 bytes (32-bit/64-bit value)
1104ca0716f5SRobert Watson * version #
1105ca0716f5SRobert Watson */
1106ca0716f5SRobert Watson static int
fetch_header64_tok(tokenstr_t * tok,u_char * buf,int len)1107bc168a6cSRobert Watson fetch_header64_tok(tokenstr_t *tok, u_char *buf, int len)
1108ca0716f5SRobert Watson {
1109ca0716f5SRobert Watson int err = 0;
1110ca0716f5SRobert Watson
1111ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr64.size, tok->len, err);
1112ca0716f5SRobert Watson if (err)
1113ca0716f5SRobert Watson return (-1);
1114ca0716f5SRobert Watson
1115ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.hdr64.version, tok->len, err);
1116ca0716f5SRobert Watson if (err)
1117ca0716f5SRobert Watson return (-1);
1118ca0716f5SRobert Watson
1119ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.hdr64.e_type, tok->len, err);
1120ca0716f5SRobert Watson if (err)
1121ca0716f5SRobert Watson return (-1);
1122ca0716f5SRobert Watson
1123ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.hdr64.e_mod, tok->len, err);
1124ca0716f5SRobert Watson if (err)
1125ca0716f5SRobert Watson return (-1);
1126ca0716f5SRobert Watson
1127ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.hdr64.s, tok->len, err);
1128ca0716f5SRobert Watson if (err)
1129ca0716f5SRobert Watson return (-1);
1130ca0716f5SRobert Watson
1131ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.hdr64.ms, tok->len, err);
1132ca0716f5SRobert Watson if (err)
1133ca0716f5SRobert Watson return (-1);
1134ca0716f5SRobert Watson
1135ca0716f5SRobert Watson return (0);
1136ca0716f5SRobert Watson }
1137ca0716f5SRobert Watson
1138ca0716f5SRobert Watson static void
print_header64_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1139aa772005SRobert Watson print_header64_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1140ca0716f5SRobert Watson {
1141ca0716f5SRobert Watson
1142aa772005SRobert Watson print_tok_type(fp, tok->id, "header", oflags);
1143aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1144bc168a6cSRobert Watson open_attr(fp, "version");
1145bc168a6cSRobert Watson print_1_byte(fp, tok->tt.hdr64.version, "%u");
1146bc168a6cSRobert Watson close_attr(fp);
1147bc168a6cSRobert Watson open_attr(fp, "event");
1148aa772005SRobert Watson print_event(fp, tok->tt.hdr64.e_type, oflags);
1149bc168a6cSRobert Watson close_attr(fp);
1150bc168a6cSRobert Watson open_attr(fp, "modifier");
1151aa772005SRobert Watson print_evmod(fp, tok->tt.hdr64.e_mod, oflags);
1152bc168a6cSRobert Watson close_attr(fp);
1153bc168a6cSRobert Watson open_attr(fp, "time");
1154aa772005SRobert Watson print_sec64(fp, tok->tt.hdr64.s, oflags);
1155bc168a6cSRobert Watson close_attr(fp);
1156bc168a6cSRobert Watson open_attr(fp, "msec");
1157aa772005SRobert Watson print_msec64(fp, tok->tt.hdr64.ms, oflags);
1158bc168a6cSRobert Watson close_attr(fp);
1159bc168a6cSRobert Watson close_tag(fp, tok->id);
1160bc168a6cSRobert Watson } else {
1161ca0716f5SRobert Watson print_delim(fp, del);
1162ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.hdr64.size, "%u");
1163ca0716f5SRobert Watson print_delim(fp, del);
1164ca0716f5SRobert Watson print_1_byte(fp, tok->tt.hdr64.version, "%u");
1165ca0716f5SRobert Watson print_delim(fp, del);
1166aa772005SRobert Watson print_event(fp, tok->tt.hdr64.e_type, oflags);
1167ca0716f5SRobert Watson print_delim(fp, del);
1168aa772005SRobert Watson print_evmod(fp, tok->tt.hdr64.e_mod, oflags);
1169ca0716f5SRobert Watson print_delim(fp, del);
1170aa772005SRobert Watson print_sec64(fp, tok->tt.hdr64.s, oflags);
1171ca0716f5SRobert Watson print_delim(fp, del);
1172aa772005SRobert Watson print_msec64(fp, tok->tt.hdr64.ms, oflags);
1173ca0716f5SRobert Watson }
1174bc168a6cSRobert Watson }
1175bc168a6cSRobert Watson
1176ca0716f5SRobert Watson /*
1177ca0716f5SRobert Watson * record byte count 4 bytes
1178ca0716f5SRobert Watson * version # 1 byte [2]
1179ca0716f5SRobert Watson * event type 2 bytes
1180ca0716f5SRobert Watson * event modifier 2 bytes
1181ca0716f5SRobert Watson * address type/length 4 bytes
1182ca0716f5SRobert Watson * [ Solaris man page: address type/length 1 byte]
1183ca0716f5SRobert Watson * machine address 4 bytes/16 bytes (IPv4/IPv6 address)
1184ca0716f5SRobert Watson * seconds of time 4 bytes/8 bytes (32/64-bits)
1185ca0716f5SRobert Watson * nanoseconds of time 4 bytes/8 bytes (32/64-bits)
1186ca0716f5SRobert Watson *
1187ca0716f5SRobert Watson * XXXAUDIT: See comment by fetch_header32_ex_tok() for details on the
1188ca0716f5SRobert Watson * accuracy of the BSM spec.
1189ca0716f5SRobert Watson */
1190ca0716f5SRobert Watson static int
fetch_header64_ex_tok(tokenstr_t * tok,u_char * buf,int len)1191bc168a6cSRobert Watson fetch_header64_ex_tok(tokenstr_t *tok, u_char *buf, int len)
1192ca0716f5SRobert Watson {
1193ca0716f5SRobert Watson int err = 0;
1194ca0716f5SRobert Watson
1195ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr64_ex.size, tok->len, err);
1196ca0716f5SRobert Watson if (err)
1197ca0716f5SRobert Watson return (-1);
1198ca0716f5SRobert Watson
1199ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.hdr64_ex.version, tok->len, err);
1200ca0716f5SRobert Watson if (err)
1201ca0716f5SRobert Watson return (-1);
1202ca0716f5SRobert Watson
1203ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.hdr64_ex.e_type, tok->len, err);
1204ca0716f5SRobert Watson if (err)
1205ca0716f5SRobert Watson return (-1);
1206ca0716f5SRobert Watson
1207ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.hdr64_ex.e_mod, tok->len, err);
1208ca0716f5SRobert Watson if (err)
1209ca0716f5SRobert Watson return (-1);
1210ca0716f5SRobert Watson
1211ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.hdr64_ex.ad_type, tok->len, err);
1212ca0716f5SRobert Watson if (err)
1213ca0716f5SRobert Watson return (-1);
1214ca0716f5SRobert Watson
1215ca0716f5SRobert Watson bzero(tok->tt.hdr64_ex.addr, sizeof(tok->tt.hdr64_ex.addr));
1216ca0716f5SRobert Watson switch (tok->tt.hdr64_ex.ad_type) {
1217ca0716f5SRobert Watson case AU_IPv4:
1218ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.hdr64_ex.addr[0],
1219ca0716f5SRobert Watson sizeof(tok->tt.hdr64_ex.addr[0]), tok->len, err);
1220ca0716f5SRobert Watson if (err)
1221ca0716f5SRobert Watson return (-1);
1222ca0716f5SRobert Watson break;
1223ca0716f5SRobert Watson
1224ca0716f5SRobert Watson case AU_IPv6:
1225ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, tok->tt.hdr64_ex.addr,
1226ca0716f5SRobert Watson sizeof(tok->tt.hdr64_ex.addr), tok->len, err);
1227ca0716f5SRobert Watson break;
1228ca0716f5SRobert Watson }
1229ca0716f5SRobert Watson
1230ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.hdr64_ex.s, tok->len, err);
1231ca0716f5SRobert Watson if (err)
1232ca0716f5SRobert Watson return (-1);
1233ca0716f5SRobert Watson
1234ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.hdr64_ex.ms, tok->len, err);
1235ca0716f5SRobert Watson if (err)
1236ca0716f5SRobert Watson return (-1);
1237ca0716f5SRobert Watson
1238ca0716f5SRobert Watson return (0);
1239ca0716f5SRobert Watson }
1240ca0716f5SRobert Watson
1241ca0716f5SRobert Watson static void
print_header64_ex_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1242aa772005SRobert Watson print_header64_ex_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1243ca0716f5SRobert Watson {
1244ca0716f5SRobert Watson
1245aa772005SRobert Watson print_tok_type(fp, tok->id, "header_ex", oflags);
1246aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1247bc168a6cSRobert Watson open_attr(fp, "version");
1248bc168a6cSRobert Watson print_1_byte(fp, tok->tt.hdr64_ex.version, "%u");
1249bc168a6cSRobert Watson close_attr(fp);
1250bc168a6cSRobert Watson open_attr(fp, "event");
1251aa772005SRobert Watson print_event(fp, tok->tt.hdr64_ex.e_type, oflags);
1252bc168a6cSRobert Watson close_attr(fp);
1253bc168a6cSRobert Watson open_attr(fp, "modifier");
1254aa772005SRobert Watson print_evmod(fp, tok->tt.hdr64_ex.e_mod, oflags);
1255bc168a6cSRobert Watson close_attr(fp);
125652267f74SRobert Watson open_attr(fp, "host");
1257bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.hdr64_ex.ad_type,
1258bc168a6cSRobert Watson tok->tt.hdr64_ex.addr);
125952267f74SRobert Watson close_attr(fp);
1260bc168a6cSRobert Watson open_attr(fp, "time");
1261aa772005SRobert Watson print_sec64(fp, tok->tt.hdr64_ex.s, oflags);
1262bc168a6cSRobert Watson close_attr(fp);
1263bc168a6cSRobert Watson open_attr(fp, "msec");
1264aa772005SRobert Watson print_msec64(fp, tok->tt.hdr64_ex.ms, oflags);
1265bc168a6cSRobert Watson close_attr(fp);
1266bc168a6cSRobert Watson close_tag(fp, tok->id);
1267bc168a6cSRobert Watson } else {
1268ca0716f5SRobert Watson print_delim(fp, del);
1269ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.hdr64_ex.size, "%u");
1270ca0716f5SRobert Watson print_delim(fp, del);
1271ca0716f5SRobert Watson print_1_byte(fp, tok->tt.hdr64_ex.version, "%u");
1272ca0716f5SRobert Watson print_delim(fp, del);
1273aa772005SRobert Watson print_event(fp, tok->tt.hdr64_ex.e_type, oflags);
1274ca0716f5SRobert Watson print_delim(fp, del);
1275aa772005SRobert Watson print_evmod(fp, tok->tt.hdr64_ex.e_mod, oflags);
1276ca0716f5SRobert Watson print_delim(fp, del);
1277ca0716f5SRobert Watson print_ip_ex_address(fp, tok->tt.hdr64_ex.ad_type,
1278ca0716f5SRobert Watson tok->tt.hdr64_ex.addr);
1279ca0716f5SRobert Watson print_delim(fp, del);
1280aa772005SRobert Watson print_sec64(fp, tok->tt.hdr64_ex.s, oflags);
1281ca0716f5SRobert Watson print_delim(fp, del);
1282aa772005SRobert Watson print_msec64(fp, tok->tt.hdr64_ex.ms, oflags);
1283ca0716f5SRobert Watson }
1284bc168a6cSRobert Watson }
1285ca0716f5SRobert Watson
1286ca0716f5SRobert Watson /*
1287ca0716f5SRobert Watson * trailer magic 2 bytes
1288ca0716f5SRobert Watson * record size 4 bytes
1289ca0716f5SRobert Watson */
1290ca0716f5SRobert Watson static int
fetch_trailer_tok(tokenstr_t * tok,u_char * buf,int len)1291bc168a6cSRobert Watson fetch_trailer_tok(tokenstr_t *tok, u_char *buf, int len)
1292ca0716f5SRobert Watson {
1293ca0716f5SRobert Watson int err = 0;
1294ca0716f5SRobert Watson
1295ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.trail.magic, tok->len, err);
1296ca0716f5SRobert Watson if (err)
1297ca0716f5SRobert Watson return (-1);
1298ca0716f5SRobert Watson
1299ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.trail.count, tok->len, err);
1300ca0716f5SRobert Watson if (err)
1301ca0716f5SRobert Watson return (-1);
1302ca0716f5SRobert Watson
1303ca0716f5SRobert Watson return (0);
1304ca0716f5SRobert Watson }
1305ca0716f5SRobert Watson
1306ca0716f5SRobert Watson static void
print_trailer_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1307aa772005SRobert Watson print_trailer_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1308ca0716f5SRobert Watson {
1309ca0716f5SRobert Watson
1310aa772005SRobert Watson print_tok_type(fp, tok->id, "trailer", oflags);
1311aa772005SRobert Watson if (!(oflags & AU_OFLAG_XML)) {
1312ca0716f5SRobert Watson print_delim(fp, del);
1313ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.trail.count, "%u");
1314ca0716f5SRobert Watson }
1315bc168a6cSRobert Watson }
1316ca0716f5SRobert Watson
1317ca0716f5SRobert Watson /*
1318ca0716f5SRobert Watson * argument # 1 byte
1319ca0716f5SRobert Watson * argument value 4 bytes/8 bytes (32-bit/64-bit value)
1320ca0716f5SRobert Watson * text length 2 bytes
1321ca0716f5SRobert Watson * text N bytes + 1 terminating NULL byte
1322ca0716f5SRobert Watson */
1323ca0716f5SRobert Watson static int
fetch_arg32_tok(tokenstr_t * tok,u_char * buf,int len)1324bc168a6cSRobert Watson fetch_arg32_tok(tokenstr_t *tok, u_char *buf, int len)
1325ca0716f5SRobert Watson {
1326ca0716f5SRobert Watson int err = 0;
1327ca0716f5SRobert Watson
1328ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.arg32.no, tok->len, err);
1329ca0716f5SRobert Watson if (err)
1330ca0716f5SRobert Watson return (-1);
1331ca0716f5SRobert Watson
1332ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.arg32.val, tok->len, err);
1333ca0716f5SRobert Watson if (err)
1334ca0716f5SRobert Watson return (-1);
1335ca0716f5SRobert Watson
1336ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.arg32.len, tok->len, err);
1337ca0716f5SRobert Watson if (err)
1338ca0716f5SRobert Watson return (-1);
1339ca0716f5SRobert Watson
1340bc168a6cSRobert Watson SET_PTR((char*)buf, len, tok->tt.arg32.text, tok->tt.arg32.len,
1341bc168a6cSRobert Watson tok->len, err);
1342ca0716f5SRobert Watson if (err)
1343ca0716f5SRobert Watson return (-1);
1344ca0716f5SRobert Watson
1345ca0716f5SRobert Watson return (0);
1346ca0716f5SRobert Watson }
1347ca0716f5SRobert Watson
1348ca0716f5SRobert Watson static void
print_arg32_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1349aa772005SRobert Watson print_arg32_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1350ca0716f5SRobert Watson {
1351ca0716f5SRobert Watson
1352aa772005SRobert Watson print_tok_type(fp, tok->id, "argument", oflags);
1353aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1354bc168a6cSRobert Watson open_attr(fp, "arg-num");
1355bc168a6cSRobert Watson print_1_byte(fp, tok->tt.arg32.no, "%u");
1356bc168a6cSRobert Watson close_attr(fp);
1357bc168a6cSRobert Watson open_attr(fp, "value");
1358bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.arg32.val, "0x%x");
1359bc168a6cSRobert Watson close_attr(fp);
1360bc168a6cSRobert Watson open_attr(fp, "desc");
1361bc168a6cSRobert Watson print_string(fp, tok->tt.arg32.text, tok->tt.arg32.len);
1362bc168a6cSRobert Watson close_attr(fp);
1363bc168a6cSRobert Watson close_tag(fp, tok->id);
1364bc168a6cSRobert Watson } else {
1365ca0716f5SRobert Watson print_delim(fp, del);
1366ca0716f5SRobert Watson print_1_byte(fp, tok->tt.arg32.no, "%u");
1367ca0716f5SRobert Watson print_delim(fp, del);
136822ccb20dSRobert Watson print_4_bytes(fp, tok->tt.arg32.val, "0x%x");
1369ca0716f5SRobert Watson print_delim(fp, del);
13700814440eSRobert Watson print_string(fp, tok->tt.arg32.text, tok->tt.arg32.len);
1371bc168a6cSRobert Watson }
1372ca0716f5SRobert Watson }
1373ca0716f5SRobert Watson
1374ca0716f5SRobert Watson static int
fetch_arg64_tok(tokenstr_t * tok,u_char * buf,int len)1375bc168a6cSRobert Watson fetch_arg64_tok(tokenstr_t *tok, u_char *buf, int len)
1376ca0716f5SRobert Watson {
1377ca0716f5SRobert Watson int err = 0;
1378ca0716f5SRobert Watson
1379ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.arg64.no, tok->len, err);
1380ca0716f5SRobert Watson if (err)
1381ca0716f5SRobert Watson return (-1);
1382ca0716f5SRobert Watson
1383ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.arg64.val, tok->len, err);
1384ca0716f5SRobert Watson if (err)
1385ca0716f5SRobert Watson return (-1);
1386ca0716f5SRobert Watson
1387ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.arg64.len, tok->len, err);
1388ca0716f5SRobert Watson if (err)
1389ca0716f5SRobert Watson return (-1);
1390ca0716f5SRobert Watson
1391bc168a6cSRobert Watson SET_PTR((char*)buf, len, tok->tt.arg64.text, tok->tt.arg64.len,
1392bc168a6cSRobert Watson tok->len, err);
1393ca0716f5SRobert Watson if (err)
1394ca0716f5SRobert Watson return (-1);
1395ca0716f5SRobert Watson
1396ca0716f5SRobert Watson return (0);
1397ca0716f5SRobert Watson }
1398ca0716f5SRobert Watson
1399ca0716f5SRobert Watson static void
print_arg64_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1400aa772005SRobert Watson print_arg64_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1401ca0716f5SRobert Watson {
1402ca0716f5SRobert Watson
1403aa772005SRobert Watson print_tok_type(fp, tok->id, "argument", oflags);
1404aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1405bc168a6cSRobert Watson open_attr(fp, "arg-num");
1406bc168a6cSRobert Watson print_1_byte(fp, tok->tt.arg64.no, "%u");
1407bc168a6cSRobert Watson close_attr(fp);
1408bc168a6cSRobert Watson open_attr(fp, "value");
1409bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.arg64.val, "0x%llx");
1410bc168a6cSRobert Watson close_attr(fp);
1411bc168a6cSRobert Watson open_attr(fp, "desc");
1412bc168a6cSRobert Watson print_string(fp, tok->tt.arg64.text, tok->tt.arg64.len);
1413bc168a6cSRobert Watson close_attr(fp);
1414bc168a6cSRobert Watson close_tag(fp, tok->id);
1415bc168a6cSRobert Watson } else {
1416ca0716f5SRobert Watson print_delim(fp, del);
1417ca0716f5SRobert Watson print_1_byte(fp, tok->tt.arg64.no, "%u");
1418ca0716f5SRobert Watson print_delim(fp, del);
141922ccb20dSRobert Watson print_8_bytes(fp, tok->tt.arg64.val, "0x%llx");
1420ca0716f5SRobert Watson print_delim(fp, del);
1421ca0716f5SRobert Watson print_string(fp, tok->tt.arg64.text, tok->tt.arg64.len);
1422ca0716f5SRobert Watson }
1423bc168a6cSRobert Watson }
1424ca0716f5SRobert Watson
1425ca0716f5SRobert Watson /*
1426ca0716f5SRobert Watson * how to print 1 byte
1427ca0716f5SRobert Watson * basic unit 1 byte
1428ca0716f5SRobert Watson * unit count 1 byte
1429ca0716f5SRobert Watson * data items (depends on basic unit)
1430ca0716f5SRobert Watson */
1431ca0716f5SRobert Watson static int
fetch_arb_tok(tokenstr_t * tok,u_char * buf,int len)1432bc168a6cSRobert Watson fetch_arb_tok(tokenstr_t *tok, u_char *buf, int len)
1433ca0716f5SRobert Watson {
1434ca0716f5SRobert Watson int err = 0;
1435ca0716f5SRobert Watson int datasize;
1436ca0716f5SRobert Watson
1437ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.arb.howtopr, tok->len, err);
1438ca0716f5SRobert Watson if (err)
1439ca0716f5SRobert Watson return (-1);
1440ca0716f5SRobert Watson
1441ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.arb.bu, tok->len, err);
1442ca0716f5SRobert Watson if (err)
1443ca0716f5SRobert Watson return (-1);
1444ca0716f5SRobert Watson
1445ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.arb.uc, tok->len, err);
1446ca0716f5SRobert Watson if (err)
1447ca0716f5SRobert Watson return (-1);
1448ca0716f5SRobert Watson
1449ca0716f5SRobert Watson /*
1450ca0716f5SRobert Watson * Determine the size of the basic unit.
1451ca0716f5SRobert Watson */
1452ca0716f5SRobert Watson switch(tok->tt.arb.bu) {
1453ca0716f5SRobert Watson case AUR_BYTE:
1454506764c6SRobert Watson /* case AUR_CHAR: */
1455ca0716f5SRobert Watson datasize = AUR_BYTE_SIZE;
1456ca0716f5SRobert Watson break;
1457ca0716f5SRobert Watson
1458ca0716f5SRobert Watson case AUR_SHORT:
1459ca0716f5SRobert Watson datasize = AUR_SHORT_SIZE;
1460ca0716f5SRobert Watson break;
1461ca0716f5SRobert Watson
1462506764c6SRobert Watson case AUR_INT32:
1463506764c6SRobert Watson /* case AUR_INT: */
1464506764c6SRobert Watson datasize = AUR_INT32_SIZE;
1465506764c6SRobert Watson break;
1466506764c6SRobert Watson
1467506764c6SRobert Watson case AUR_INT64:
1468506764c6SRobert Watson datasize = AUR_INT64_SIZE;
1469ca0716f5SRobert Watson break;
1470ca0716f5SRobert Watson
1471ca0716f5SRobert Watson default:
1472ca0716f5SRobert Watson return (-1);
1473ca0716f5SRobert Watson }
1474ca0716f5SRobert Watson
1475ca0716f5SRobert Watson SET_PTR(buf, len, tok->tt.arb.data, datasize * tok->tt.arb.uc,
1476ca0716f5SRobert Watson tok->len, err);
1477ca0716f5SRobert Watson if (err)
1478ca0716f5SRobert Watson return (-1);
1479ca0716f5SRobert Watson
1480ca0716f5SRobert Watson return (0);
1481ca0716f5SRobert Watson }
1482ca0716f5SRobert Watson
1483ca0716f5SRobert Watson static void
print_arb_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1484aa772005SRobert Watson print_arb_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1485ca0716f5SRobert Watson {
1486ca0716f5SRobert Watson char *str;
1487ca0716f5SRobert Watson char *format;
1488ca0716f5SRobert Watson size_t size;
1489ca0716f5SRobert Watson int i;
1490ca0716f5SRobert Watson
1491aa772005SRobert Watson print_tok_type(fp, tok->id, "arbitrary", oflags);
1492aa772005SRobert Watson if (!(oflags & AU_OFLAG_XML))
1493ca0716f5SRobert Watson print_delim(fp, del);
1494ca0716f5SRobert Watson
1495ca0716f5SRobert Watson switch(tok->tt.arb.howtopr) {
1496ca0716f5SRobert Watson case AUP_BINARY:
1497ca0716f5SRobert Watson str = "binary";
1498ca0716f5SRobert Watson format = " %c";
1499ca0716f5SRobert Watson break;
1500ca0716f5SRobert Watson
1501ca0716f5SRobert Watson case AUP_OCTAL:
1502ca0716f5SRobert Watson str = "octal";
1503ca0716f5SRobert Watson format = " %o";
1504ca0716f5SRobert Watson break;
1505ca0716f5SRobert Watson
1506ca0716f5SRobert Watson case AUP_DECIMAL:
1507ca0716f5SRobert Watson str = "decimal";
1508ca0716f5SRobert Watson format = " %d";
1509ca0716f5SRobert Watson break;
1510ca0716f5SRobert Watson
1511ca0716f5SRobert Watson case AUP_HEX:
1512ca0716f5SRobert Watson str = "hex";
1513ca0716f5SRobert Watson format = " %x";
1514ca0716f5SRobert Watson break;
1515ca0716f5SRobert Watson
1516ca0716f5SRobert Watson case AUP_STRING:
1517ca0716f5SRobert Watson str = "string";
1518ca0716f5SRobert Watson format = "%c";
1519ca0716f5SRobert Watson break;
1520ca0716f5SRobert Watson
1521ca0716f5SRobert Watson default:
1522ca0716f5SRobert Watson return;
1523ca0716f5SRobert Watson }
1524ca0716f5SRobert Watson
1525aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1526bc168a6cSRobert Watson open_attr(fp, "print");
1527bc168a6cSRobert Watson fprintf(fp, "%s",str);
1528bc168a6cSRobert Watson close_attr(fp);
1529bc168a6cSRobert Watson } else {
1530ca0716f5SRobert Watson print_string(fp, str, strlen(str));
1531ca0716f5SRobert Watson print_delim(fp, del);
1532bc168a6cSRobert Watson }
1533ca0716f5SRobert Watson switch(tok->tt.arb.bu) {
1534ca0716f5SRobert Watson case AUR_BYTE:
1535506764c6SRobert Watson /* case AUR_CHAR: */
1536ca0716f5SRobert Watson str = "byte";
1537ca0716f5SRobert Watson size = AUR_BYTE_SIZE;
1538aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1539bc168a6cSRobert Watson open_attr(fp, "type");
154052267f74SRobert Watson fprintf(fp, "%zu", size);
1541bc168a6cSRobert Watson close_attr(fp);
1542bc168a6cSRobert Watson open_attr(fp, "count");
1543bc168a6cSRobert Watson print_1_byte(fp, tok->tt.arb.uc, "%u");
1544bc168a6cSRobert Watson close_attr(fp);
1545bc168a6cSRobert Watson fprintf(fp, ">");
1546bc168a6cSRobert Watson for (i = 0; i<tok->tt.arb.uc; i++)
1547bc168a6cSRobert Watson fprintf(fp, format, *(tok->tt.arb.data +
1548bc168a6cSRobert Watson (size * i)));
1549bc168a6cSRobert Watson close_tag(fp, tok->id);
1550bc168a6cSRobert Watson } else {
1551ca0716f5SRobert Watson print_string(fp, str, strlen(str));
1552ca0716f5SRobert Watson print_delim(fp, del);
1553ca0716f5SRobert Watson print_1_byte(fp, tok->tt.arb.uc, "%u");
1554ca0716f5SRobert Watson print_delim(fp, del);
1555ca0716f5SRobert Watson for (i = 0; i<tok->tt.arb.uc; i++)
1556bc168a6cSRobert Watson fprintf(fp, format, *(tok->tt.arb.data +
1557bc168a6cSRobert Watson (size * i)));
1558bc168a6cSRobert Watson }
1559ca0716f5SRobert Watson break;
1560ca0716f5SRobert Watson
1561ca0716f5SRobert Watson case AUR_SHORT:
1562ca0716f5SRobert Watson str = "short";
1563ca0716f5SRobert Watson size = AUR_SHORT_SIZE;
1564aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1565bc168a6cSRobert Watson open_attr(fp, "type");
156652267f74SRobert Watson fprintf(fp, "%zu", size);
1567bc168a6cSRobert Watson close_attr(fp);
1568bc168a6cSRobert Watson open_attr(fp, "count");
1569bc168a6cSRobert Watson print_1_byte(fp, tok->tt.arb.uc, "%u");
1570bc168a6cSRobert Watson close_attr(fp);
1571bc168a6cSRobert Watson fprintf(fp, ">");
1572bc168a6cSRobert Watson for (i = 0; i < tok->tt.arb.uc; i++)
1573bc168a6cSRobert Watson fprintf(fp, format,
1574bc168a6cSRobert Watson *((u_int16_t *)(tok->tt.arb.data +
1575bc168a6cSRobert Watson (size * i))));
1576bc168a6cSRobert Watson close_tag(fp, tok->id);
1577bc168a6cSRobert Watson } else {
1578ca0716f5SRobert Watson print_string(fp, str, strlen(str));
1579ca0716f5SRobert Watson print_delim(fp, del);
1580ca0716f5SRobert Watson print_1_byte(fp, tok->tt.arb.uc, "%u");
1581ca0716f5SRobert Watson print_delim(fp, del);
1582ca0716f5SRobert Watson for (i = 0; i < tok->tt.arb.uc; i++)
1583bc168a6cSRobert Watson fprintf(fp, format,
1584bc168a6cSRobert Watson *((u_int16_t *)(tok->tt.arb.data +
1585ca0716f5SRobert Watson (size * i))));
1586bc168a6cSRobert Watson }
1587ca0716f5SRobert Watson break;
1588ca0716f5SRobert Watson
1589506764c6SRobert Watson case AUR_INT32:
1590506764c6SRobert Watson /* case AUR_INT: */
1591ca0716f5SRobert Watson str = "int";
1592506764c6SRobert Watson size = AUR_INT32_SIZE;
1593aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1594bc168a6cSRobert Watson open_attr(fp, "type");
159552267f74SRobert Watson fprintf(fp, "%zu", size);
1596bc168a6cSRobert Watson close_attr(fp);
1597bc168a6cSRobert Watson open_attr(fp, "count");
1598bc168a6cSRobert Watson print_1_byte(fp, tok->tt.arb.uc, "%u");
1599bc168a6cSRobert Watson close_attr(fp);
1600bc168a6cSRobert Watson fprintf(fp, ">");
1601bc168a6cSRobert Watson for (i = 0; i < tok->tt.arb.uc; i++)
1602bc168a6cSRobert Watson fprintf(fp, format,
1603bc168a6cSRobert Watson *((u_int32_t *)(tok->tt.arb.data +
1604bc168a6cSRobert Watson (size * i))));
1605bc168a6cSRobert Watson close_tag(fp, tok->id);
1606bc168a6cSRobert Watson } else {
1607ca0716f5SRobert Watson print_string(fp, str, strlen(str));
1608ca0716f5SRobert Watson print_delim(fp, del);
1609ca0716f5SRobert Watson print_1_byte(fp, tok->tt.arb.uc, "%u");
1610ca0716f5SRobert Watson print_delim(fp, del);
1611ca0716f5SRobert Watson for (i = 0; i < tok->tt.arb.uc; i++)
1612bc168a6cSRobert Watson fprintf(fp, format,
1613bc168a6cSRobert Watson *((u_int32_t *)(tok->tt.arb.data +
1614ca0716f5SRobert Watson (size * i))));
1615bc168a6cSRobert Watson }
1616ca0716f5SRobert Watson break;
1617ca0716f5SRobert Watson
1618506764c6SRobert Watson case AUR_INT64:
1619506764c6SRobert Watson str = "int64";
1620506764c6SRobert Watson size = AUR_INT64_SIZE;
1621aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1622bc168a6cSRobert Watson open_attr(fp, "type");
162352267f74SRobert Watson fprintf(fp, "%zu", size);
1624bc168a6cSRobert Watson close_attr(fp);
1625bc168a6cSRobert Watson open_attr(fp, "count");
1626bc168a6cSRobert Watson print_1_byte(fp, tok->tt.arb.uc, "%u");
1627bc168a6cSRobert Watson close_attr(fp);
1628bc168a6cSRobert Watson fprintf(fp, ">");
1629bc168a6cSRobert Watson for (i = 0; i < tok->tt.arb.uc; i++)
1630bc168a6cSRobert Watson fprintf(fp, format,
1631bc168a6cSRobert Watson *((u_int64_t *)(tok->tt.arb.data +
1632bc168a6cSRobert Watson (size * i))));
1633bc168a6cSRobert Watson close_tag(fp, tok->id);
1634bc168a6cSRobert Watson } else {
1635506764c6SRobert Watson print_string(fp, str, strlen(str));
1636506764c6SRobert Watson print_delim(fp, del);
1637506764c6SRobert Watson print_1_byte(fp, tok->tt.arb.uc, "%u");
1638506764c6SRobert Watson print_delim(fp, del);
1639506764c6SRobert Watson for (i = 0; i < tok->tt.arb.uc; i++)
1640bc168a6cSRobert Watson fprintf(fp, format,
1641bc168a6cSRobert Watson *((u_int64_t *)(tok->tt.arb.data +
1642506764c6SRobert Watson (size * i))));
1643bc168a6cSRobert Watson }
1644506764c6SRobert Watson break;
1645506764c6SRobert Watson
1646ca0716f5SRobert Watson default:
1647ca0716f5SRobert Watson return;
1648ca0716f5SRobert Watson }
1649ca0716f5SRobert Watson }
1650ca0716f5SRobert Watson
1651ca0716f5SRobert Watson /*
1652ca0716f5SRobert Watson * file access mode 4 bytes
1653ca0716f5SRobert Watson * owner user ID 4 bytes
1654ca0716f5SRobert Watson * owner group ID 4 bytes
1655ca0716f5SRobert Watson * file system ID 4 bytes
1656ca0716f5SRobert Watson * node ID 8 bytes
1657ca0716f5SRobert Watson * device 4 bytes/8 bytes (32-bit/64-bit)
1658ca0716f5SRobert Watson */
1659ca0716f5SRobert Watson static int
fetch_attr32_tok(tokenstr_t * tok,u_char * buf,int len)1660bc168a6cSRobert Watson fetch_attr32_tok(tokenstr_t *tok, u_char *buf, int len)
1661ca0716f5SRobert Watson {
1662ca0716f5SRobert Watson int err = 0;
1663ca0716f5SRobert Watson
1664ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.mode, tok->len, err);
1665ca0716f5SRobert Watson if (err)
1666ca0716f5SRobert Watson return (-1);
1667ca0716f5SRobert Watson
1668ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.uid, tok->len, err);
1669ca0716f5SRobert Watson if (err)
1670ca0716f5SRobert Watson return (-1);
1671ca0716f5SRobert Watson
1672ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.gid, tok->len, err);
1673ca0716f5SRobert Watson if (err)
1674ca0716f5SRobert Watson return (-1);
1675ca0716f5SRobert Watson
1676ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.fsid, tok->len, err);
1677ca0716f5SRobert Watson if (err)
1678ca0716f5SRobert Watson return (-1);
1679ca0716f5SRobert Watson
1680ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.attr32.nid, tok->len, err);
1681ca0716f5SRobert Watson if (err)
1682ca0716f5SRobert Watson return (-1);
1683ca0716f5SRobert Watson
1684ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.dev, tok->len, err);
1685ca0716f5SRobert Watson if (err)
1686ca0716f5SRobert Watson return (-1);
1687ca0716f5SRobert Watson
1688ca0716f5SRobert Watson return (0);
1689ca0716f5SRobert Watson }
1690ca0716f5SRobert Watson
1691ca0716f5SRobert Watson static void
print_attr32_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1692aa772005SRobert Watson print_attr32_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1693ca0716f5SRobert Watson {
1694ca0716f5SRobert Watson
1695aa772005SRobert Watson print_tok_type(fp, tok->id, "attribute", oflags);
1696aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1697bc168a6cSRobert Watson open_attr(fp, "mode");
1698bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.attr32.mode, "%o");
1699bc168a6cSRobert Watson close_attr(fp);
1700bc168a6cSRobert Watson open_attr(fp, "uid");
1701aa772005SRobert Watson print_user(fp, tok->tt.attr32.uid, oflags);
1702bc168a6cSRobert Watson close_attr(fp);
1703bc168a6cSRobert Watson open_attr(fp, "gid");
1704aa772005SRobert Watson print_group(fp, tok->tt.attr32.gid, oflags);
1705bc168a6cSRobert Watson close_attr(fp);
1706bc168a6cSRobert Watson open_attr(fp, "fsid");
1707bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.attr32.fsid, "%u");
1708bc168a6cSRobert Watson close_attr(fp);
1709bc168a6cSRobert Watson open_attr(fp, "nodeid");
1710bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.attr32.nid, "%lld");
1711bc168a6cSRobert Watson close_attr(fp);
1712bc168a6cSRobert Watson open_attr(fp, "device");
1713bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.attr32.dev, "%u");
1714bc168a6cSRobert Watson close_attr(fp);
1715bc168a6cSRobert Watson close_tag(fp, tok->id);
1716bc168a6cSRobert Watson } else {
1717ca0716f5SRobert Watson print_delim(fp, del);
1718ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.attr32.mode, "%o");
1719ca0716f5SRobert Watson print_delim(fp, del);
1720aa772005SRobert Watson print_user(fp, tok->tt.attr32.uid, oflags);
1721ca0716f5SRobert Watson print_delim(fp, del);
1722aa772005SRobert Watson print_group(fp, tok->tt.attr32.gid, oflags);
1723ca0716f5SRobert Watson print_delim(fp, del);
1724ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.attr32.fsid, "%u");
1725ca0716f5SRobert Watson print_delim(fp, del);
1726ca0716f5SRobert Watson print_8_bytes(fp, tok->tt.attr32.nid, "%lld");
1727ca0716f5SRobert Watson print_delim(fp, del);
1728ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.attr32.dev, "%u");
1729ca0716f5SRobert Watson }
1730bc168a6cSRobert Watson }
1731ca0716f5SRobert Watson
1732ca0716f5SRobert Watson /*
1733ca0716f5SRobert Watson * file access mode 4 bytes
1734ca0716f5SRobert Watson * owner user ID 4 bytes
1735ca0716f5SRobert Watson * owner group ID 4 bytes
1736ca0716f5SRobert Watson * file system ID 4 bytes
1737ca0716f5SRobert Watson * node ID 8 bytes
1738ca0716f5SRobert Watson * device 4 bytes/8 bytes (32-bit/64-bit)
1739ca0716f5SRobert Watson */
1740ca0716f5SRobert Watson static int
fetch_attr64_tok(tokenstr_t * tok,u_char * buf,int len)1741bc168a6cSRobert Watson fetch_attr64_tok(tokenstr_t *tok, u_char *buf, int len)
1742ca0716f5SRobert Watson {
1743ca0716f5SRobert Watson int err = 0;
1744ca0716f5SRobert Watson
1745ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr64.mode, tok->len, err);
1746ca0716f5SRobert Watson if (err)
1747ca0716f5SRobert Watson return (-1);
1748ca0716f5SRobert Watson
1749ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr64.uid, tok->len, err);
1750ca0716f5SRobert Watson if (err)
1751ca0716f5SRobert Watson return (-1);
1752ca0716f5SRobert Watson
1753ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr64.gid, tok->len, err);
1754ca0716f5SRobert Watson if (err)
1755ca0716f5SRobert Watson return (-1);
1756ca0716f5SRobert Watson
1757ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.attr64.fsid, tok->len, err);
1758ca0716f5SRobert Watson if (err)
1759ca0716f5SRobert Watson return (-1);
1760ca0716f5SRobert Watson
1761ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.attr64.nid, tok->len, err);
1762ca0716f5SRobert Watson if (err)
1763ca0716f5SRobert Watson return (-1);
1764ca0716f5SRobert Watson
1765ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.attr64.dev, tok->len, err);
1766ca0716f5SRobert Watson if (err)
1767ca0716f5SRobert Watson return (-1);
1768ca0716f5SRobert Watson
1769ca0716f5SRobert Watson return (0);
1770ca0716f5SRobert Watson }
1771ca0716f5SRobert Watson
1772ca0716f5SRobert Watson static void
print_attr64_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1773aa772005SRobert Watson print_attr64_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1774ca0716f5SRobert Watson {
1775ca0716f5SRobert Watson
1776aa772005SRobert Watson print_tok_type(fp, tok->id, "attribute", oflags);
1777aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1778bc168a6cSRobert Watson open_attr(fp, "mode");
1779bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.attr64.mode, "%o");
1780bc168a6cSRobert Watson close_attr(fp);
1781bc168a6cSRobert Watson open_attr(fp, "uid");
1782aa772005SRobert Watson print_user(fp, tok->tt.attr64.uid, oflags);
1783bc168a6cSRobert Watson close_attr(fp);
1784bc168a6cSRobert Watson open_attr(fp, "gid");
1785aa772005SRobert Watson print_group(fp, tok->tt.attr64.gid, oflags);
1786bc168a6cSRobert Watson close_attr(fp);
1787bc168a6cSRobert Watson open_attr(fp, "fsid");
1788bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.attr64.fsid, "%u");
1789bc168a6cSRobert Watson close_attr(fp);
1790bc168a6cSRobert Watson open_attr(fp, "nodeid");
1791bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.attr64.nid, "%lld");
1792bc168a6cSRobert Watson close_attr(fp);
1793bc168a6cSRobert Watson open_attr(fp, "device");
1794bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.attr64.dev, "%llu");
1795bc168a6cSRobert Watson close_attr(fp);
1796bc168a6cSRobert Watson close_tag(fp, tok->id);
1797bc168a6cSRobert Watson } else {
1798ca0716f5SRobert Watson print_delim(fp, del);
1799ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.attr64.mode, "%o");
1800ca0716f5SRobert Watson print_delim(fp, del);
1801aa772005SRobert Watson print_user(fp, tok->tt.attr64.uid, oflags);
1802ca0716f5SRobert Watson print_delim(fp, del);
1803aa772005SRobert Watson print_group(fp, tok->tt.attr64.gid, oflags);
1804ca0716f5SRobert Watson print_delim(fp, del);
1805ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.attr64.fsid, "%u");
1806ca0716f5SRobert Watson print_delim(fp, del);
1807ca0716f5SRobert Watson print_8_bytes(fp, tok->tt.attr64.nid, "%lld");
1808ca0716f5SRobert Watson print_delim(fp, del);
1809ca0716f5SRobert Watson print_8_bytes(fp, tok->tt.attr64.dev, "%llu");
1810ca0716f5SRobert Watson }
1811bc168a6cSRobert Watson }
1812ca0716f5SRobert Watson
1813ca0716f5SRobert Watson /*
1814ca0716f5SRobert Watson * status 4 bytes
1815ca0716f5SRobert Watson * return value 4 bytes
1816ca0716f5SRobert Watson */
1817ca0716f5SRobert Watson static int
fetch_exit_tok(tokenstr_t * tok,u_char * buf,int len)1818bc168a6cSRobert Watson fetch_exit_tok(tokenstr_t *tok, u_char *buf, int len)
1819ca0716f5SRobert Watson {
1820ca0716f5SRobert Watson int err = 0;
1821ca0716f5SRobert Watson
1822ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.exit.status, tok->len, err);
1823ca0716f5SRobert Watson if (err)
1824ca0716f5SRobert Watson return (-1);
1825ca0716f5SRobert Watson
1826ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.exit.ret, tok->len, err);
1827ca0716f5SRobert Watson if (err)
1828ca0716f5SRobert Watson return (-1);
1829ca0716f5SRobert Watson
1830ca0716f5SRobert Watson return (0);
1831ca0716f5SRobert Watson }
1832ca0716f5SRobert Watson
1833ca0716f5SRobert Watson static void
print_exit_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1834aa772005SRobert Watson print_exit_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1835ca0716f5SRobert Watson {
1836ca0716f5SRobert Watson
1837aa772005SRobert Watson print_tok_type(fp, tok->id, "exit", oflags);
1838aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1839bc168a6cSRobert Watson open_attr(fp, "errval");
1840bc168a6cSRobert Watson print_errval(fp, tok->tt.exit.status);
1841bc168a6cSRobert Watson close_attr(fp);
1842bc168a6cSRobert Watson open_attr(fp, "retval");
1843bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.exit.ret, "%u");
1844bc168a6cSRobert Watson close_attr(fp);
1845bc168a6cSRobert Watson close_tag(fp, tok->id);
1846bc168a6cSRobert Watson } else {
1847ca0716f5SRobert Watson print_delim(fp, del);
1848ca0716f5SRobert Watson print_errval(fp, tok->tt.exit.status);
1849ca0716f5SRobert Watson print_delim(fp, del);
1850ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.exit.ret, "%u");
1851ca0716f5SRobert Watson }
1852bc168a6cSRobert Watson }
1853ca0716f5SRobert Watson
1854ca0716f5SRobert Watson /*
1855ca0716f5SRobert Watson * count 4 bytes
1856ca0716f5SRobert Watson * text count null-terminated string(s)
1857ca0716f5SRobert Watson */
1858ca0716f5SRobert Watson static int
fetch_execarg_tok(tokenstr_t * tok,u_char * buf,int len)1859bc168a6cSRobert Watson fetch_execarg_tok(tokenstr_t *tok, u_char *buf, int len)
1860ca0716f5SRobert Watson {
1861ca0716f5SRobert Watson int err = 0;
186252267f74SRobert Watson u_int32_t i;
1863bc168a6cSRobert Watson u_char *bptr;
1864ca0716f5SRobert Watson
1865ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.execarg.count, tok->len, err);
1866ca0716f5SRobert Watson if (err)
1867ca0716f5SRobert Watson return (-1);
1868ca0716f5SRobert Watson
1869ca0716f5SRobert Watson for (i = 0; i < tok->tt.execarg.count; i++) {
1870ca0716f5SRobert Watson bptr = buf + tok->len;
1871bb97b418SRobert Watson if (i < AUDIT_MAX_ARGS)
1872bc168a6cSRobert Watson tok->tt.execarg.text[i] = (char*)bptr;
1873ca0716f5SRobert Watson
1874ca0716f5SRobert Watson /* Look for a null terminated string. */
1875ca0716f5SRobert Watson while (bptr && (*bptr != '\0')) {
187652267f74SRobert Watson if (++tok->len >= (u_int32_t)len)
1877ca0716f5SRobert Watson return (-1);
1878ca0716f5SRobert Watson bptr = buf + tok->len;
1879ca0716f5SRobert Watson }
1880ca0716f5SRobert Watson if (!bptr)
1881ca0716f5SRobert Watson return (-1);
1882ca0716f5SRobert Watson tok->len++; /* \0 character */
1883ca0716f5SRobert Watson }
1884bb97b418SRobert Watson if (tok->tt.execarg.count > AUDIT_MAX_ARGS)
1885bb97b418SRobert Watson tok->tt.execarg.count = AUDIT_MAX_ARGS;
1886ca0716f5SRobert Watson
1887ca0716f5SRobert Watson return (0);
1888ca0716f5SRobert Watson }
1889ca0716f5SRobert Watson
1890ca0716f5SRobert Watson static void
print_execarg_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1891aa772005SRobert Watson print_execarg_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1892ca0716f5SRobert Watson {
189352267f74SRobert Watson u_int32_t i;
1894ca0716f5SRobert Watson
1895aa772005SRobert Watson print_tok_type(fp, tok->id, "exec arg", oflags);
1896ca0716f5SRobert Watson for (i = 0; i < tok->tt.execarg.count; i++) {
1897aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1898bc168a6cSRobert Watson fprintf(fp, "<arg>");
1899aa772005SRobert Watson print_xml_string(fp, tok->tt.execarg.text[i],
1900bc168a6cSRobert Watson strlen(tok->tt.execarg.text[i]));
1901bc168a6cSRobert Watson fprintf(fp, "</arg>");
1902bc168a6cSRobert Watson } else {
1903ca0716f5SRobert Watson print_delim(fp, del);
1904ca0716f5SRobert Watson print_string(fp, tok->tt.execarg.text[i],
1905ca0716f5SRobert Watson strlen(tok->tt.execarg.text[i]));
1906ca0716f5SRobert Watson }
1907ca0716f5SRobert Watson }
1908aa772005SRobert Watson if (oflags & AU_OFLAG_XML)
1909bc168a6cSRobert Watson close_tag(fp, tok->id);
1910bc168a6cSRobert Watson }
1911ca0716f5SRobert Watson
1912ca0716f5SRobert Watson /*
1913ca0716f5SRobert Watson * count 4 bytes
1914ca0716f5SRobert Watson * text count null-terminated string(s)
1915ca0716f5SRobert Watson */
1916ca0716f5SRobert Watson static int
fetch_execenv_tok(tokenstr_t * tok,u_char * buf,int len)1917bc168a6cSRobert Watson fetch_execenv_tok(tokenstr_t *tok, u_char *buf, int len)
1918ca0716f5SRobert Watson {
1919ca0716f5SRobert Watson int err = 0;
192052267f74SRobert Watson u_int32_t i;
1921bc168a6cSRobert Watson u_char *bptr;
1922ca0716f5SRobert Watson
1923ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.execenv.count, tok->len, err);
1924ca0716f5SRobert Watson if (err)
1925ca0716f5SRobert Watson return (-1);
1926ca0716f5SRobert Watson
1927ca0716f5SRobert Watson for (i = 0; i < tok->tt.execenv.count; i++) {
1928ca0716f5SRobert Watson bptr = buf + tok->len;
1929bb97b418SRobert Watson if (i < AUDIT_MAX_ENV)
1930bc168a6cSRobert Watson tok->tt.execenv.text[i] = (char*)bptr;
1931ca0716f5SRobert Watson
1932ca0716f5SRobert Watson /* Look for a null terminated string. */
1933ca0716f5SRobert Watson while (bptr && (*bptr != '\0')) {
193452267f74SRobert Watson if (++tok->len >= (u_int32_t)len)
1935ca0716f5SRobert Watson return (-1);
1936ca0716f5SRobert Watson bptr = buf + tok->len;
1937ca0716f5SRobert Watson }
1938ca0716f5SRobert Watson if (!bptr)
1939ca0716f5SRobert Watson return (-1);
1940ca0716f5SRobert Watson tok->len++; /* \0 character */
1941ca0716f5SRobert Watson }
1942bb97b418SRobert Watson if (tok->tt.execenv.count > AUDIT_MAX_ENV)
1943bb97b418SRobert Watson tok->tt.execenv.count = AUDIT_MAX_ENV;
1944ca0716f5SRobert Watson
1945ca0716f5SRobert Watson return (0);
1946ca0716f5SRobert Watson }
1947ca0716f5SRobert Watson
1948ca0716f5SRobert Watson static void
print_execenv_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)1949aa772005SRobert Watson print_execenv_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
1950ca0716f5SRobert Watson {
195152267f74SRobert Watson u_int32_t i;
1952ca0716f5SRobert Watson
1953aa772005SRobert Watson print_tok_type(fp, tok->id, "exec env", oflags);
1954ca0716f5SRobert Watson for (i = 0; i< tok->tt.execenv.count; i++) {
1955aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
1956bc168a6cSRobert Watson fprintf(fp, "<env>");
1957aa772005SRobert Watson print_xml_string(fp, tok->tt.execenv.text[i],
1958bc168a6cSRobert Watson strlen(tok->tt.execenv.text[i]));
1959bc168a6cSRobert Watson fprintf(fp, "</env>");
1960bc168a6cSRobert Watson } else {
1961ca0716f5SRobert Watson print_delim(fp, del);
1962ca0716f5SRobert Watson print_string(fp, tok->tt.execenv.text[i],
1963ca0716f5SRobert Watson strlen(tok->tt.execenv.text[i]));
1964ca0716f5SRobert Watson }
1965ca0716f5SRobert Watson }
1966aa772005SRobert Watson if (oflags & AU_OFLAG_XML)
1967bc168a6cSRobert Watson close_tag(fp, tok->id);
1968bc168a6cSRobert Watson }
1969ca0716f5SRobert Watson
1970ca0716f5SRobert Watson /*
1971ca0716f5SRobert Watson * seconds of time 4 bytes
1972ca0716f5SRobert Watson * milliseconds of time 4 bytes
1973ca0716f5SRobert Watson * file name len 2 bytes
1974ca0716f5SRobert Watson * file pathname N bytes + 1 terminating NULL byte
1975ca0716f5SRobert Watson */
1976ca0716f5SRobert Watson static int
fetch_file_tok(tokenstr_t * tok,u_char * buf,int len)1977bc168a6cSRobert Watson fetch_file_tok(tokenstr_t *tok, u_char *buf, int len)
1978ca0716f5SRobert Watson {
1979ca0716f5SRobert Watson int err = 0;
1980ca0716f5SRobert Watson
1981ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.file.s, tok->len, err);
1982ca0716f5SRobert Watson if (err)
1983ca0716f5SRobert Watson return (-1);
1984ca0716f5SRobert Watson
1985ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.file.ms, tok->len, err);
1986ca0716f5SRobert Watson if (err)
1987ca0716f5SRobert Watson return (-1);
1988ca0716f5SRobert Watson
1989ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.file.len, tok->len, err);
1990ca0716f5SRobert Watson if (err)
1991ca0716f5SRobert Watson return (-1);
1992ca0716f5SRobert Watson
1993bc168a6cSRobert Watson SET_PTR((char*)buf, len, tok->tt.file.name, tok->tt.file.len, tok->len,
1994bc168a6cSRobert Watson err);
1995ca0716f5SRobert Watson if (err)
1996ca0716f5SRobert Watson return (-1);
1997ca0716f5SRobert Watson
1998ca0716f5SRobert Watson return (0);
1999ca0716f5SRobert Watson }
2000ca0716f5SRobert Watson
2001ca0716f5SRobert Watson static void
print_file_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2002aa772005SRobert Watson print_file_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2003ca0716f5SRobert Watson {
2004ca0716f5SRobert Watson
2005aa772005SRobert Watson print_tok_type(fp, tok->id, "file", oflags);
2006aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2007bc168a6cSRobert Watson open_attr(fp, "time");
2008aa772005SRobert Watson print_sec32(fp, tok->tt.file.s, oflags);
2009bc168a6cSRobert Watson close_attr(fp);
2010bc168a6cSRobert Watson open_attr(fp, "msec");
2011aa772005SRobert Watson print_msec32(fp, tok->tt.file.ms, oflags);
2012bc168a6cSRobert Watson close_attr(fp);
2013bc168a6cSRobert Watson fprintf(fp, ">");
2014bc168a6cSRobert Watson print_string(fp, tok->tt.file.name, tok->tt.file.len);
2015bc168a6cSRobert Watson close_tag(fp, tok->id);
2016bc168a6cSRobert Watson } else {
2017ca0716f5SRobert Watson print_delim(fp, del);
2018aa772005SRobert Watson print_sec32(fp, tok->tt.file.s, oflags);
2019ca0716f5SRobert Watson print_delim(fp, del);
2020aa772005SRobert Watson print_msec32(fp, tok->tt.file.ms, oflags);
2021ca0716f5SRobert Watson print_delim(fp, del);
2022ca0716f5SRobert Watson print_string(fp, tok->tt.file.name, tok->tt.file.len);
2023ca0716f5SRobert Watson }
2024bc168a6cSRobert Watson }
2025ca0716f5SRobert Watson
2026ca0716f5SRobert Watson /*
2027ca0716f5SRobert Watson * number groups 2 bytes
2028ca0716f5SRobert Watson * group list count * 4 bytes
2029ca0716f5SRobert Watson */
2030ca0716f5SRobert Watson static int
fetch_newgroups_tok(tokenstr_t * tok,u_char * buf,int len)2031bc168a6cSRobert Watson fetch_newgroups_tok(tokenstr_t *tok, u_char *buf, int len)
2032ca0716f5SRobert Watson {
2033ca0716f5SRobert Watson int i;
2034ca0716f5SRobert Watson int err = 0;
2035ca0716f5SRobert Watson
2036ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.grps.no, tok->len, err);
2037ca0716f5SRobert Watson if (err)
2038ca0716f5SRobert Watson return (-1);
2039ca0716f5SRobert Watson
2040ca0716f5SRobert Watson for (i = 0; i<tok->tt.grps.no; i++) {
2041ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.grps.list[i], tok->len,
2042ca0716f5SRobert Watson err);
2043ca0716f5SRobert Watson if (err)
2044ca0716f5SRobert Watson return (-1);
2045ca0716f5SRobert Watson }
2046ca0716f5SRobert Watson
2047ca0716f5SRobert Watson return (0);
2048ca0716f5SRobert Watson }
2049ca0716f5SRobert Watson
2050ca0716f5SRobert Watson static void
print_newgroups_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2051aa772005SRobert Watson print_newgroups_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2052ca0716f5SRobert Watson {
2053ca0716f5SRobert Watson int i;
2054ca0716f5SRobert Watson
2055aa772005SRobert Watson print_tok_type(fp, tok->id, "group", oflags);
2056ca0716f5SRobert Watson for (i = 0; i < tok->tt.grps.no; i++) {
2057aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2058bc168a6cSRobert Watson fprintf(fp, "<gid>");
2059aa772005SRobert Watson print_group(fp, tok->tt.grps.list[i], oflags);
2060bc168a6cSRobert Watson fprintf(fp, "</gid>");
2061bc168a6cSRobert Watson close_tag(fp, tok->id);
2062bc168a6cSRobert Watson } else {
2063ca0716f5SRobert Watson print_delim(fp, del);
2064aa772005SRobert Watson print_group(fp, tok->tt.grps.list[i], oflags);
2065ca0716f5SRobert Watson }
2066ca0716f5SRobert Watson }
2067bc168a6cSRobert Watson }
2068ca0716f5SRobert Watson
2069ca0716f5SRobert Watson /*
2070ca0716f5SRobert Watson * Internet addr 4 bytes
2071ca0716f5SRobert Watson */
2072ca0716f5SRobert Watson static int
fetch_inaddr_tok(tokenstr_t * tok,u_char * buf,int len)2073bc168a6cSRobert Watson fetch_inaddr_tok(tokenstr_t *tok, u_char *buf, int len)
2074ca0716f5SRobert Watson {
2075ca0716f5SRobert Watson int err = 0;
2076ca0716f5SRobert Watson
2077506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.inaddr.addr, sizeof(uint32_t),
2078506764c6SRobert Watson tok->len, err);
2079ca0716f5SRobert Watson if (err)
2080ca0716f5SRobert Watson return (-1);
2081ca0716f5SRobert Watson
2082ca0716f5SRobert Watson return (0);
2083ca0716f5SRobert Watson
2084ca0716f5SRobert Watson }
2085ca0716f5SRobert Watson
2086ca0716f5SRobert Watson static void
print_inaddr_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2087aa772005SRobert Watson print_inaddr_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2088ca0716f5SRobert Watson {
2089ca0716f5SRobert Watson
2090aa772005SRobert Watson print_tok_type(fp, tok->id, "ip addr", oflags);
2091aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2092bc168a6cSRobert Watson print_ip_address(fp, tok->tt.inaddr.addr);
2093bc168a6cSRobert Watson close_tag(fp, tok->id);
2094bc168a6cSRobert Watson } else {
2095ca0716f5SRobert Watson print_delim(fp, del);
2096ca0716f5SRobert Watson print_ip_address(fp, tok->tt.inaddr.addr);
2097ca0716f5SRobert Watson }
2098bc168a6cSRobert Watson }
2099ca0716f5SRobert Watson
2100ca0716f5SRobert Watson /*
2101ca0716f5SRobert Watson * type 4 bytes
2102ca0716f5SRobert Watson * address 16 bytes
2103ca0716f5SRobert Watson */
2104ca0716f5SRobert Watson static int
fetch_inaddr_ex_tok(tokenstr_t * tok,u_char * buf,int len)2105bc168a6cSRobert Watson fetch_inaddr_ex_tok(tokenstr_t *tok, u_char *buf, int len)
2106ca0716f5SRobert Watson {
2107ca0716f5SRobert Watson int err = 0;
2108ca0716f5SRobert Watson
2109ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.inaddr_ex.type, tok->len, err);
2110ca0716f5SRobert Watson if (err)
2111ca0716f5SRobert Watson return (-1);
2112ca0716f5SRobert Watson
2113ca0716f5SRobert Watson if (tok->tt.inaddr_ex.type == AU_IPv4) {
2114ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.inaddr_ex.addr[0],
2115ca0716f5SRobert Watson sizeof(tok->tt.inaddr_ex.addr[0]), tok->len, err);
2116ca0716f5SRobert Watson if (err)
2117ca0716f5SRobert Watson return (-1);
2118ca0716f5SRobert Watson } else if (tok->tt.inaddr_ex.type == AU_IPv6) {
2119ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, tok->tt.inaddr_ex.addr,
2120ca0716f5SRobert Watson sizeof(tok->tt.inaddr_ex.addr), tok->len, err);
2121ca0716f5SRobert Watson if (err)
2122ca0716f5SRobert Watson return (-1);
2123ca0716f5SRobert Watson } else
2124ca0716f5SRobert Watson return (-1);
2125ca0716f5SRobert Watson
2126ca0716f5SRobert Watson return (0);
2127ca0716f5SRobert Watson }
2128ca0716f5SRobert Watson
2129ca0716f5SRobert Watson static void
print_inaddr_ex_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2130aa772005SRobert Watson print_inaddr_ex_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2131ca0716f5SRobert Watson {
2132ca0716f5SRobert Watson
2133aa772005SRobert Watson print_tok_type(fp, tok->id, "ip addr ex", oflags);
2134aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2135bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.inaddr_ex.type,
2136bc168a6cSRobert Watson tok->tt.inaddr_ex.addr);
2137bc168a6cSRobert Watson close_tag(fp, tok->id);
2138bc168a6cSRobert Watson } else {
2139ca0716f5SRobert Watson print_delim(fp, del);
2140ca0716f5SRobert Watson print_ip_ex_address(fp, tok->tt.inaddr_ex.type,
2141ca0716f5SRobert Watson tok->tt.inaddr_ex.addr);
2142ca0716f5SRobert Watson }
2143bc168a6cSRobert Watson }
2144ca0716f5SRobert Watson
2145ca0716f5SRobert Watson /*
2146ca0716f5SRobert Watson * ip header 20 bytes
2147ca0716f5SRobert Watson */
2148ca0716f5SRobert Watson static int
fetch_ip_tok(tokenstr_t * tok,u_char * buf,int len)2149bc168a6cSRobert Watson fetch_ip_tok(tokenstr_t *tok, u_char *buf, int len)
2150ca0716f5SRobert Watson {
2151ca0716f5SRobert Watson int err = 0;
2152ca0716f5SRobert Watson
2153ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.ip.version, tok->len, err);
2154ca0716f5SRobert Watson if (err)
2155ca0716f5SRobert Watson return (-1);
2156ca0716f5SRobert Watson
2157ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.ip.tos, tok->len, err);
2158ca0716f5SRobert Watson if (err)
2159ca0716f5SRobert Watson return (-1);
2160ca0716f5SRobert Watson
2161506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.ip.len, sizeof(uint16_t),
2162506764c6SRobert Watson tok->len, err);
2163ca0716f5SRobert Watson if (err)
2164ca0716f5SRobert Watson return (-1);
2165ca0716f5SRobert Watson
2166506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.ip.id, sizeof(uint16_t),
2167506764c6SRobert Watson tok->len, err);
2168ca0716f5SRobert Watson if (err)
2169ca0716f5SRobert Watson return (-1);
2170ca0716f5SRobert Watson
2171506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.ip.offset, sizeof(uint16_t),
2172506764c6SRobert Watson tok->len, err);
2173ca0716f5SRobert Watson if (err)
2174ca0716f5SRobert Watson return (-1);
2175ca0716f5SRobert Watson
2176ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.ip.ttl, tok->len, err);
2177ca0716f5SRobert Watson if (err)
2178ca0716f5SRobert Watson return (-1);
2179ca0716f5SRobert Watson
2180ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.ip.prot, tok->len, err);
2181ca0716f5SRobert Watson if (err)
2182ca0716f5SRobert Watson return (-1);
2183ca0716f5SRobert Watson
2184506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.ip.chksm, sizeof(uint16_t),
2185506764c6SRobert Watson tok->len, err);
2186ca0716f5SRobert Watson if (err)
2187ca0716f5SRobert Watson return (-1);
2188ca0716f5SRobert Watson
2189ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.ip.src, sizeof(tok->tt.ip.src),
2190ca0716f5SRobert Watson tok->len, err);
2191ca0716f5SRobert Watson if (err)
2192ca0716f5SRobert Watson return (-1);
2193ca0716f5SRobert Watson
2194ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.ip.dest, sizeof(tok->tt.ip.dest),
2195ca0716f5SRobert Watson tok->len, err);
2196ca0716f5SRobert Watson if (err)
2197ca0716f5SRobert Watson return (-1);
2198ca0716f5SRobert Watson
2199ca0716f5SRobert Watson return (0);
2200ca0716f5SRobert Watson }
2201ca0716f5SRobert Watson
2202ca0716f5SRobert Watson static void
print_ip_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2203aa772005SRobert Watson print_ip_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2204ca0716f5SRobert Watson {
2205ca0716f5SRobert Watson
2206aa772005SRobert Watson print_tok_type(fp, tok->id, "ip", oflags);
2207aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2208bc168a6cSRobert Watson open_attr(fp, "version");
2209bc168a6cSRobert Watson print_mem(fp, (u_char *)(&tok->tt.ip.version),
2210bc168a6cSRobert Watson sizeof(u_char));
2211bc168a6cSRobert Watson close_attr(fp);
2212bc168a6cSRobert Watson open_attr(fp, "service_type");
2213bc168a6cSRobert Watson print_mem(fp, (u_char *)(&tok->tt.ip.tos), sizeof(u_char));
2214bc168a6cSRobert Watson close_attr(fp);
2215bc168a6cSRobert Watson open_attr(fp, "len");
2216bc168a6cSRobert Watson print_2_bytes(fp, ntohs(tok->tt.ip.len), "%u");
2217bc168a6cSRobert Watson close_attr(fp);
2218bc168a6cSRobert Watson open_attr(fp, "id");
2219bc168a6cSRobert Watson print_2_bytes(fp, ntohs(tok->tt.ip.id), "%u");
2220bc168a6cSRobert Watson close_attr(fp);
2221bc168a6cSRobert Watson open_attr(fp, "offset");
2222bc168a6cSRobert Watson print_2_bytes(fp, ntohs(tok->tt.ip.offset), "%u");
2223bc168a6cSRobert Watson close_attr(fp);
2224bc168a6cSRobert Watson open_attr(fp, "time_to_live");
2225bc168a6cSRobert Watson print_mem(fp, (u_char *)(&tok->tt.ip.ttl), sizeof(u_char));
2226bc168a6cSRobert Watson close_attr(fp);
2227bc168a6cSRobert Watson open_attr(fp, "protocol");
2228bc168a6cSRobert Watson print_mem(fp, (u_char *)(&tok->tt.ip.prot), sizeof(u_char));
2229bc168a6cSRobert Watson close_attr(fp);
2230bc168a6cSRobert Watson open_attr(fp, "cksum");
2231bc168a6cSRobert Watson print_2_bytes(fp, ntohs(tok->tt.ip.chksm), "%u");
2232bc168a6cSRobert Watson close_attr(fp);
2233bc168a6cSRobert Watson open_attr(fp, "src_addr");
2234bc168a6cSRobert Watson print_ip_address(fp, tok->tt.ip.src);
2235bc168a6cSRobert Watson close_attr(fp);
2236bc168a6cSRobert Watson open_attr(fp, "dest_addr");
2237bc168a6cSRobert Watson print_ip_address(fp, tok->tt.ip.dest);
2238bc168a6cSRobert Watson close_attr(fp);
2239bc168a6cSRobert Watson close_tag(fp, tok->id);
2240bc168a6cSRobert Watson } else {
2241ca0716f5SRobert Watson print_delim(fp, del);
2242bc168a6cSRobert Watson print_mem(fp, (u_char *)(&tok->tt.ip.version),
2243bc168a6cSRobert Watson sizeof(u_char));
2244ca0716f5SRobert Watson print_delim(fp, del);
2245ca0716f5SRobert Watson print_mem(fp, (u_char *)(&tok->tt.ip.tos), sizeof(u_char));
2246ca0716f5SRobert Watson print_delim(fp, del);
2247506764c6SRobert Watson print_2_bytes(fp, ntohs(tok->tt.ip.len), "%u");
2248ca0716f5SRobert Watson print_delim(fp, del);
2249506764c6SRobert Watson print_2_bytes(fp, ntohs(tok->tt.ip.id), "%u");
2250ca0716f5SRobert Watson print_delim(fp, del);
2251506764c6SRobert Watson print_2_bytes(fp, ntohs(tok->tt.ip.offset), "%u");
2252ca0716f5SRobert Watson print_delim(fp, del);
2253ca0716f5SRobert Watson print_mem(fp, (u_char *)(&tok->tt.ip.ttl), sizeof(u_char));
2254ca0716f5SRobert Watson print_delim(fp, del);
2255ca0716f5SRobert Watson print_mem(fp, (u_char *)(&tok->tt.ip.prot), sizeof(u_char));
2256ca0716f5SRobert Watson print_delim(fp, del);
2257506764c6SRobert Watson print_2_bytes(fp, ntohs(tok->tt.ip.chksm), "%u");
2258ca0716f5SRobert Watson print_delim(fp, del);
2259ca0716f5SRobert Watson print_ip_address(fp, tok->tt.ip.src);
2260ca0716f5SRobert Watson print_delim(fp, del);
2261ca0716f5SRobert Watson print_ip_address(fp, tok->tt.ip.dest);
2262ca0716f5SRobert Watson }
2263bc168a6cSRobert Watson }
2264ca0716f5SRobert Watson
2265ca0716f5SRobert Watson /*
2266ca0716f5SRobert Watson * object ID type 1 byte
2267ca0716f5SRobert Watson * Object ID 4 bytes
2268ca0716f5SRobert Watson */
2269ca0716f5SRobert Watson static int
fetch_ipc_tok(tokenstr_t * tok,u_char * buf,int len)2270bc168a6cSRobert Watson fetch_ipc_tok(tokenstr_t *tok, u_char *buf, int len)
2271ca0716f5SRobert Watson {
2272ca0716f5SRobert Watson int err = 0;
2273ca0716f5SRobert Watson
2274ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.ipc.type, tok->len, err);
2275ca0716f5SRobert Watson if (err)
2276ca0716f5SRobert Watson return (-1);
2277ca0716f5SRobert Watson
2278ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ipc.id, tok->len, err);
2279ca0716f5SRobert Watson if (err)
2280ca0716f5SRobert Watson return (-1);
2281ca0716f5SRobert Watson
2282ca0716f5SRobert Watson return (0);
2283ca0716f5SRobert Watson }
2284ca0716f5SRobert Watson
2285ca0716f5SRobert Watson static void
print_ipc_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2286aa772005SRobert Watson print_ipc_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2287ca0716f5SRobert Watson {
2288ca0716f5SRobert Watson
2289aa772005SRobert Watson print_tok_type(fp, tok->id, "IPC", oflags);
2290aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2291bc168a6cSRobert Watson open_attr(fp, "ipc-type");
2292aa772005SRobert Watson print_ipctype(fp, tok->tt.ipc.type, oflags);
2293bc168a6cSRobert Watson close_attr(fp);
2294bc168a6cSRobert Watson open_attr(fp, "ipc-id");
2295bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.ipc.id, "%u");
2296bc168a6cSRobert Watson close_attr(fp);
2297bc168a6cSRobert Watson close_tag(fp, tok->id);
2298bc168a6cSRobert Watson } else {
2299ca0716f5SRobert Watson print_delim(fp, del);
2300aa772005SRobert Watson print_ipctype(fp, tok->tt.ipc.type, oflags);
2301ca0716f5SRobert Watson print_delim(fp, del);
2302ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.ipc.id, "%u");
2303ca0716f5SRobert Watson }
2304bc168a6cSRobert Watson }
2305ca0716f5SRobert Watson
2306ca0716f5SRobert Watson /*
2307ca0716f5SRobert Watson * owner user id 4 bytes
2308ca0716f5SRobert Watson * owner group id 4 bytes
2309ca0716f5SRobert Watson * creator user id 4 bytes
2310ca0716f5SRobert Watson * creator group id 4 bytes
2311ca0716f5SRobert Watson * access mode 4 bytes
2312ca0716f5SRobert Watson * slot seq 4 bytes
2313ca0716f5SRobert Watson * key 4 bytes
2314ca0716f5SRobert Watson */
2315ca0716f5SRobert Watson static int
fetch_ipcperm_tok(tokenstr_t * tok,u_char * buf,int len)2316bc168a6cSRobert Watson fetch_ipcperm_tok(tokenstr_t *tok, u_char *buf, int len)
2317ca0716f5SRobert Watson {
2318ca0716f5SRobert Watson int err = 0;
2319ca0716f5SRobert Watson
2320ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.uid, tok->len, err);
2321ca0716f5SRobert Watson if (err)
2322ca0716f5SRobert Watson return (-1);
2323ca0716f5SRobert Watson
2324ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.gid, tok->len, err);
2325ca0716f5SRobert Watson if (err)
2326ca0716f5SRobert Watson return (-1);
2327ca0716f5SRobert Watson
2328ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.puid, tok->len, err);
2329ca0716f5SRobert Watson if (err)
2330ca0716f5SRobert Watson return (-1);
2331ca0716f5SRobert Watson
2332ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.pgid, tok->len, err);
2333ca0716f5SRobert Watson if (err)
2334ca0716f5SRobert Watson return (-1);
2335ca0716f5SRobert Watson
2336ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.mode, tok->len, err);
2337ca0716f5SRobert Watson if (err)
2338ca0716f5SRobert Watson return (-1);
2339ca0716f5SRobert Watson
2340ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.seq, tok->len, err);
2341ca0716f5SRobert Watson if (err)
2342ca0716f5SRobert Watson return (-1);
2343ca0716f5SRobert Watson
2344ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.key, tok->len, err);
2345ca0716f5SRobert Watson if (err)
2346ca0716f5SRobert Watson return (-1);
2347ca0716f5SRobert Watson
2348ca0716f5SRobert Watson return (0);
2349ca0716f5SRobert Watson }
2350ca0716f5SRobert Watson
2351ca0716f5SRobert Watson static void
print_ipcperm_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2352aa772005SRobert Watson print_ipcperm_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2353ca0716f5SRobert Watson {
2354ca0716f5SRobert Watson
2355aa772005SRobert Watson print_tok_type(fp, tok->id, "IPC perm", oflags);
2356aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2357bc168a6cSRobert Watson open_attr(fp, "uid");
2358aa772005SRobert Watson print_user(fp, tok->tt.ipcperm.uid, oflags);
2359bc168a6cSRobert Watson close_attr(fp);
2360bc168a6cSRobert Watson open_attr(fp, "gid");
2361aa772005SRobert Watson print_group(fp, tok->tt.ipcperm.gid, oflags);
2362bc168a6cSRobert Watson close_attr(fp);
2363bc168a6cSRobert Watson open_attr(fp, "creator-uid");
2364aa772005SRobert Watson print_user(fp, tok->tt.ipcperm.puid, oflags);
2365bc168a6cSRobert Watson close_attr(fp);
2366bc168a6cSRobert Watson open_attr(fp, "creator-gid");
2367aa772005SRobert Watson print_group(fp, tok->tt.ipcperm.pgid, oflags);
2368bc168a6cSRobert Watson close_attr(fp);
2369bc168a6cSRobert Watson open_attr(fp, "mode");
2370bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.ipcperm.mode, "%o");
2371bc168a6cSRobert Watson close_attr(fp);
2372bc168a6cSRobert Watson open_attr(fp, "seq");
2373bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.ipcperm.seq, "%u");
2374bc168a6cSRobert Watson close_attr(fp);
2375bc168a6cSRobert Watson open_attr(fp, "key");
2376bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.ipcperm.key, "%u");
2377bc168a6cSRobert Watson close_attr(fp);
2378bc168a6cSRobert Watson close_tag(fp, tok->id);
2379bc168a6cSRobert Watson } else {
2380ca0716f5SRobert Watson print_delim(fp, del);
2381aa772005SRobert Watson print_user(fp, tok->tt.ipcperm.uid, oflags);
2382ca0716f5SRobert Watson print_delim(fp, del);
2383aa772005SRobert Watson print_group(fp, tok->tt.ipcperm.gid, oflags);
2384ca0716f5SRobert Watson print_delim(fp, del);
2385aa772005SRobert Watson print_user(fp, tok->tt.ipcperm.puid, oflags);
2386ca0716f5SRobert Watson print_delim(fp, del);
2387aa772005SRobert Watson print_group(fp, tok->tt.ipcperm.pgid, oflags);
2388ca0716f5SRobert Watson print_delim(fp, del);
2389ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.ipcperm.mode, "%o");
2390ca0716f5SRobert Watson print_delim(fp, del);
2391ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.ipcperm.seq, "%u");
2392ca0716f5SRobert Watson print_delim(fp, del);
2393ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.ipcperm.key, "%u");
2394ca0716f5SRobert Watson }
2395bc168a6cSRobert Watson }
2396ca0716f5SRobert Watson
2397ca0716f5SRobert Watson /*
2398ca0716f5SRobert Watson * port Ip address 2 bytes
2399ca0716f5SRobert Watson */
2400ca0716f5SRobert Watson static int
fetch_iport_tok(tokenstr_t * tok,u_char * buf,int len)2401bc168a6cSRobert Watson fetch_iport_tok(tokenstr_t *tok, u_char *buf, int len)
2402ca0716f5SRobert Watson {
2403ca0716f5SRobert Watson int err = 0;
2404ca0716f5SRobert Watson
2405506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.iport.port, sizeof(uint16_t),
2406506764c6SRobert Watson tok->len, err);
2407ca0716f5SRobert Watson if (err)
2408ca0716f5SRobert Watson return (-1);
2409ca0716f5SRobert Watson
2410ca0716f5SRobert Watson return (0);
2411ca0716f5SRobert Watson }
2412ca0716f5SRobert Watson
2413ca0716f5SRobert Watson static void
print_iport_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2414aa772005SRobert Watson print_iport_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2415ca0716f5SRobert Watson {
2416ca0716f5SRobert Watson
2417aa772005SRobert Watson print_tok_type(fp, tok->id, "ip port", oflags);
2418aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2419bc168a6cSRobert Watson print_2_bytes(fp, ntohs(tok->tt.iport.port), "%#x");
2420bc168a6cSRobert Watson close_tag(fp, tok->id);
2421bc168a6cSRobert Watson } else {
2422ca0716f5SRobert Watson print_delim(fp, del);
2423506764c6SRobert Watson print_2_bytes(fp, ntohs(tok->tt.iport.port), "%#x");
2424ca0716f5SRobert Watson }
2425bc168a6cSRobert Watson }
2426ca0716f5SRobert Watson
2427ca0716f5SRobert Watson /*
2428ca0716f5SRobert Watson * size 2 bytes
2429ca0716f5SRobert Watson * data size bytes
2430ca0716f5SRobert Watson */
2431ca0716f5SRobert Watson static int
fetch_opaque_tok(tokenstr_t * tok,u_char * buf,int len)2432bc168a6cSRobert Watson fetch_opaque_tok(tokenstr_t *tok, u_char *buf, int len)
2433ca0716f5SRobert Watson {
2434ca0716f5SRobert Watson int err = 0;
2435ca0716f5SRobert Watson
2436ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.opaque.size, tok->len, err);
2437ca0716f5SRobert Watson if (err)
2438ca0716f5SRobert Watson return (-1);
2439ca0716f5SRobert Watson
2440bc168a6cSRobert Watson SET_PTR((char*)buf, len, tok->tt.opaque.data, tok->tt.opaque.size,
2441bc168a6cSRobert Watson tok->len, err);
2442ca0716f5SRobert Watson if (err)
2443ca0716f5SRobert Watson return (-1);
2444ca0716f5SRobert Watson
2445ca0716f5SRobert Watson return (0);
2446ca0716f5SRobert Watson }
2447ca0716f5SRobert Watson
2448ca0716f5SRobert Watson static void
print_opaque_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2449aa772005SRobert Watson print_opaque_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2450ca0716f5SRobert Watson {
2451ca0716f5SRobert Watson
2452aa772005SRobert Watson print_tok_type(fp, tok->id, "opaque", oflags);
2453aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2454bc168a6cSRobert Watson print_mem(fp, (u_char*)tok->tt.opaque.data,
2455bc168a6cSRobert Watson tok->tt.opaque.size);
2456bc168a6cSRobert Watson close_tag(fp, tok->id);
2457bc168a6cSRobert Watson } else {
2458ca0716f5SRobert Watson print_delim(fp, del);
2459ca0716f5SRobert Watson print_2_bytes(fp, tok->tt.opaque.size, "%u");
2460ca0716f5SRobert Watson print_delim(fp, del);
2461bc168a6cSRobert Watson print_mem(fp, (u_char*)tok->tt.opaque.data,
2462bc168a6cSRobert Watson tok->tt.opaque.size);
2463bc168a6cSRobert Watson }
2464ca0716f5SRobert Watson }
2465ca0716f5SRobert Watson
2466ca0716f5SRobert Watson /*
2467ca0716f5SRobert Watson * size 2 bytes
2468ca0716f5SRobert Watson * data size bytes
2469ca0716f5SRobert Watson */
2470ca0716f5SRobert Watson static int
fetch_path_tok(tokenstr_t * tok,u_char * buf,int len)2471bc168a6cSRobert Watson fetch_path_tok(tokenstr_t *tok, u_char *buf, int len)
2472ca0716f5SRobert Watson {
2473ca0716f5SRobert Watson int err = 0;
2474ca0716f5SRobert Watson
2475ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.path.len, tok->len, err);
2476ca0716f5SRobert Watson if (err)
2477ca0716f5SRobert Watson return (-1);
2478ca0716f5SRobert Watson
2479bc168a6cSRobert Watson SET_PTR((char*)buf, len, tok->tt.path.path, tok->tt.path.len, tok->len,
2480bc168a6cSRobert Watson err);
2481ca0716f5SRobert Watson if (err)
2482ca0716f5SRobert Watson return (-1);
2483ca0716f5SRobert Watson
2484ca0716f5SRobert Watson return (0);
2485ca0716f5SRobert Watson }
2486ca0716f5SRobert Watson
2487ca0716f5SRobert Watson static void
print_path_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2488aa772005SRobert Watson print_path_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2489ca0716f5SRobert Watson {
2490ca0716f5SRobert Watson
2491aa772005SRobert Watson print_tok_type(fp, tok->id, "path", oflags);
2492aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2493bc168a6cSRobert Watson print_string(fp, tok->tt.path.path, tok->tt.path.len);
2494bc168a6cSRobert Watson close_tag(fp, tok->id);
2495bc168a6cSRobert Watson } else {
2496ca0716f5SRobert Watson print_delim(fp, del);
2497ca0716f5SRobert Watson print_string(fp, tok->tt.path.path, tok->tt.path.len);
2498ca0716f5SRobert Watson }
2499bc168a6cSRobert Watson }
2500ca0716f5SRobert Watson
2501ca0716f5SRobert Watson /*
2502ca0716f5SRobert Watson * token ID 1 byte
2503ca0716f5SRobert Watson * audit ID 4 bytes
2504ca0716f5SRobert Watson * euid 4 bytes
2505ca0716f5SRobert Watson * egid 4 bytes
2506ca0716f5SRobert Watson * ruid 4 bytes
2507ca0716f5SRobert Watson * rgid 4 bytes
2508ca0716f5SRobert Watson * pid 4 bytes
2509ca0716f5SRobert Watson * sessid 4 bytes
2510ca0716f5SRobert Watson * terminal ID
2511ca0716f5SRobert Watson * portid 4 bytes
2512ca0716f5SRobert Watson * machine id 4 bytes
2513ca0716f5SRobert Watson */
2514ca0716f5SRobert Watson static int
fetch_process32_tok(tokenstr_t * tok,u_char * buf,int len)2515bc168a6cSRobert Watson fetch_process32_tok(tokenstr_t *tok, u_char *buf, int len)
2516ca0716f5SRobert Watson {
2517ca0716f5SRobert Watson int err = 0;
2518ca0716f5SRobert Watson
2519ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.auid, tok->len, err);
2520ca0716f5SRobert Watson if (err)
2521ca0716f5SRobert Watson return (-1);
2522ca0716f5SRobert Watson
2523ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.euid, tok->len, err);
2524ca0716f5SRobert Watson if (err)
2525ca0716f5SRobert Watson return (-1);
2526ca0716f5SRobert Watson
2527ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.egid, tok->len, err);
2528ca0716f5SRobert Watson if (err)
2529ca0716f5SRobert Watson return (-1);
2530ca0716f5SRobert Watson
2531ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.ruid, tok->len, err);
2532ca0716f5SRobert Watson if (err)
2533ca0716f5SRobert Watson return (-1);
2534ca0716f5SRobert Watson
2535ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.rgid, tok->len, err);
2536ca0716f5SRobert Watson if (err)
2537ca0716f5SRobert Watson return (-1);
2538ca0716f5SRobert Watson
2539ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.pid, tok->len, err);
2540ca0716f5SRobert Watson if (err)
2541ca0716f5SRobert Watson return (-1);
2542ca0716f5SRobert Watson
2543ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.sid, tok->len, err);
2544ca0716f5SRobert Watson if (err)
2545ca0716f5SRobert Watson return (-1);
2546ca0716f5SRobert Watson
2547ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.tid.port, tok->len, err);
2548ca0716f5SRobert Watson if (err)
2549ca0716f5SRobert Watson return (-1);
2550ca0716f5SRobert Watson
2551506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.proc32.tid.addr,
2552506764c6SRobert Watson sizeof(tok->tt.proc32.tid.addr), tok->len, err);
2553ca0716f5SRobert Watson if (err)
2554ca0716f5SRobert Watson return (-1);
2555ca0716f5SRobert Watson
2556ca0716f5SRobert Watson return (0);
2557ca0716f5SRobert Watson }
2558ca0716f5SRobert Watson
2559ca0716f5SRobert Watson static void
print_process32_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2560aa772005SRobert Watson print_process32_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2561ca0716f5SRobert Watson {
2562ca0716f5SRobert Watson
2563aa772005SRobert Watson print_tok_type(fp, tok->id, "process", oflags);
2564aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2565bc168a6cSRobert Watson open_attr(fp, "audit-uid");
2566aa772005SRobert Watson print_user(fp, tok->tt.proc32.auid, oflags);
2567bc168a6cSRobert Watson close_attr(fp);
2568bc168a6cSRobert Watson open_attr(fp, "uid");
2569aa772005SRobert Watson print_user(fp, tok->tt.proc32.euid, oflags);
2570bc168a6cSRobert Watson close_attr(fp);
2571bc168a6cSRobert Watson open_attr(fp, "gid");
2572aa772005SRobert Watson print_group(fp, tok->tt.proc32.egid, oflags);
2573bc168a6cSRobert Watson close_attr(fp);
2574bc168a6cSRobert Watson open_attr(fp, "ruid");
2575aa772005SRobert Watson print_user(fp, tok->tt.proc32.ruid, oflags);
2576bc168a6cSRobert Watson close_attr(fp);
2577bc168a6cSRobert Watson open_attr(fp, "rgid");
2578aa772005SRobert Watson print_group(fp, tok->tt.proc32.rgid, oflags);
2579bc168a6cSRobert Watson close_attr(fp);
2580bc168a6cSRobert Watson open_attr(fp, "pid");
2581bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc32.pid, "%u");
2582bc168a6cSRobert Watson close_attr(fp);
2583bc168a6cSRobert Watson open_attr(fp, "sid");
2584bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc32.sid, "%u");
2585bc168a6cSRobert Watson close_attr(fp);
2586bc168a6cSRobert Watson open_attr(fp, "tid");
2587bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc32.tid.port, "%u");
2588bc168a6cSRobert Watson print_ip_address(fp, tok->tt.proc32.tid.addr);
2589bc168a6cSRobert Watson close_attr(fp);
2590bc168a6cSRobert Watson close_tag(fp, tok->id);
2591bc168a6cSRobert Watson } else {
2592ca0716f5SRobert Watson print_delim(fp, del);
2593aa772005SRobert Watson print_user(fp, tok->tt.proc32.auid, oflags);
2594ca0716f5SRobert Watson print_delim(fp, del);
2595aa772005SRobert Watson print_user(fp, tok->tt.proc32.euid, oflags);
2596ca0716f5SRobert Watson print_delim(fp, del);
2597aa772005SRobert Watson print_group(fp, tok->tt.proc32.egid, oflags);
2598ca0716f5SRobert Watson print_delim(fp, del);
2599aa772005SRobert Watson print_user(fp, tok->tt.proc32.ruid, oflags);
2600ca0716f5SRobert Watson print_delim(fp, del);
2601aa772005SRobert Watson print_group(fp, tok->tt.proc32.rgid, oflags);
2602ca0716f5SRobert Watson print_delim(fp, del);
2603ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.proc32.pid, "%u");
2604ca0716f5SRobert Watson print_delim(fp, del);
2605ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.proc32.sid, "%u");
2606ca0716f5SRobert Watson print_delim(fp, del);
2607ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.proc32.tid.port, "%u");
2608ca0716f5SRobert Watson print_delim(fp, del);
2609ca0716f5SRobert Watson print_ip_address(fp, tok->tt.proc32.tid.addr);
2610ca0716f5SRobert Watson }
2611bc168a6cSRobert Watson }
2612ca0716f5SRobert Watson
2613bc168a6cSRobert Watson /*
2614bc168a6cSRobert Watson * token ID 1 byte
2615bc168a6cSRobert Watson * audit ID 4 bytes
2616bc168a6cSRobert Watson * euid 4 bytes
2617bc168a6cSRobert Watson * egid 4 bytes
2618bc168a6cSRobert Watson * ruid 4 bytes
2619bc168a6cSRobert Watson * rgid 4 bytes
2620bc168a6cSRobert Watson * pid 4 bytes
2621bc168a6cSRobert Watson * sessid 4 bytes
2622bc168a6cSRobert Watson * terminal ID
2623bc168a6cSRobert Watson * portid 8 bytes
2624bc168a6cSRobert Watson * machine id 4 bytes
2625bc168a6cSRobert Watson */
2626ca0716f5SRobert Watson static int
fetch_process64_tok(tokenstr_t * tok,u_char * buf,int len)2627bc168a6cSRobert Watson fetch_process64_tok(tokenstr_t *tok, u_char *buf, int len)
2628bc168a6cSRobert Watson {
2629bc168a6cSRobert Watson int err = 0;
2630bc168a6cSRobert Watson
2631bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64.auid, tok->len, err);
2632bc168a6cSRobert Watson if (err)
2633bc168a6cSRobert Watson return (-1);
2634bc168a6cSRobert Watson
2635bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64.euid, tok->len, err);
2636bc168a6cSRobert Watson if (err)
2637bc168a6cSRobert Watson return (-1);
2638bc168a6cSRobert Watson
2639bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64.egid, tok->len, err);
2640bc168a6cSRobert Watson if (err)
2641bc168a6cSRobert Watson return (-1);
2642bc168a6cSRobert Watson
2643bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64.ruid, tok->len, err);
2644bc168a6cSRobert Watson if (err)
2645bc168a6cSRobert Watson return (-1);
2646bc168a6cSRobert Watson
2647bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64.rgid, tok->len, err);
2648bc168a6cSRobert Watson if (err)
2649bc168a6cSRobert Watson return (-1);
2650bc168a6cSRobert Watson
2651bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64.pid, tok->len, err);
2652bc168a6cSRobert Watson if (err)
2653bc168a6cSRobert Watson return (-1);
2654bc168a6cSRobert Watson
2655bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64.sid, tok->len, err);
2656bc168a6cSRobert Watson if (err)
2657bc168a6cSRobert Watson return (-1);
2658bc168a6cSRobert Watson
2659bc168a6cSRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.proc64.tid.port, tok->len, err);
2660bc168a6cSRobert Watson if (err)
2661bc168a6cSRobert Watson return (-1);
2662bc168a6cSRobert Watson
2663bc168a6cSRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.proc64.tid.addr,
2664bc168a6cSRobert Watson sizeof(tok->tt.proc64.tid.addr), tok->len, err);
2665bc168a6cSRobert Watson if (err)
2666bc168a6cSRobert Watson return (-1);
2667bc168a6cSRobert Watson
2668bc168a6cSRobert Watson return (0);
2669bc168a6cSRobert Watson }
2670bc168a6cSRobert Watson
2671bc168a6cSRobert Watson static void
print_process64_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2672aa772005SRobert Watson print_process64_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2673bc168a6cSRobert Watson {
2674aa772005SRobert Watson print_tok_type(fp, tok->id, "process", oflags);
2675aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2676bc168a6cSRobert Watson open_attr(fp, "audit-uid");
2677aa772005SRobert Watson print_user(fp, tok->tt.proc64.auid, oflags);
2678bc168a6cSRobert Watson close_attr(fp);
2679bc168a6cSRobert Watson open_attr(fp, "uid");
2680aa772005SRobert Watson print_user(fp, tok->tt.proc64.euid, oflags);
2681bc168a6cSRobert Watson close_attr(fp);
2682bc168a6cSRobert Watson open_attr(fp, "gid");
2683aa772005SRobert Watson print_group(fp, tok->tt.proc64.egid, oflags);
2684bc168a6cSRobert Watson close_attr(fp);
2685bc168a6cSRobert Watson open_attr(fp, "ruid");
2686aa772005SRobert Watson print_user(fp, tok->tt.proc64.ruid, oflags);
2687bc168a6cSRobert Watson close_attr(fp);
2688bc168a6cSRobert Watson open_attr(fp, "rgid");
2689aa772005SRobert Watson print_group(fp, tok->tt.proc64.rgid, oflags);
2690bc168a6cSRobert Watson close_attr(fp);
2691bc168a6cSRobert Watson open_attr(fp, "pid");
2692bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc64.pid, "%u");
2693bc168a6cSRobert Watson close_attr(fp);
2694bc168a6cSRobert Watson open_attr(fp, "sid");
2695bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc64.sid, "%u");
2696bc168a6cSRobert Watson close_attr(fp);
2697bc168a6cSRobert Watson open_attr(fp, "tid");
2698bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.proc64.tid.port, "%llu");
2699bc168a6cSRobert Watson print_ip_address(fp, tok->tt.proc64.tid.addr);
2700bc168a6cSRobert Watson close_attr(fp);
2701bc168a6cSRobert Watson close_tag(fp, tok->id);
2702bc168a6cSRobert Watson } else {
2703bc168a6cSRobert Watson print_delim(fp, del);
2704aa772005SRobert Watson print_user(fp, tok->tt.proc64.auid, oflags);
2705bc168a6cSRobert Watson print_delim(fp, del);
2706aa772005SRobert Watson print_user(fp, tok->tt.proc64.euid, oflags);
2707bc168a6cSRobert Watson print_delim(fp, del);
2708aa772005SRobert Watson print_group(fp, tok->tt.proc64.egid, oflags);
2709bc168a6cSRobert Watson print_delim(fp, del);
2710aa772005SRobert Watson print_user(fp, tok->tt.proc64.ruid, oflags);
2711bc168a6cSRobert Watson print_delim(fp, del);
2712aa772005SRobert Watson print_group(fp, tok->tt.proc64.rgid, oflags);
2713bc168a6cSRobert Watson print_delim(fp, del);
2714bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc64.pid, "%u");
2715bc168a6cSRobert Watson print_delim(fp, del);
2716bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc64.sid, "%u");
2717bc168a6cSRobert Watson print_delim(fp, del);
2718bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.proc64.tid.port, "%llu");
2719bc168a6cSRobert Watson print_delim(fp, del);
2720bc168a6cSRobert Watson print_ip_address(fp, tok->tt.proc64.tid.addr);
2721bc168a6cSRobert Watson }
2722bc168a6cSRobert Watson }
2723bc168a6cSRobert Watson
2724bc168a6cSRobert Watson /*
2725bc168a6cSRobert Watson * token ID 1 byte
2726bc168a6cSRobert Watson * audit ID 4 bytes
2727bc168a6cSRobert Watson * effective user ID 4 bytes
2728bc168a6cSRobert Watson * effective group ID 4 bytes
2729bc168a6cSRobert Watson * real user ID 4 bytes
2730bc168a6cSRobert Watson * real group ID 4 bytes
2731bc168a6cSRobert Watson * process ID 4 bytes
2732bc168a6cSRobert Watson * session ID 4 bytes
2733bc168a6cSRobert Watson * terminal ID
2734bc168a6cSRobert Watson * port ID 4 bytes
2735bc168a6cSRobert Watson * address type-len 4 bytes
2736bc168a6cSRobert Watson * machine address 16 bytes
2737bc168a6cSRobert Watson */
2738bc168a6cSRobert Watson static int
fetch_process32ex_tok(tokenstr_t * tok,u_char * buf,int len)2739bc168a6cSRobert Watson fetch_process32ex_tok(tokenstr_t *tok, u_char *buf, int len)
2740ca0716f5SRobert Watson {
2741ca0716f5SRobert Watson int err = 0;
2742ca0716f5SRobert Watson
2743ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.auid, tok->len, err);
2744ca0716f5SRobert Watson if (err)
2745ca0716f5SRobert Watson return (-1);
2746ca0716f5SRobert Watson
2747ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.euid, tok->len, err);
2748ca0716f5SRobert Watson if (err)
2749ca0716f5SRobert Watson return (-1);
2750ca0716f5SRobert Watson
2751ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.egid, tok->len, err);
2752ca0716f5SRobert Watson if (err)
2753ca0716f5SRobert Watson return (-1);
2754ca0716f5SRobert Watson
2755ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.ruid, tok->len, err);
2756ca0716f5SRobert Watson if (err)
2757ca0716f5SRobert Watson return (-1);
2758ca0716f5SRobert Watson
2759ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.rgid, tok->len, err);
2760ca0716f5SRobert Watson if (err)
2761ca0716f5SRobert Watson return (-1);
2762ca0716f5SRobert Watson
2763ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.pid, tok->len, err);
2764ca0716f5SRobert Watson if (err)
2765ca0716f5SRobert Watson return (-1);
2766ca0716f5SRobert Watson
2767ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.sid, tok->len, err);
2768ca0716f5SRobert Watson if (err)
2769ca0716f5SRobert Watson return (-1);
2770ca0716f5SRobert Watson
2771ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.tid.port, tok->len,
2772ca0716f5SRobert Watson err);
2773ca0716f5SRobert Watson if (err)
2774ca0716f5SRobert Watson return (-1);
2775ca0716f5SRobert Watson
2776ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.tid.type, tok->len,
2777ca0716f5SRobert Watson err);
2778ca0716f5SRobert Watson if (err)
2779ca0716f5SRobert Watson return (-1);
2780ca0716f5SRobert Watson
2781ca0716f5SRobert Watson if (tok->tt.proc32_ex.tid.type == AU_IPv4) {
2782ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.proc32_ex.tid.addr[0],
2783ca0716f5SRobert Watson sizeof(tok->tt.proc32_ex.tid.addr[0]), tok->len, err);
2784ca0716f5SRobert Watson if (err)
2785ca0716f5SRobert Watson return (-1);
2786ca0716f5SRobert Watson } else if (tok->tt.proc32_ex.tid.type == AU_IPv6) {
2787ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, tok->tt.proc32_ex.tid.addr,
2788ca0716f5SRobert Watson sizeof(tok->tt.proc32_ex.tid.addr), tok->len, err);
2789ca0716f5SRobert Watson if (err)
2790ca0716f5SRobert Watson return (-1);
2791ca0716f5SRobert Watson } else
2792ca0716f5SRobert Watson return (-1);
2793ca0716f5SRobert Watson
2794ca0716f5SRobert Watson return (0);
2795ca0716f5SRobert Watson }
2796ca0716f5SRobert Watson
2797ca0716f5SRobert Watson static void
print_process32ex_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2798aa772005SRobert Watson print_process32ex_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2799ca0716f5SRobert Watson {
2800ca0716f5SRobert Watson
2801aa772005SRobert Watson print_tok_type(fp, tok->id, "process_ex", oflags);
2802aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2803bc168a6cSRobert Watson open_attr(fp, "audit-uid");
2804aa772005SRobert Watson print_user(fp, tok->tt.proc32_ex.auid, oflags);
2805bc168a6cSRobert Watson close_attr(fp);
2806bc168a6cSRobert Watson open_attr(fp, "uid");
2807aa772005SRobert Watson print_user(fp, tok->tt.proc32_ex.euid, oflags);
2808bc168a6cSRobert Watson close_attr(fp);
2809bc168a6cSRobert Watson open_attr(fp, "gid");
2810aa772005SRobert Watson print_group(fp, tok->tt.proc32_ex.egid, oflags);
2811bc168a6cSRobert Watson close_attr(fp);
2812bc168a6cSRobert Watson open_attr(fp, "ruid");
2813aa772005SRobert Watson print_user(fp, tok->tt.proc32_ex.ruid, oflags);
2814bc168a6cSRobert Watson close_attr(fp);
2815bc168a6cSRobert Watson open_attr(fp, "rgid");
2816aa772005SRobert Watson print_group(fp, tok->tt.proc32_ex.rgid, oflags);
2817bc168a6cSRobert Watson close_attr(fp);
2818bc168a6cSRobert Watson open_attr(fp, "pid");
2819bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc32_ex.pid, "%u");
2820bc168a6cSRobert Watson close_attr(fp);
2821bc168a6cSRobert Watson open_attr(fp, "sid");
2822bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc32_ex.sid, "%u");
2823bc168a6cSRobert Watson close_attr(fp);
2824bc168a6cSRobert Watson open_attr(fp, "tid");
2825bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc32_ex.tid.port, "%u");
2826bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.proc32_ex.tid.type,
2827bc168a6cSRobert Watson tok->tt.proc32_ex.tid.addr);
2828bc168a6cSRobert Watson close_attr(fp);
2829bc168a6cSRobert Watson close_tag(fp, tok->id);
2830bc168a6cSRobert Watson } else {
2831ca0716f5SRobert Watson print_delim(fp, del);
2832aa772005SRobert Watson print_user(fp, tok->tt.proc32_ex.auid, oflags);
2833ca0716f5SRobert Watson print_delim(fp, del);
2834aa772005SRobert Watson print_user(fp, tok->tt.proc32_ex.euid, oflags);
2835ca0716f5SRobert Watson print_delim(fp, del);
2836aa772005SRobert Watson print_group(fp, tok->tt.proc32_ex.egid, oflags);
2837ca0716f5SRobert Watson print_delim(fp, del);
2838aa772005SRobert Watson print_user(fp, tok->tt.proc32_ex.ruid, oflags);
2839ca0716f5SRobert Watson print_delim(fp, del);
2840aa772005SRobert Watson print_group(fp, tok->tt.proc32_ex.rgid, oflags);
2841ca0716f5SRobert Watson print_delim(fp, del);
2842ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.proc32_ex.pid, "%u");
2843ca0716f5SRobert Watson print_delim(fp, del);
2844ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.proc32_ex.sid, "%u");
2845ca0716f5SRobert Watson print_delim(fp, del);
2846ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.proc32_ex.tid.port, "%u");
2847ca0716f5SRobert Watson print_delim(fp, del);
2848ca0716f5SRobert Watson print_ip_ex_address(fp, tok->tt.proc32_ex.tid.type,
2849ca0716f5SRobert Watson tok->tt.proc32_ex.tid.addr);
2850ca0716f5SRobert Watson }
2851bc168a6cSRobert Watson }
2852bc168a6cSRobert Watson
2853bc168a6cSRobert Watson /*
2854bc168a6cSRobert Watson * token ID 1 byte
2855bc168a6cSRobert Watson * audit ID 4 bytes
2856bc168a6cSRobert Watson * effective user ID 4 bytes
2857bc168a6cSRobert Watson * effective group ID 4 bytes
2858bc168a6cSRobert Watson * real user ID 4 bytes
2859bc168a6cSRobert Watson * real group ID 4 bytes
2860bc168a6cSRobert Watson * process ID 4 bytes
2861bc168a6cSRobert Watson * session ID 4 bytes
2862bc168a6cSRobert Watson * terminal ID
2863bc168a6cSRobert Watson * port ID 8 bytes
2864bc168a6cSRobert Watson * address type-len 4 bytes
2865bc168a6cSRobert Watson * machine address 16 bytes
2866bc168a6cSRobert Watson */
2867bc168a6cSRobert Watson static int
fetch_process64ex_tok(tokenstr_t * tok,u_char * buf,int len)2868bc168a6cSRobert Watson fetch_process64ex_tok(tokenstr_t *tok, u_char *buf, int len)
2869bc168a6cSRobert Watson {
2870bc168a6cSRobert Watson int err = 0;
2871bc168a6cSRobert Watson
2872bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64_ex.auid, tok->len, err);
2873bc168a6cSRobert Watson if (err)
2874bc168a6cSRobert Watson return (-1);
2875bc168a6cSRobert Watson
2876bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64_ex.euid, tok->len, err);
2877bc168a6cSRobert Watson if (err)
2878bc168a6cSRobert Watson return (-1);
2879bc168a6cSRobert Watson
2880bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64_ex.egid, tok->len, err);
2881bc168a6cSRobert Watson if (err)
2882bc168a6cSRobert Watson return (-1);
2883bc168a6cSRobert Watson
2884bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64_ex.ruid, tok->len, err);
2885bc168a6cSRobert Watson if (err)
2886bc168a6cSRobert Watson return (-1);
2887bc168a6cSRobert Watson
2888bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64_ex.rgid, tok->len, err);
2889bc168a6cSRobert Watson if (err)
2890bc168a6cSRobert Watson return (-1);
2891bc168a6cSRobert Watson
2892bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64_ex.pid, tok->len, err);
2893bc168a6cSRobert Watson if (err)
2894bc168a6cSRobert Watson return (-1);
2895bc168a6cSRobert Watson
2896bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64_ex.sid, tok->len, err);
2897bc168a6cSRobert Watson if (err)
2898bc168a6cSRobert Watson return (-1);
2899bc168a6cSRobert Watson
2900bc168a6cSRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.proc64_ex.tid.port, tok->len,
2901bc168a6cSRobert Watson err);
2902bc168a6cSRobert Watson if (err)
2903bc168a6cSRobert Watson return (-1);
2904bc168a6cSRobert Watson
2905bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.proc64_ex.tid.type, tok->len,
2906bc168a6cSRobert Watson err);
2907bc168a6cSRobert Watson if (err)
2908bc168a6cSRobert Watson return (-1);
2909bc168a6cSRobert Watson
2910bc168a6cSRobert Watson if (tok->tt.proc64_ex.tid.type == AU_IPv4) {
2911bc168a6cSRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.proc64_ex.tid.addr[0],
2912bc168a6cSRobert Watson sizeof(tok->tt.proc64_ex.tid.addr[0]), tok->len, err);
2913bc168a6cSRobert Watson if (err)
2914bc168a6cSRobert Watson return (-1);
2915bc168a6cSRobert Watson } else if (tok->tt.proc64_ex.tid.type == AU_IPv6) {
2916bc168a6cSRobert Watson READ_TOKEN_BYTES(buf, len, tok->tt.proc64_ex.tid.addr,
2917bc168a6cSRobert Watson sizeof(tok->tt.proc64_ex.tid.addr), tok->len, err);
2918bc168a6cSRobert Watson if (err)
2919bc168a6cSRobert Watson return (-1);
2920bc168a6cSRobert Watson } else
2921bc168a6cSRobert Watson return (-1);
2922bc168a6cSRobert Watson
2923bc168a6cSRobert Watson return (0);
2924bc168a6cSRobert Watson }
2925bc168a6cSRobert Watson
2926bc168a6cSRobert Watson static void
print_process64ex_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)2927aa772005SRobert Watson print_process64ex_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
2928bc168a6cSRobert Watson {
2929aa772005SRobert Watson print_tok_type(fp, tok->id, "process_ex", oflags);
2930aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
2931bc168a6cSRobert Watson open_attr(fp, "audit-uid");
2932aa772005SRobert Watson print_user(fp, tok->tt.proc64_ex.auid, oflags);
2933bc168a6cSRobert Watson close_attr(fp);
2934bc168a6cSRobert Watson open_attr(fp, "uid");
2935aa772005SRobert Watson print_user(fp, tok->tt.proc64_ex.euid, oflags);
2936bc168a6cSRobert Watson close_attr(fp);
2937bc168a6cSRobert Watson open_attr(fp, "gid");
2938aa772005SRobert Watson print_group(fp, tok->tt.proc64_ex.egid, oflags);
2939bc168a6cSRobert Watson close_attr(fp);
2940bc168a6cSRobert Watson open_attr(fp, "ruid");
2941aa772005SRobert Watson print_user(fp, tok->tt.proc64_ex.ruid, oflags);
2942bc168a6cSRobert Watson close_attr(fp);
2943bc168a6cSRobert Watson open_attr(fp, "rgid");
2944aa772005SRobert Watson print_group(fp, tok->tt.proc64_ex.rgid, oflags);
2945bc168a6cSRobert Watson close_attr(fp);
2946bc168a6cSRobert Watson open_attr(fp, "pid");
2947bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc64_ex.pid, "%u");
2948bc168a6cSRobert Watson close_attr(fp);
2949bc168a6cSRobert Watson open_attr(fp, "sid");
2950bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc64_ex.sid, "%u");
2951bc168a6cSRobert Watson close_attr(fp);
2952bc168a6cSRobert Watson open_attr(fp, "tid");
2953bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.proc64_ex.tid.port, "%llu");
2954bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.proc64_ex.tid.type,
2955bc168a6cSRobert Watson tok->tt.proc64_ex.tid.addr);
2956bc168a6cSRobert Watson close_attr(fp);
2957bc168a6cSRobert Watson close_tag(fp, tok->id);
2958bc168a6cSRobert Watson } else {
2959bc168a6cSRobert Watson print_delim(fp, del);
2960aa772005SRobert Watson print_user(fp, tok->tt.proc64_ex.auid, oflags);
2961bc168a6cSRobert Watson print_delim(fp, del);
2962aa772005SRobert Watson print_user(fp, tok->tt.proc64_ex.euid, oflags);
2963bc168a6cSRobert Watson print_delim(fp, del);
2964aa772005SRobert Watson print_group(fp, tok->tt.proc64_ex.egid, oflags);
2965bc168a6cSRobert Watson print_delim(fp, del);
2966aa772005SRobert Watson print_user(fp, tok->tt.proc64_ex.ruid, oflags);
2967bc168a6cSRobert Watson print_delim(fp, del);
2968aa772005SRobert Watson print_group(fp, tok->tt.proc64_ex.rgid, oflags);
2969bc168a6cSRobert Watson print_delim(fp, del);
2970bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc64_ex.pid, "%u");
2971bc168a6cSRobert Watson print_delim(fp, del);
2972bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.proc64_ex.sid, "%u");
2973bc168a6cSRobert Watson print_delim(fp, del);
2974bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.proc64_ex.tid.port, "%llu");
2975bc168a6cSRobert Watson print_delim(fp, del);
2976bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.proc64_ex.tid.type,
2977bc168a6cSRobert Watson tok->tt.proc64_ex.tid.addr);
2978bc168a6cSRobert Watson }
2979bc168a6cSRobert Watson }
2980ca0716f5SRobert Watson
2981ca0716f5SRobert Watson /*
2982ca0716f5SRobert Watson * errno 1 byte
2983ca0716f5SRobert Watson * return value 4 bytes
2984ca0716f5SRobert Watson */
2985ca0716f5SRobert Watson static int
fetch_return32_tok(tokenstr_t * tok,u_char * buf,int len)2986bc168a6cSRobert Watson fetch_return32_tok(tokenstr_t *tok, u_char *buf, int len)
2987ca0716f5SRobert Watson {
2988ca0716f5SRobert Watson int err = 0;
2989ca0716f5SRobert Watson
2990ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.ret32.status, tok->len, err);
2991ca0716f5SRobert Watson if (err)
2992ca0716f5SRobert Watson return (-1);
2993ca0716f5SRobert Watson
2994ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.ret32.ret, tok->len, err);
2995ca0716f5SRobert Watson if (err)
2996ca0716f5SRobert Watson return (-1);
2997ca0716f5SRobert Watson
2998ca0716f5SRobert Watson return (0);
2999ca0716f5SRobert Watson }
3000ca0716f5SRobert Watson
3001ca0716f5SRobert Watson static void
print_return32_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3002aa772005SRobert Watson print_return32_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3003ca0716f5SRobert Watson {
3004ca0716f5SRobert Watson
3005aa772005SRobert Watson print_tok_type(fp, tok->id, "return", oflags);
3006aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3007bc168a6cSRobert Watson open_attr(fp ,"errval");
3008aa772005SRobert Watson print_retval(fp, tok->tt.ret32.status, oflags);
3009bc168a6cSRobert Watson close_attr(fp);
3010bc168a6cSRobert Watson open_attr(fp, "retval");
3011bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.ret32.ret, "%u");
3012bc168a6cSRobert Watson close_attr(fp);
3013bc168a6cSRobert Watson close_tag(fp, tok->id);
3014bc168a6cSRobert Watson } else {
3015ca0716f5SRobert Watson print_delim(fp, del);
3016aa772005SRobert Watson print_retval(fp, tok->tt.ret32.status, oflags);
3017ca0716f5SRobert Watson print_delim(fp, del);
3018ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.ret32.ret, "%u");
3019ca0716f5SRobert Watson }
3020bc168a6cSRobert Watson }
3021ca0716f5SRobert Watson
3022ca0716f5SRobert Watson static int
fetch_return64_tok(tokenstr_t * tok,u_char * buf,int len)3023bc168a6cSRobert Watson fetch_return64_tok(tokenstr_t *tok, u_char *buf, int len)
3024ca0716f5SRobert Watson {
3025ca0716f5SRobert Watson int err = 0;
3026ca0716f5SRobert Watson
3027ca0716f5SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.ret64.err, tok->len, err);
3028ca0716f5SRobert Watson if (err)
3029ca0716f5SRobert Watson return (-1);
3030ca0716f5SRobert Watson
3031ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.ret64.val, tok->len, err);
3032ca0716f5SRobert Watson if (err)
3033ca0716f5SRobert Watson return (-1);
3034ca0716f5SRobert Watson
3035ca0716f5SRobert Watson return (0);
3036ca0716f5SRobert Watson }
3037ca0716f5SRobert Watson
3038ca0716f5SRobert Watson static void
print_return64_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3039aa772005SRobert Watson print_return64_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3040ca0716f5SRobert Watson {
3041ca0716f5SRobert Watson
3042aa772005SRobert Watson print_tok_type(fp, tok->id, "return", oflags);
3043aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3044bc168a6cSRobert Watson open_attr(fp, "errval");
3045aa772005SRobert Watson print_retval(fp, tok->tt.ret64.err, oflags);
3046bc168a6cSRobert Watson close_attr(fp);
3047bc168a6cSRobert Watson open_attr(fp, "retval");
3048bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.ret64.val, "%lld");
3049bc168a6cSRobert Watson close_attr(fp);
3050bc168a6cSRobert Watson close_tag(fp, tok->id);
3051bc168a6cSRobert Watson } else {
3052ca0716f5SRobert Watson print_delim(fp, del);
3053aa772005SRobert Watson print_retval(fp, tok->tt.ret64.err, oflags);
3054ca0716f5SRobert Watson print_delim(fp, del);
3055ca0716f5SRobert Watson print_8_bytes(fp, tok->tt.ret64.val, "%lld");
3056ca0716f5SRobert Watson }
3057bc168a6cSRobert Watson }
3058ca0716f5SRobert Watson
3059ca0716f5SRobert Watson /*
3060ca0716f5SRobert Watson * seq 4 bytes
3061ca0716f5SRobert Watson */
3062ca0716f5SRobert Watson static int
fetch_seq_tok(tokenstr_t * tok,u_char * buf,int len)3063bc168a6cSRobert Watson fetch_seq_tok(tokenstr_t *tok, u_char *buf, int len)
3064ca0716f5SRobert Watson {
3065ca0716f5SRobert Watson int err = 0;
3066ca0716f5SRobert Watson
3067ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.seq.seqno, tok->len, err);
3068ca0716f5SRobert Watson if (err)
3069ca0716f5SRobert Watson return (-1);
3070ca0716f5SRobert Watson
3071ca0716f5SRobert Watson return (0);
3072ca0716f5SRobert Watson }
3073ca0716f5SRobert Watson
3074ca0716f5SRobert Watson static void
print_seq_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3075aa772005SRobert Watson print_seq_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3076ca0716f5SRobert Watson {
3077ca0716f5SRobert Watson
3078aa772005SRobert Watson print_tok_type(fp, tok->id, "sequence", oflags);
3079aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3080bc168a6cSRobert Watson open_attr(fp, "seq-num");
3081bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.seq.seqno, "%u");
3082bc168a6cSRobert Watson close_attr(fp);
3083bc168a6cSRobert Watson close_tag(fp, tok->id);
3084bc168a6cSRobert Watson } else {
3085ca0716f5SRobert Watson print_delim(fp, del);
3086ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.seq.seqno, "%u");
3087ca0716f5SRobert Watson }
3088bc168a6cSRobert Watson }
3089ca0716f5SRobert Watson
3090ca0716f5SRobert Watson /*
3091ca0716f5SRobert Watson * socket family 2 bytes
3092ca0716f5SRobert Watson * local port 2 bytes
3093ca0716f5SRobert Watson * socket address 4 bytes
3094ca0716f5SRobert Watson */
3095ca0716f5SRobert Watson static int
fetch_sock_inet32_tok(tokenstr_t * tok,u_char * buf,int len)3096bc168a6cSRobert Watson fetch_sock_inet32_tok(tokenstr_t *tok, u_char *buf, int len)
3097ca0716f5SRobert Watson {
3098ca0716f5SRobert Watson int err = 0;
3099ca0716f5SRobert Watson
3100c0020399SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.sockinet_ex32.family, tok->len,
3101ca0716f5SRobert Watson err);
3102ca0716f5SRobert Watson if (err)
3103ca0716f5SRobert Watson return (-1);
3104ca0716f5SRobert Watson
3105c0020399SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.sockinet_ex32.port,
3106506764c6SRobert Watson sizeof(uint16_t), tok->len, err);
3107ca0716f5SRobert Watson if (err)
3108ca0716f5SRobert Watson return (-1);
3109ca0716f5SRobert Watson
3110c0020399SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.sockinet_ex32.addr,
3111c0020399SRobert Watson sizeof(tok->tt.sockinet_ex32.addr[0]), tok->len, err);
3112ca0716f5SRobert Watson if (err)
3113ca0716f5SRobert Watson return (-1);
3114ca0716f5SRobert Watson
3115ca0716f5SRobert Watson return (0);
3116ca0716f5SRobert Watson }
3117ca0716f5SRobert Watson
3118ca0716f5SRobert Watson static void
print_sock_inet32_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3119aa772005SRobert Watson print_sock_inet32_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3120ca0716f5SRobert Watson {
3121ca0716f5SRobert Watson
3122aa772005SRobert Watson print_tok_type(fp, tok->id, "socket-inet", oflags);
3123aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3124bc168a6cSRobert Watson open_attr(fp, "type");
3125c0020399SRobert Watson print_2_bytes(fp, tok->tt.sockinet_ex32.family, "%u");
3126bc168a6cSRobert Watson close_attr(fp);
3127bc168a6cSRobert Watson open_attr(fp, "port");
3128c0020399SRobert Watson print_2_bytes(fp, ntohs(tok->tt.sockinet_ex32.port), "%u");
3129bc168a6cSRobert Watson close_attr(fp);
3130bc168a6cSRobert Watson open_attr(fp, "addr");
3131c0020399SRobert Watson print_ip_address(fp, tok->tt.sockinet_ex32.addr[0]);
3132bc168a6cSRobert Watson close_attr(fp);
3133bc168a6cSRobert Watson close_tag(fp, tok->id);
3134bc168a6cSRobert Watson } else {
3135ca0716f5SRobert Watson print_delim(fp, del);
3136c0020399SRobert Watson print_2_bytes(fp, tok->tt.sockinet_ex32.family, "%u");
3137ca0716f5SRobert Watson print_delim(fp, del);
3138c0020399SRobert Watson print_2_bytes(fp, ntohs(tok->tt.sockinet_ex32.port), "%u");
3139ca0716f5SRobert Watson print_delim(fp, del);
3140c0020399SRobert Watson print_ip_address(fp, tok->tt.sockinet_ex32.addr[0]);
3141c0020399SRobert Watson }
3142c0020399SRobert Watson }
3143c0020399SRobert Watson
3144c0020399SRobert Watson /*
3145c0020399SRobert Watson * socket family 2 bytes
3146c0020399SRobert Watson * local port 2 bytes
3147c0020399SRobert Watson * socket address 16 bytes
3148c0020399SRobert Watson */
3149c0020399SRobert Watson static int
fetch_sock_inet128_tok(tokenstr_t * tok,u_char * buf,int len)3150c0020399SRobert Watson fetch_sock_inet128_tok(tokenstr_t *tok, u_char *buf, int len)
3151c0020399SRobert Watson {
3152c0020399SRobert Watson int err = 0;
3153c0020399SRobert Watson
3154c0020399SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.sockinet_ex32.family, tok->len,
3155c0020399SRobert Watson err);
3156c0020399SRobert Watson if (err)
3157c0020399SRobert Watson return (-1);
3158c0020399SRobert Watson
3159c0020399SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.sockinet_ex32.port,
3160c0020399SRobert Watson sizeof(uint16_t), tok->len, err);
3161c0020399SRobert Watson if (err)
3162c0020399SRobert Watson return (-1);
3163c0020399SRobert Watson
3164c0020399SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.sockinet_ex32.addr,
3165c0020399SRobert Watson sizeof(tok->tt.sockinet_ex32.addr), tok->len, err);
3166c0020399SRobert Watson if (err)
3167c0020399SRobert Watson return (-1);
3168c0020399SRobert Watson
3169c0020399SRobert Watson return (0);
3170c0020399SRobert Watson }
3171c0020399SRobert Watson
3172c0020399SRobert Watson static void
print_sock_inet128_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3173aa772005SRobert Watson print_sock_inet128_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3174c0020399SRobert Watson {
3175c0020399SRobert Watson
3176aa772005SRobert Watson print_tok_type(fp, tok->id, "socket-inet6", oflags);
3177aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3178c0020399SRobert Watson open_attr(fp, "type");
3179c0020399SRobert Watson print_2_bytes(fp, tok->tt.sockinet_ex32.family, "%u");
3180c0020399SRobert Watson close_attr(fp);
3181c0020399SRobert Watson open_attr(fp, "port");
3182c0020399SRobert Watson print_2_bytes(fp, ntohs(tok->tt.sockinet_ex32.port), "%u");
3183c0020399SRobert Watson close_attr(fp);
3184c0020399SRobert Watson open_attr(fp, "addr");
3185c0020399SRobert Watson print_ip_ex_address(fp, AU_IPv6, tok->tt.sockinet_ex32.addr);
3186c0020399SRobert Watson close_attr(fp);
3187c0020399SRobert Watson close_tag(fp, tok->id);
3188c0020399SRobert Watson } else {
3189c0020399SRobert Watson print_delim(fp, del);
3190c0020399SRobert Watson print_2_bytes(fp, tok->tt.sockinet_ex32.family, "%u");
3191c0020399SRobert Watson print_delim(fp, del);
3192c0020399SRobert Watson print_2_bytes(fp, ntohs(tok->tt.sockinet_ex32.port), "%u");
3193c0020399SRobert Watson print_delim(fp, del);
3194c0020399SRobert Watson print_ip_ex_address(fp, AU_IPv6, tok->tt.sockinet_ex32.addr);
3195ca0716f5SRobert Watson }
3196bc168a6cSRobert Watson }
3197ca0716f5SRobert Watson
3198ca0716f5SRobert Watson /*
3199ca0716f5SRobert Watson * socket family 2 bytes
3200597df30eSRobert Watson * path (up to) 104 bytes + NULL (NULL terminated string).
3201ca0716f5SRobert Watson */
3202506764c6SRobert Watson static int
fetch_sock_unix_tok(tokenstr_t * tok,u_char * buf,int len)3203bc168a6cSRobert Watson fetch_sock_unix_tok(tokenstr_t *tok, u_char *buf, int len)
3204ca0716f5SRobert Watson {
3205ca0716f5SRobert Watson int err = 0;
3206597df30eSRobert Watson u_char *p;
3207597df30eSRobert Watson int slen;
3208597df30eSRobert Watson
3209ca0716f5SRobert Watson
3210ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.sockunix.family, tok->len, err);
3211ca0716f5SRobert Watson if (err)
3212ca0716f5SRobert Watson return (-1);
3213ca0716f5SRobert Watson
3214597df30eSRobert Watson /* slen = strnlen((buf + tok->len), 104) + 1; */
3215597df30eSRobert Watson p = (u_char *)memchr((const void *)(buf + tok->len), '\0', 104);
3216597df30eSRobert Watson slen = (p ? (int)(p - (buf + tok->len)) : 104) + 1;
3217597df30eSRobert Watson
3218597df30eSRobert Watson READ_TOKEN_BYTES(buf, len, tok->tt.sockunix.path, slen, tok->len, err);
3219ca0716f5SRobert Watson if (err)
3220ca0716f5SRobert Watson return (-1);
3221ca0716f5SRobert Watson
3222ca0716f5SRobert Watson return (0);
3223ca0716f5SRobert Watson }
3224ca0716f5SRobert Watson
3225ca0716f5SRobert Watson static void
print_sock_unix_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3226aa772005SRobert Watson print_sock_unix_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3227ca0716f5SRobert Watson {
3228ca0716f5SRobert Watson
3229aa772005SRobert Watson print_tok_type(fp, tok->id, "socket-unix", oflags);
3230aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3231bc168a6cSRobert Watson open_attr(fp, "type");
3232bc168a6cSRobert Watson print_2_bytes(fp, tok->tt.sockunix.family, "%u");
3233bc168a6cSRobert Watson close_attr(fp);
3234bc168a6cSRobert Watson open_attr(fp, "port");
3235bc168a6cSRobert Watson close_attr(fp);
3236bc168a6cSRobert Watson open_attr(fp, "addr");
3237bc168a6cSRobert Watson print_string(fp, tok->tt.sockunix.path,
3238bc168a6cSRobert Watson strlen(tok->tt.sockunix.path));
3239bc168a6cSRobert Watson close_attr(fp);
3240bc168a6cSRobert Watson close_tag(fp, tok->id);
3241bc168a6cSRobert Watson } else {
3242ca0716f5SRobert Watson print_delim(fp, del);
3243ca0716f5SRobert Watson print_2_bytes(fp, tok->tt.sockunix.family, "%u");
3244ca0716f5SRobert Watson print_delim(fp, del);
3245ca0716f5SRobert Watson print_string(fp, tok->tt.sockunix.path,
3246ca0716f5SRobert Watson strlen(tok->tt.sockunix.path));
3247ca0716f5SRobert Watson }
3248bc168a6cSRobert Watson }
3249ca0716f5SRobert Watson
3250ca0716f5SRobert Watson /*
3251ca0716f5SRobert Watson * socket type 2 bytes
3252ca0716f5SRobert Watson * local port 2 bytes
3253ca0716f5SRobert Watson * local address 4 bytes
3254ca0716f5SRobert Watson * remote port 2 bytes
3255ca0716f5SRobert Watson * remote address 4 bytes
3256ca0716f5SRobert Watson */
3257506764c6SRobert Watson static int
fetch_socket_tok(tokenstr_t * tok,u_char * buf,int len)3258bc168a6cSRobert Watson fetch_socket_tok(tokenstr_t *tok, u_char *buf, int len)
3259ca0716f5SRobert Watson {
3260ca0716f5SRobert Watson int err = 0;
3261ca0716f5SRobert Watson
3262ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.socket.type, tok->len, err);
3263ca0716f5SRobert Watson if (err)
3264ca0716f5SRobert Watson return (-1);
3265ca0716f5SRobert Watson
3266506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket.l_port, sizeof(uint16_t),
3267506764c6SRobert Watson tok->len, err);
3268ca0716f5SRobert Watson if (err)
3269ca0716f5SRobert Watson return (-1);
3270ca0716f5SRobert Watson
3271ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket.l_addr,
3272ca0716f5SRobert Watson sizeof(tok->tt.socket.l_addr), tok->len, err);
3273ca0716f5SRobert Watson if (err)
3274ca0716f5SRobert Watson return (-1);
3275ca0716f5SRobert Watson
3276506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket.r_port, sizeof(uint16_t),
3277506764c6SRobert Watson tok->len, err);
3278ca0716f5SRobert Watson if (err)
3279ca0716f5SRobert Watson return (-1);
3280ca0716f5SRobert Watson
3281ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket.l_addr,
3282ca0716f5SRobert Watson sizeof(tok->tt.socket.r_addr), tok->len, err);
3283ca0716f5SRobert Watson if (err)
3284ca0716f5SRobert Watson return (-1);
3285ca0716f5SRobert Watson
3286ca0716f5SRobert Watson return (0);
3287ca0716f5SRobert Watson }
3288ca0716f5SRobert Watson
3289ca0716f5SRobert Watson static void
print_socket_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3290aa772005SRobert Watson print_socket_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3291ca0716f5SRobert Watson {
3292ca0716f5SRobert Watson
3293aa772005SRobert Watson print_tok_type(fp, tok->id, "socket", oflags);
3294aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3295bc168a6cSRobert Watson open_attr(fp, "sock_type");
3296bc168a6cSRobert Watson print_2_bytes(fp, tok->tt.socket.type, "%u");
3297bc168a6cSRobert Watson close_attr(fp);
3298bc168a6cSRobert Watson open_attr(fp, "lport");
3299bc168a6cSRobert Watson print_2_bytes(fp, ntohs(tok->tt.socket.l_port), "%u");
3300bc168a6cSRobert Watson close_attr(fp);
3301bc168a6cSRobert Watson open_attr(fp, "laddr");
3302bc168a6cSRobert Watson print_ip_address(fp, tok->tt.socket.l_addr);
3303bc168a6cSRobert Watson close_attr(fp);
3304bc168a6cSRobert Watson open_attr(fp, "fport");
3305bc168a6cSRobert Watson print_2_bytes(fp, ntohs(tok->tt.socket.r_port), "%u");
3306bc168a6cSRobert Watson close_attr(fp);
3307bc168a6cSRobert Watson open_attr(fp, "faddr");
3308bc168a6cSRobert Watson print_ip_address(fp, tok->tt.socket.r_addr);
3309bc168a6cSRobert Watson close_attr(fp);
3310bc168a6cSRobert Watson close_tag(fp, tok->id);
3311bc168a6cSRobert Watson } else {
3312ca0716f5SRobert Watson print_delim(fp, del);
3313ca0716f5SRobert Watson print_2_bytes(fp, tok->tt.socket.type, "%u");
3314ca0716f5SRobert Watson print_delim(fp, del);
3315506764c6SRobert Watson print_2_bytes(fp, ntohs(tok->tt.socket.l_port), "%u");
3316ca0716f5SRobert Watson print_delim(fp, del);
3317ca0716f5SRobert Watson print_ip_address(fp, tok->tt.socket.l_addr);
3318ca0716f5SRobert Watson print_delim(fp, del);
3319506764c6SRobert Watson print_2_bytes(fp, ntohs(tok->tt.socket.r_port), "%u");
3320ca0716f5SRobert Watson print_delim(fp, del);
3321ca0716f5SRobert Watson print_ip_address(fp, tok->tt.socket.r_addr);
3322ca0716f5SRobert Watson }
3323bc168a6cSRobert Watson }
3324ca0716f5SRobert Watson
3325ca0716f5SRobert Watson /*
3326ca0716f5SRobert Watson * audit ID 4 bytes
3327ca0716f5SRobert Watson * euid 4 bytes
3328ca0716f5SRobert Watson * egid 4 bytes
3329ca0716f5SRobert Watson * ruid 4 bytes
3330ca0716f5SRobert Watson * rgid 4 bytes
3331ca0716f5SRobert Watson * pid 4 bytes
3332ca0716f5SRobert Watson * sessid 4 bytes
3333ca0716f5SRobert Watson * terminal ID
3334ca0716f5SRobert Watson * portid 4 bytes/8 bytes (32-bit/64-bit value)
3335ca0716f5SRobert Watson * machine id 4 bytes
3336ca0716f5SRobert Watson */
3337ca0716f5SRobert Watson static int
fetch_subject32_tok(tokenstr_t * tok,u_char * buf,int len)3338bc168a6cSRobert Watson fetch_subject32_tok(tokenstr_t *tok, u_char *buf, int len)
3339ca0716f5SRobert Watson {
3340ca0716f5SRobert Watson int err = 0;
3341ca0716f5SRobert Watson
3342ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.auid, tok->len, err);
3343ca0716f5SRobert Watson if (err)
3344ca0716f5SRobert Watson return (-1);
3345ca0716f5SRobert Watson
3346ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.euid, tok->len, err);
3347ca0716f5SRobert Watson if (err)
3348ca0716f5SRobert Watson return (-1);
3349ca0716f5SRobert Watson
3350ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.egid, tok->len, err);
3351ca0716f5SRobert Watson if (err)
3352ca0716f5SRobert Watson return (-1);
3353ca0716f5SRobert Watson
3354ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.ruid, tok->len, err);
3355ca0716f5SRobert Watson if (err)
3356ca0716f5SRobert Watson return (-1);
3357ca0716f5SRobert Watson
3358ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.rgid, tok->len, err);
3359ca0716f5SRobert Watson if (err)
3360ca0716f5SRobert Watson return (-1);
3361ca0716f5SRobert Watson
3362ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.pid, tok->len, err);
3363ca0716f5SRobert Watson if (err)
3364ca0716f5SRobert Watson return (-1);
3365ca0716f5SRobert Watson
3366ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.sid, tok->len, err);
3367ca0716f5SRobert Watson if (err)
3368ca0716f5SRobert Watson return (-1);
3369ca0716f5SRobert Watson
3370ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.tid.port, tok->len, err);
3371ca0716f5SRobert Watson if (err)
3372ca0716f5SRobert Watson return (-1);
3373ca0716f5SRobert Watson
3374ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.subj32.tid.addr,
3375ca0716f5SRobert Watson sizeof(tok->tt.subj32.tid.addr), tok->len, err);
3376ca0716f5SRobert Watson if (err)
3377ca0716f5SRobert Watson return (-1);
3378ca0716f5SRobert Watson
3379ca0716f5SRobert Watson return (0);
3380ca0716f5SRobert Watson }
3381ca0716f5SRobert Watson
3382ca0716f5SRobert Watson static void
print_subject32_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3383aa772005SRobert Watson print_subject32_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3384ca0716f5SRobert Watson {
3385ca0716f5SRobert Watson
3386aa772005SRobert Watson print_tok_type(fp, tok->id, "subject", oflags);
3387aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3388bc168a6cSRobert Watson open_attr(fp, "audit-uid");
3389aa772005SRobert Watson print_user(fp, tok->tt.subj32.auid, oflags);
3390bc168a6cSRobert Watson close_attr(fp);
3391bc168a6cSRobert Watson open_attr(fp, "uid");
3392aa772005SRobert Watson print_user(fp, tok->tt.subj32.euid, oflags);
3393bc168a6cSRobert Watson close_attr(fp);
3394bc168a6cSRobert Watson open_attr(fp, "gid");
3395aa772005SRobert Watson print_group(fp, tok->tt.subj32.egid, oflags);
3396bc168a6cSRobert Watson close_attr(fp);
3397bc168a6cSRobert Watson open_attr(fp, "ruid");
3398aa772005SRobert Watson print_user(fp, tok->tt.subj32.ruid, oflags);
3399bc168a6cSRobert Watson close_attr(fp);
3400bc168a6cSRobert Watson open_attr(fp, "rgid");
3401aa772005SRobert Watson print_group(fp, tok->tt.subj32.rgid, oflags);
3402bc168a6cSRobert Watson close_attr(fp);
3403bc168a6cSRobert Watson open_attr(fp,"pid");
3404bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj32.pid, "%u");
3405bc168a6cSRobert Watson close_attr(fp);
3406bc168a6cSRobert Watson open_attr(fp,"sid");
3407bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj32.sid, "%u");
3408bc168a6cSRobert Watson close_attr(fp);
3409bc168a6cSRobert Watson open_attr(fp,"tid");
3410bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj32.tid.port, "%u ");
3411bc168a6cSRobert Watson print_ip_address(fp, tok->tt.subj32.tid.addr);
3412bc168a6cSRobert Watson close_attr(fp);
3413bc168a6cSRobert Watson close_tag(fp, tok->id);
3414bc168a6cSRobert Watson } else {
3415ca0716f5SRobert Watson print_delim(fp, del);
3416aa772005SRobert Watson print_user(fp, tok->tt.subj32.auid, oflags);
3417ca0716f5SRobert Watson print_delim(fp, del);
3418aa772005SRobert Watson print_user(fp, tok->tt.subj32.euid, oflags);
3419ca0716f5SRobert Watson print_delim(fp, del);
3420aa772005SRobert Watson print_group(fp, tok->tt.subj32.egid, oflags);
3421ca0716f5SRobert Watson print_delim(fp, del);
3422aa772005SRobert Watson print_user(fp, tok->tt.subj32.ruid, oflags);
3423ca0716f5SRobert Watson print_delim(fp, del);
3424aa772005SRobert Watson print_group(fp, tok->tt.subj32.rgid, oflags);
3425ca0716f5SRobert Watson print_delim(fp, del);
3426ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.subj32.pid, "%u");
3427ca0716f5SRobert Watson print_delim(fp, del);
3428ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.subj32.sid, "%u");
3429ca0716f5SRobert Watson print_delim(fp, del);
3430ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.subj32.tid.port, "%u");
3431ca0716f5SRobert Watson print_delim(fp, del);
3432ca0716f5SRobert Watson print_ip_address(fp, tok->tt.subj32.tid.addr);
3433ca0716f5SRobert Watson }
3434bc168a6cSRobert Watson }
3435ca0716f5SRobert Watson
3436aa772005SRobert Watson static void
print_upriv_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3437aa772005SRobert Watson print_upriv_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3438aa772005SRobert Watson {
3439aa772005SRobert Watson
3440aa772005SRobert Watson print_tok_type(fp, tok->id, "use of privilege", oflags);
3441aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3442aa772005SRobert Watson open_attr(fp, "status");
3443aa772005SRobert Watson if (tok->tt.priv.sorf)
3444aa772005SRobert Watson (void) fprintf(fp, "successful use of priv");
3445aa772005SRobert Watson else
3446aa772005SRobert Watson (void) fprintf(fp, "failed use of priv");
3447aa772005SRobert Watson close_attr(fp);
3448aa772005SRobert Watson open_attr(fp, "name");
3449aa772005SRobert Watson print_string(fp, tok->tt.priv.priv, tok->tt.priv.privstrlen);
3450aa772005SRobert Watson close_attr(fp);
3451aa772005SRobert Watson close_tag(fp, tok->id);
3452aa772005SRobert Watson } else {
3453aa772005SRobert Watson print_delim(fp, del);
3454aa772005SRobert Watson if (tok->tt.priv.sorf)
3455aa772005SRobert Watson (void) fprintf(fp, "successful use of priv");
3456aa772005SRobert Watson else
3457aa772005SRobert Watson (void) fprintf(fp, "failed use of priv");
3458aa772005SRobert Watson print_delim(fp, del);
3459aa772005SRobert Watson print_string(fp, tok->tt.priv.priv, tok->tt.priv.privstrlen);
3460aa772005SRobert Watson }
3461aa772005SRobert Watson }
3462aa772005SRobert Watson
3463aa772005SRobert Watson /*
3464aa772005SRobert Watson * status 1 byte
3465aa772005SRobert Watson * privstrlen 2 bytes
3466aa772005SRobert Watson * priv N bytes + 1 (\0 byte)
3467aa772005SRobert Watson */
3468aa772005SRobert Watson static int
fetch_priv_tok(tokenstr_t * tok,u_char * buf,int len)3469aa772005SRobert Watson fetch_priv_tok(tokenstr_t *tok, u_char *buf, int len)
3470aa772005SRobert Watson {
3471aa772005SRobert Watson int err = 0;
3472aa772005SRobert Watson
3473aa772005SRobert Watson READ_TOKEN_U_CHAR(buf, len, tok->tt.priv.sorf, tok->len, err);
3474aa772005SRobert Watson if (err)
3475aa772005SRobert Watson return (-1);
3476aa772005SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.priv.privstrlen, tok->len, err);
3477aa772005SRobert Watson if (err)
3478aa772005SRobert Watson return (-1);
3479aa772005SRobert Watson SET_PTR((char *)buf, len, tok->tt.priv.priv, tok->tt.priv.privstrlen,
3480aa772005SRobert Watson tok->len, err);
3481aa772005SRobert Watson if (err)
3482aa772005SRobert Watson return (-1);
3483aa772005SRobert Watson return (0);
3484aa772005SRobert Watson }
3485aa772005SRobert Watson
3486aa772005SRobert Watson /*
3487aa772005SRobert Watson * privtstrlen 1 byte
3488aa772005SRobert Watson * privtstr N bytes + 1
3489aa772005SRobert Watson * privstrlen 1 byte
3490aa772005SRobert Watson * privstr N bytes + 1
3491aa772005SRobert Watson */
3492aa772005SRobert Watson static int
fetch_privset_tok(tokenstr_t * tok,u_char * buf,int len)3493aa772005SRobert Watson fetch_privset_tok(tokenstr_t *tok, u_char *buf, int len)
3494aa772005SRobert Watson {
3495aa772005SRobert Watson int err = 0;
3496aa772005SRobert Watson
3497aa772005SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.privset.privtstrlen,
3498aa772005SRobert Watson tok->len, err);
3499aa772005SRobert Watson if (err)
3500aa772005SRobert Watson return (-1);
3501aa772005SRobert Watson SET_PTR((char *)buf, len, tok->tt.privset.privtstr,
3502aa772005SRobert Watson tok->tt.privset.privtstrlen, tok->len, err);
3503aa772005SRobert Watson if (err)
3504aa772005SRobert Watson return (-1);
3505aa772005SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.privset.privstrlen,
3506aa772005SRobert Watson tok->len, err);
3507aa772005SRobert Watson if (err)
3508aa772005SRobert Watson return (-1);
3509aa772005SRobert Watson SET_PTR((char *)buf, len, tok->tt.privset.privstr,
3510aa772005SRobert Watson tok->tt.privset.privstrlen, tok->len, err);
3511aa772005SRobert Watson if (err)
3512aa772005SRobert Watson return (-1);
3513aa772005SRobert Watson return (0);
3514aa772005SRobert Watson }
3515aa772005SRobert Watson
3516aa772005SRobert Watson static void
print_privset_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3517aa772005SRobert Watson print_privset_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3518aa772005SRobert Watson {
3519aa772005SRobert Watson
3520aa772005SRobert Watson print_tok_type(fp, tok->id, "privilege", oflags);
3521aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3522aa772005SRobert Watson open_attr(fp, "type");
3523aa772005SRobert Watson print_string(fp, tok->tt.privset.privtstr,
3524aa772005SRobert Watson tok->tt.privset.privtstrlen);
3525aa772005SRobert Watson close_attr(fp);
3526aa772005SRobert Watson open_attr(fp, "priv");
3527aa772005SRobert Watson print_string(fp, tok->tt.privset.privstr,
3528aa772005SRobert Watson tok->tt.privset.privstrlen);
3529aa772005SRobert Watson close_attr(fp);
3530aa772005SRobert Watson } else {
3531aa772005SRobert Watson print_delim(fp, del);
3532aa772005SRobert Watson print_string(fp, tok->tt.privset.privtstr,
3533aa772005SRobert Watson tok->tt.privset.privtstrlen);
3534aa772005SRobert Watson print_delim(fp, del);
3535aa772005SRobert Watson print_string(fp, tok->tt.privset.privstr,
3536aa772005SRobert Watson tok->tt.privset.privstrlen);
3537aa772005SRobert Watson }
3538aa772005SRobert Watson }
3539aa772005SRobert Watson
3540ca0716f5SRobert Watson /*
3541ca0716f5SRobert Watson * audit ID 4 bytes
3542ca0716f5SRobert Watson * euid 4 bytes
3543ca0716f5SRobert Watson * egid 4 bytes
3544ca0716f5SRobert Watson * ruid 4 bytes
3545ca0716f5SRobert Watson * rgid 4 bytes
3546ca0716f5SRobert Watson * pid 4 bytes
3547ca0716f5SRobert Watson * sessid 4 bytes
3548ca0716f5SRobert Watson * terminal ID
3549ca0716f5SRobert Watson * portid 4 bytes/8 bytes (32-bit/64-bit value)
3550ca0716f5SRobert Watson * machine id 4 bytes
3551ca0716f5SRobert Watson */
3552ca0716f5SRobert Watson static int
fetch_subject64_tok(tokenstr_t * tok,u_char * buf,int len)3553bc168a6cSRobert Watson fetch_subject64_tok(tokenstr_t *tok, u_char *buf, int len)
3554ca0716f5SRobert Watson {
3555ca0716f5SRobert Watson int err = 0;
3556ca0716f5SRobert Watson
3557ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.auid, tok->len, err);
3558ca0716f5SRobert Watson if (err)
3559ca0716f5SRobert Watson return (-1);
3560ca0716f5SRobert Watson
3561ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.euid, tok->len, err);
3562ca0716f5SRobert Watson if (err)
3563ca0716f5SRobert Watson return (-1);
3564ca0716f5SRobert Watson
3565ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.egid, tok->len, err);
3566ca0716f5SRobert Watson if (err)
3567ca0716f5SRobert Watson return (-1);
3568ca0716f5SRobert Watson
3569ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.ruid, tok->len, err);
3570ca0716f5SRobert Watson if (err)
3571ca0716f5SRobert Watson return (-1);
3572ca0716f5SRobert Watson
3573ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.rgid, tok->len, err);
3574ca0716f5SRobert Watson if (err)
3575ca0716f5SRobert Watson return (-1);
3576ca0716f5SRobert Watson
3577ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.pid, tok->len, err);
3578ca0716f5SRobert Watson if (err)
3579ca0716f5SRobert Watson return (-1);
3580ca0716f5SRobert Watson
3581ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.sid, tok->len, err);
3582ca0716f5SRobert Watson if (err)
3583ca0716f5SRobert Watson return (-1);
3584ca0716f5SRobert Watson
3585ca0716f5SRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.subj64.tid.port, tok->len, err);
3586ca0716f5SRobert Watson if (err)
3587ca0716f5SRobert Watson return (-1);
3588ca0716f5SRobert Watson
3589ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.subj64.tid.addr,
3590ca0716f5SRobert Watson sizeof(tok->tt.subj64.tid.addr), tok->len, err);
3591ca0716f5SRobert Watson if (err)
3592ca0716f5SRobert Watson return (-1);
3593ca0716f5SRobert Watson
3594ca0716f5SRobert Watson return (0);
3595ca0716f5SRobert Watson }
3596ca0716f5SRobert Watson
3597ca0716f5SRobert Watson static void
print_subject64_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3598aa772005SRobert Watson print_subject64_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3599ca0716f5SRobert Watson {
3600ca0716f5SRobert Watson
3601aa772005SRobert Watson print_tok_type(fp, tok->id, "subject", oflags);
3602aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3603bc168a6cSRobert Watson open_attr(fp, "audit-uid");
3604aa772005SRobert Watson print_user(fp, tok->tt.subj64.auid, oflags);
3605bc168a6cSRobert Watson close_attr(fp);
3606bc168a6cSRobert Watson open_attr(fp, "uid");
3607aa772005SRobert Watson print_user(fp, tok->tt.subj64.euid, oflags);
3608bc168a6cSRobert Watson close_attr(fp);
3609bc168a6cSRobert Watson open_attr(fp, "gid");
3610aa772005SRobert Watson print_group(fp, tok->tt.subj64.egid, oflags);
3611bc168a6cSRobert Watson close_attr(fp);
3612bc168a6cSRobert Watson open_attr(fp, "ruid");
3613aa772005SRobert Watson print_user(fp, tok->tt.subj64.ruid, oflags);
3614bc168a6cSRobert Watson close_attr(fp);
3615bc168a6cSRobert Watson open_attr(fp, "rgid");
3616aa772005SRobert Watson print_group(fp, tok->tt.subj64.rgid, oflags);
3617bc168a6cSRobert Watson close_attr(fp);
3618bc168a6cSRobert Watson open_attr(fp, "pid");
3619bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj64.pid, "%u");
3620bc168a6cSRobert Watson close_attr(fp);
3621bc168a6cSRobert Watson open_attr(fp, "sid");
3622bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj64.sid, "%u");
3623bc168a6cSRobert Watson close_attr(fp);
3624bc168a6cSRobert Watson open_attr(fp, "tid");
3625bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.subj64.tid.port, "%llu");
3626bc168a6cSRobert Watson print_ip_address(fp, tok->tt.subj64.tid.addr);
3627bc168a6cSRobert Watson close_attr(fp);
3628bc168a6cSRobert Watson close_tag(fp, tok->id);
3629bc168a6cSRobert Watson } else {
3630ca0716f5SRobert Watson print_delim(fp, del);
3631aa772005SRobert Watson print_user(fp, tok->tt.subj64.auid, oflags);
3632ca0716f5SRobert Watson print_delim(fp, del);
3633aa772005SRobert Watson print_user(fp, tok->tt.subj64.euid, oflags);
3634ca0716f5SRobert Watson print_delim(fp, del);
3635aa772005SRobert Watson print_group(fp, tok->tt.subj64.egid, oflags);
3636ca0716f5SRobert Watson print_delim(fp, del);
3637aa772005SRobert Watson print_user(fp, tok->tt.subj64.ruid, oflags);
3638ca0716f5SRobert Watson print_delim(fp, del);
3639aa772005SRobert Watson print_group(fp, tok->tt.subj64.rgid, oflags);
3640ca0716f5SRobert Watson print_delim(fp, del);
3641ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.subj64.pid, "%u");
3642ca0716f5SRobert Watson print_delim(fp, del);
3643ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.subj64.sid, "%u");
3644ca0716f5SRobert Watson print_delim(fp, del);
3645ca0716f5SRobert Watson print_8_bytes(fp, tok->tt.subj64.tid.port, "%llu");
3646ca0716f5SRobert Watson print_delim(fp, del);
3647ca0716f5SRobert Watson print_ip_address(fp, tok->tt.subj64.tid.addr);
3648ca0716f5SRobert Watson }
3649bc168a6cSRobert Watson }
3650ca0716f5SRobert Watson
3651ca0716f5SRobert Watson /*
3652ca0716f5SRobert Watson * audit ID 4 bytes
3653ca0716f5SRobert Watson * euid 4 bytes
3654ca0716f5SRobert Watson * egid 4 bytes
3655ca0716f5SRobert Watson * ruid 4 bytes
3656ca0716f5SRobert Watson * rgid 4 bytes
3657ca0716f5SRobert Watson * pid 4 bytes
3658ca0716f5SRobert Watson * sessid 4 bytes
3659ca0716f5SRobert Watson * terminal ID
3660ca0716f5SRobert Watson * portid 4 bytes
3661ca0716f5SRobert Watson * type 4 bytes
3662ca0716f5SRobert Watson * machine id 16 bytes
3663ca0716f5SRobert Watson */
3664ca0716f5SRobert Watson static int
fetch_subject32ex_tok(tokenstr_t * tok,u_char * buf,int len)3665bc168a6cSRobert Watson fetch_subject32ex_tok(tokenstr_t *tok, u_char *buf, int len)
3666ca0716f5SRobert Watson {
3667ca0716f5SRobert Watson int err = 0;
3668ca0716f5SRobert Watson
3669ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.auid, tok->len, err);
3670ca0716f5SRobert Watson if (err)
3671ca0716f5SRobert Watson return (-1);
3672ca0716f5SRobert Watson
3673ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.euid, tok->len, err);
3674ca0716f5SRobert Watson if (err)
3675ca0716f5SRobert Watson return (-1);
3676ca0716f5SRobert Watson
3677ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.egid, tok->len, err);
3678ca0716f5SRobert Watson if (err)
3679ca0716f5SRobert Watson return (-1);
3680ca0716f5SRobert Watson
3681ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.ruid, tok->len, err);
3682ca0716f5SRobert Watson if (err)
3683ca0716f5SRobert Watson return (-1);
3684ca0716f5SRobert Watson
3685ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.rgid, tok->len, err);
3686ca0716f5SRobert Watson if (err)
3687ca0716f5SRobert Watson return (-1);
3688ca0716f5SRobert Watson
3689ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.pid, tok->len, err);
3690ca0716f5SRobert Watson if (err)
3691ca0716f5SRobert Watson return (-1);
3692ca0716f5SRobert Watson
3693ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.sid, tok->len, err);
3694ca0716f5SRobert Watson if (err)
3695ca0716f5SRobert Watson return (-1);
3696ca0716f5SRobert Watson
3697ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.tid.port, tok->len,
3698ca0716f5SRobert Watson err);
3699ca0716f5SRobert Watson if (err)
3700ca0716f5SRobert Watson return (-1);
3701ca0716f5SRobert Watson
3702ca0716f5SRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.tid.type, tok->len,
3703ca0716f5SRobert Watson err);
3704ca0716f5SRobert Watson if (err)
3705ca0716f5SRobert Watson return (-1);
3706ca0716f5SRobert Watson
3707ca0716f5SRobert Watson if (tok->tt.subj32_ex.tid.type == AU_IPv4) {
3708ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.subj32_ex.tid.addr[0],
3709ca0716f5SRobert Watson sizeof(tok->tt.subj32_ex.tid.addr[0]), tok->len, err);
3710ca0716f5SRobert Watson if (err)
3711ca0716f5SRobert Watson return (-1);
3712ca0716f5SRobert Watson } else if (tok->tt.subj32_ex.tid.type == AU_IPv6) {
3713ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, tok->tt.subj32_ex.tid.addr,
3714ca0716f5SRobert Watson sizeof(tok->tt.subj32_ex.tid.addr), tok->len, err);
3715ca0716f5SRobert Watson if (err)
3716ca0716f5SRobert Watson return (-1);
3717ca0716f5SRobert Watson } else
3718ca0716f5SRobert Watson return (-1);
3719ca0716f5SRobert Watson
3720ca0716f5SRobert Watson return (0);
3721ca0716f5SRobert Watson }
3722ca0716f5SRobert Watson
3723ca0716f5SRobert Watson static void
print_subject32ex_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3724aa772005SRobert Watson print_subject32ex_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3725ca0716f5SRobert Watson {
3726ca0716f5SRobert Watson
3727aa772005SRobert Watson print_tok_type(fp, tok->id, "subject_ex", oflags);
3728aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3729bc168a6cSRobert Watson open_attr(fp, "audit-uid");
3730aa772005SRobert Watson print_user(fp, tok->tt.subj32_ex.auid, oflags);
3731bc168a6cSRobert Watson close_attr(fp);
3732bc168a6cSRobert Watson open_attr(fp, "uid");
3733aa772005SRobert Watson print_user(fp, tok->tt.subj32_ex.euid, oflags);
3734bc168a6cSRobert Watson close_attr(fp);
3735bc168a6cSRobert Watson open_attr(fp, "gid");
3736aa772005SRobert Watson print_group(fp, tok->tt.subj32_ex.egid, oflags);
3737bc168a6cSRobert Watson close_attr(fp);
3738bc168a6cSRobert Watson open_attr(fp, "ruid");
3739aa772005SRobert Watson print_user(fp, tok->tt.subj32_ex.ruid, oflags);
3740bc168a6cSRobert Watson close_attr(fp);
3741bc168a6cSRobert Watson open_attr(fp, "rgid");
3742aa772005SRobert Watson print_group(fp, tok->tt.subj32_ex.rgid, oflags);
3743bc168a6cSRobert Watson close_attr(fp);
3744bc168a6cSRobert Watson open_attr(fp, "pid");
3745bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj32_ex.pid, "%u");
3746bc168a6cSRobert Watson close_attr(fp);
3747bc168a6cSRobert Watson open_attr(fp, "sid");
3748bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj32_ex.sid, "%u");
3749bc168a6cSRobert Watson close_attr(fp);
3750bc168a6cSRobert Watson open_attr(fp, "tid");
3751bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj32_ex.tid.port, "%u");
3752bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.subj32_ex.tid.type,
3753bc168a6cSRobert Watson tok->tt.subj32_ex.tid.addr);
3754bc168a6cSRobert Watson close_attr(fp);
3755bc168a6cSRobert Watson close_tag(fp, tok->id);
3756bc168a6cSRobert Watson } else {
3757ca0716f5SRobert Watson print_delim(fp, del);
3758aa772005SRobert Watson print_user(fp, tok->tt.subj32_ex.auid, oflags);
3759ca0716f5SRobert Watson print_delim(fp, del);
3760aa772005SRobert Watson print_user(fp, tok->tt.subj32_ex.euid, oflags);
3761ca0716f5SRobert Watson print_delim(fp, del);
3762aa772005SRobert Watson print_group(fp, tok->tt.subj32_ex.egid, oflags);
3763ca0716f5SRobert Watson print_delim(fp, del);
3764aa772005SRobert Watson print_user(fp, tok->tt.subj32_ex.ruid, oflags);
3765ca0716f5SRobert Watson print_delim(fp, del);
3766aa772005SRobert Watson print_group(fp, tok->tt.subj32_ex.rgid, oflags);
3767ca0716f5SRobert Watson print_delim(fp, del);
3768ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.subj32_ex.pid, "%u");
3769ca0716f5SRobert Watson print_delim(fp, del);
3770ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.subj32_ex.sid, "%u");
3771ca0716f5SRobert Watson print_delim(fp, del);
3772ca0716f5SRobert Watson print_4_bytes(fp, tok->tt.subj32_ex.tid.port, "%u");
3773ca0716f5SRobert Watson print_delim(fp, del);
3774ca0716f5SRobert Watson print_ip_ex_address(fp, tok->tt.subj32_ex.tid.type,
3775ca0716f5SRobert Watson tok->tt.subj32_ex.tid.addr);
3776ca0716f5SRobert Watson }
3777bc168a6cSRobert Watson }
3778bc168a6cSRobert Watson
3779bc168a6cSRobert Watson /*
3780bc168a6cSRobert Watson * audit ID 4 bytes
3781bc168a6cSRobert Watson * euid 4 bytes
3782bc168a6cSRobert Watson * egid 4 bytes
3783bc168a6cSRobert Watson * ruid 4 bytes
3784bc168a6cSRobert Watson * rgid 4 bytes
3785bc168a6cSRobert Watson * pid 4 bytes
3786bc168a6cSRobert Watson * sessid 4 bytes
3787bc168a6cSRobert Watson * terminal ID
3788bc168a6cSRobert Watson * portid 8 bytes
3789bc168a6cSRobert Watson * type 4 bytes
3790bc168a6cSRobert Watson * machine id 16 bytes
3791bc168a6cSRobert Watson */
3792bc168a6cSRobert Watson static int
fetch_subject64ex_tok(tokenstr_t * tok,u_char * buf,int len)3793bc168a6cSRobert Watson fetch_subject64ex_tok(tokenstr_t *tok, u_char *buf, int len)
3794bc168a6cSRobert Watson {
3795bc168a6cSRobert Watson int err = 0;
3796bc168a6cSRobert Watson
3797bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64_ex.auid, tok->len, err);
3798bc168a6cSRobert Watson if (err)
3799bc168a6cSRobert Watson return (-1);
3800bc168a6cSRobert Watson
3801bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64_ex.euid, tok->len, err);
3802bc168a6cSRobert Watson if (err)
3803bc168a6cSRobert Watson return (-1);
3804bc168a6cSRobert Watson
3805bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64_ex.egid, tok->len, err);
3806bc168a6cSRobert Watson if (err)
3807bc168a6cSRobert Watson return (-1);
3808bc168a6cSRobert Watson
3809bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64_ex.ruid, tok->len, err);
3810bc168a6cSRobert Watson if (err)
3811bc168a6cSRobert Watson return (-1);
3812bc168a6cSRobert Watson
3813bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64_ex.rgid, tok->len, err);
3814bc168a6cSRobert Watson if (err)
3815bc168a6cSRobert Watson return (-1);
3816bc168a6cSRobert Watson
3817bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64_ex.pid, tok->len, err);
3818bc168a6cSRobert Watson if (err)
3819bc168a6cSRobert Watson return (-1);
3820bc168a6cSRobert Watson
3821bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64_ex.sid, tok->len, err);
3822bc168a6cSRobert Watson if (err)
3823bc168a6cSRobert Watson return (-1);
3824bc168a6cSRobert Watson
3825bc168a6cSRobert Watson READ_TOKEN_U_INT64(buf, len, tok->tt.subj64_ex.tid.port, tok->len,
3826bc168a6cSRobert Watson err);
3827bc168a6cSRobert Watson if (err)
3828bc168a6cSRobert Watson return (-1);
3829bc168a6cSRobert Watson
3830bc168a6cSRobert Watson READ_TOKEN_U_INT32(buf, len, tok->tt.subj64_ex.tid.type, tok->len,
3831bc168a6cSRobert Watson err);
3832bc168a6cSRobert Watson if (err)
3833bc168a6cSRobert Watson return (-1);
3834bc168a6cSRobert Watson
3835bc168a6cSRobert Watson if (tok->tt.subj64_ex.tid.type == AU_IPv4) {
3836bc168a6cSRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.subj64_ex.tid.addr[0],
3837bc168a6cSRobert Watson sizeof(tok->tt.subj64_ex.tid.addr[0]), tok->len, err);
3838bc168a6cSRobert Watson if (err)
3839bc168a6cSRobert Watson return (-1);
3840bc168a6cSRobert Watson } else if (tok->tt.subj64_ex.tid.type == AU_IPv6) {
3841bc168a6cSRobert Watson READ_TOKEN_BYTES(buf, len, tok->tt.subj64_ex.tid.addr,
3842bc168a6cSRobert Watson sizeof(tok->tt.subj64_ex.tid.addr), tok->len, err);
3843bc168a6cSRobert Watson if (err)
3844bc168a6cSRobert Watson return (-1);
3845bc168a6cSRobert Watson } else
3846bc168a6cSRobert Watson return (-1);
3847bc168a6cSRobert Watson
3848bc168a6cSRobert Watson return (0);
3849bc168a6cSRobert Watson }
3850bc168a6cSRobert Watson
3851bc168a6cSRobert Watson static void
print_subject64ex_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3852aa772005SRobert Watson print_subject64ex_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3853bc168a6cSRobert Watson {
3854aa772005SRobert Watson print_tok_type(fp, tok->id, "subject_ex", oflags);
3855aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3856bc168a6cSRobert Watson open_attr(fp, "audit-uid");
3857aa772005SRobert Watson print_user(fp, tok->tt.subj64_ex.auid, oflags);
3858bc168a6cSRobert Watson close_attr(fp);
3859bc168a6cSRobert Watson open_attr(fp, "uid");
3860aa772005SRobert Watson print_user(fp, tok->tt.subj64_ex.euid, oflags);
3861bc168a6cSRobert Watson close_attr(fp);
3862bc168a6cSRobert Watson open_attr(fp, "gid");
3863aa772005SRobert Watson print_group(fp, tok->tt.subj64_ex.egid, oflags);
3864bc168a6cSRobert Watson close_attr(fp);
3865bc168a6cSRobert Watson open_attr(fp, "ruid");
3866aa772005SRobert Watson print_user(fp, tok->tt.subj64_ex.ruid, oflags);
3867bc168a6cSRobert Watson close_attr(fp);
3868bc168a6cSRobert Watson open_attr(fp, "rgid");
3869aa772005SRobert Watson print_group(fp, tok->tt.subj64_ex.rgid, oflags);
3870bc168a6cSRobert Watson close_attr(fp);
3871bc168a6cSRobert Watson open_attr(fp, "pid");
3872bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj64_ex.pid, "%u");
3873bc168a6cSRobert Watson close_attr(fp);
3874bc168a6cSRobert Watson open_attr(fp, "sid");
3875bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj64_ex.sid, "%u");
3876bc168a6cSRobert Watson close_attr(fp);
3877bc168a6cSRobert Watson open_attr(fp, "tid");
3878bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.subj64_ex.tid.port, "%llu");
3879bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.subj64_ex.tid.type,
3880bc168a6cSRobert Watson tok->tt.subj64_ex.tid.addr);
3881bc168a6cSRobert Watson close_attr(fp);
3882bc168a6cSRobert Watson close_tag(fp, tok->id);
3883bc168a6cSRobert Watson } else {
3884bc168a6cSRobert Watson print_delim(fp, del);
3885aa772005SRobert Watson print_user(fp, tok->tt.subj64_ex.auid, oflags);
3886bc168a6cSRobert Watson print_delim(fp, del);
3887aa772005SRobert Watson print_user(fp, tok->tt.subj64_ex.euid, oflags);
3888bc168a6cSRobert Watson print_delim(fp, del);
3889aa772005SRobert Watson print_group(fp, tok->tt.subj64_ex.egid, oflags);
3890bc168a6cSRobert Watson print_delim(fp, del);
3891aa772005SRobert Watson print_user(fp, tok->tt.subj64_ex.ruid, oflags);
3892bc168a6cSRobert Watson print_delim(fp, del);
3893aa772005SRobert Watson print_group(fp, tok->tt.subj64_ex.rgid, oflags);
3894bc168a6cSRobert Watson print_delim(fp, del);
3895bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj64_ex.pid, "%u");
3896bc168a6cSRobert Watson print_delim(fp, del);
3897bc168a6cSRobert Watson print_4_bytes(fp, tok->tt.subj64_ex.sid, "%u");
3898bc168a6cSRobert Watson print_delim(fp, del);
3899bc168a6cSRobert Watson print_8_bytes(fp, tok->tt.subj64_ex.tid.port, "%llu");
3900bc168a6cSRobert Watson print_delim(fp, del);
3901bc168a6cSRobert Watson print_ip_ex_address(fp, tok->tt.subj64_ex.tid.type,
3902bc168a6cSRobert Watson tok->tt.subj64_ex.tid.addr);
3903bc168a6cSRobert Watson }
3904bc168a6cSRobert Watson }
3905ca0716f5SRobert Watson
3906ca0716f5SRobert Watson /*
3907ca0716f5SRobert Watson * size 2 bytes
3908ca0716f5SRobert Watson * data size bytes
3909ca0716f5SRobert Watson */
3910ca0716f5SRobert Watson static int
fetch_text_tok(tokenstr_t * tok,u_char * buf,int len)3911bc168a6cSRobert Watson fetch_text_tok(tokenstr_t *tok, u_char *buf, int len)
3912ca0716f5SRobert Watson {
3913ca0716f5SRobert Watson int err = 0;
3914ca0716f5SRobert Watson
3915ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.text.len, tok->len, err);
3916ca0716f5SRobert Watson if (err)
3917ca0716f5SRobert Watson return (-1);
3918ca0716f5SRobert Watson
3919bc168a6cSRobert Watson SET_PTR((char*)buf, len, tok->tt.text.text, tok->tt.text.len, tok->len,
3920ca0716f5SRobert Watson err);
3921ca0716f5SRobert Watson if (err)
3922ca0716f5SRobert Watson return (-1);
3923ca0716f5SRobert Watson
3924ca0716f5SRobert Watson return (0);
3925ca0716f5SRobert Watson }
3926ca0716f5SRobert Watson
3927ca0716f5SRobert Watson static void
print_text_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)3928aa772005SRobert Watson print_text_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
3929ca0716f5SRobert Watson {
3930ca0716f5SRobert Watson
3931aa772005SRobert Watson print_tok_type(fp, tok->id, "text", oflags);
3932aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
3933bc168a6cSRobert Watson print_string(fp, tok->tt.text.text, tok->tt.text.len);
3934bc168a6cSRobert Watson close_tag(fp, tok->id);
3935bc168a6cSRobert Watson } else {
3936ca0716f5SRobert Watson print_delim(fp, del);
3937ca0716f5SRobert Watson print_string(fp, tok->tt.text.text, tok->tt.text.len);
3938ca0716f5SRobert Watson }
3939bc168a6cSRobert Watson }
3940ca0716f5SRobert Watson
3941ca0716f5SRobert Watson /*
39427a0a89d2SRobert Watson * socket domain 2 bytes
3943ca0716f5SRobert Watson * socket type 2 bytes
39447a0a89d2SRobert Watson * address type 2 bytes
3945ca0716f5SRobert Watson * local port 2 bytes
39467a0a89d2SRobert Watson * local Internet address 4/16 bytes
39477a0a89d2SRobert Watson * remote port 2 bytes
39487a0a89d2SRobert Watson * remote Internet address 4/16 bytes
3949ca0716f5SRobert Watson */
3950ca0716f5SRobert Watson static int
fetch_socketex32_tok(tokenstr_t * tok,u_char * buf,int len)3951bc168a6cSRobert Watson fetch_socketex32_tok(tokenstr_t *tok, u_char *buf, int len)
3952ca0716f5SRobert Watson {
3953ca0716f5SRobert Watson int err = 0;
3954ca0716f5SRobert Watson
39557a0a89d2SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.socket_ex32.domain, tok->len,
39567a0a89d2SRobert Watson err);
39577a0a89d2SRobert Watson if (err)
39587a0a89d2SRobert Watson return (-1);
39597a0a89d2SRobert Watson
3960ca0716f5SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.socket_ex32.type, tok->len,
3961ca0716f5SRobert Watson err);
3962ca0716f5SRobert Watson if (err)
3963ca0716f5SRobert Watson return (-1);
3964ca0716f5SRobert Watson
39657a0a89d2SRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.socket_ex32.atype, tok->len,
39667a0a89d2SRobert Watson err);
39677a0a89d2SRobert Watson if (err)
39687a0a89d2SRobert Watson return (-1);
39697a0a89d2SRobert Watson
39707a0a89d2SRobert Watson if (tok->tt.socket_ex32.atype != AU_IPv4 &&
39717a0a89d2SRobert Watson tok->tt.socket_ex32.atype != AU_IPv6)
39727a0a89d2SRobert Watson return (-1);
39737a0a89d2SRobert Watson
3974506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.l_port,
3975506764c6SRobert Watson sizeof(uint16_t), tok->len, err);
3976ca0716f5SRobert Watson if (err)
3977ca0716f5SRobert Watson return (-1);
3978ca0716f5SRobert Watson
39797a0a89d2SRobert Watson if (tok->tt.socket_ex32.atype == AU_IPv4) {
39807a0a89d2SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.l_addr,
39817a0a89d2SRobert Watson sizeof(tok->tt.socket_ex32.l_addr[0]), tok->len, err);
3982ca0716f5SRobert Watson if (err)
3983ca0716f5SRobert Watson return (-1);
39847a0a89d2SRobert Watson } else {
3985ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.l_addr,
3986ca0716f5SRobert Watson sizeof(tok->tt.socket_ex32.l_addr), tok->len, err);
3987ca0716f5SRobert Watson if (err)
3988ca0716f5SRobert Watson return (-1);
39897a0a89d2SRobert Watson }
3990ca0716f5SRobert Watson
3991506764c6SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.r_port,
3992506764c6SRobert Watson sizeof(uint16_t), tok->len, err);
3993ca0716f5SRobert Watson if (err)
3994ca0716f5SRobert Watson return (-1);
3995ca0716f5SRobert Watson
39967a0a89d2SRobert Watson if (tok->tt.socket_ex32.atype == AU_IPv4) {
39977a0a89d2SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.r_addr,
39987a0a89d2SRobert Watson sizeof(tok->tt.socket_ex32.r_addr[0]), tok->len, err);
3999ca0716f5SRobert Watson if (err)
4000ca0716f5SRobert Watson return (-1);
40017a0a89d2SRobert Watson } else {
4002ca0716f5SRobert Watson READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.r_addr,
4003ca0716f5SRobert Watson sizeof(tok->tt.socket_ex32.r_addr), tok->len, err);
4004ca0716f5SRobert Watson if (err)
4005ca0716f5SRobert Watson return (-1);
40067a0a89d2SRobert Watson }
4007ca0716f5SRobert Watson
4008ca0716f5SRobert Watson return (0);
4009ca0716f5SRobert Watson }
4010ca0716f5SRobert Watson
4011ca0716f5SRobert Watson static void
print_socketex32_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)4012aa772005SRobert Watson print_socketex32_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
4013ca0716f5SRobert Watson {
4014ca0716f5SRobert Watson
4015c74c7b73SRobert Watson /*
4016c74c7b73SRobert Watson * This print routine prints BSM constant space domains and socket
4017c74c7b73SRobert Watson * types rather than converting them. If we add string printers for
4018c74c7b73SRobert Watson * these constants in the future, we may want to call conversion
4019c74c7b73SRobert Watson * routines.
4020c74c7b73SRobert Watson */
4021aa772005SRobert Watson print_tok_type(fp, tok->id, "socket", oflags);
4022aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
40237a0a89d2SRobert Watson open_attr(fp, "sock_dom");
40247a0a89d2SRobert Watson print_2_bytes(fp, tok->tt.socket_ex32.domain, "%#x");
40257a0a89d2SRobert Watson close_attr(fp);
4026bc168a6cSRobert Watson open_attr(fp, "sock_type");
4027bc168a6cSRobert Watson print_2_bytes(fp, tok->tt.socket_ex32.type, "%#x");
4028bc168a6cSRobert Watson close_attr(fp);
4029bc168a6cSRobert Watson open_attr(fp, "lport");
4030bc168a6cSRobert Watson print_2_bytes(fp, ntohs(tok->tt.socket_ex32.l_port), "%#x");
4031bc168a6cSRobert Watson close_attr(fp);
4032bc168a6cSRobert Watson open_attr(fp, "laddr");
40337a0a89d2SRobert Watson print_ip_ex_address(fp, tok->tt.socket_ex32.atype,
40347a0a89d2SRobert Watson tok->tt.socket_ex32.l_addr);
4035bc168a6cSRobert Watson close_attr(fp);
4036bc168a6cSRobert Watson open_attr(fp, "faddr");
40377a0a89d2SRobert Watson print_ip_ex_address(fp, tok->tt.socket_ex32.atype,
40387a0a89d2SRobert Watson tok->tt.socket_ex32.r_addr);
4039bc168a6cSRobert Watson close_attr(fp);
4040bc168a6cSRobert Watson open_attr(fp, "fport");
404152267f74SRobert Watson print_2_bytes(fp, ntohs(tok->tt.socket_ex32.r_port), "%#x");
4042bc168a6cSRobert Watson close_attr(fp);
4043bc168a6cSRobert Watson close_tag(fp, tok->id);
4044bc168a6cSRobert Watson } else {
4045ca0716f5SRobert Watson print_delim(fp, del);
40467a0a89d2SRobert Watson print_2_bytes(fp, tok->tt.socket_ex32.domain, "%#x");
40477a0a89d2SRobert Watson print_delim(fp, del);
4048ca0716f5SRobert Watson print_2_bytes(fp, tok->tt.socket_ex32.type, "%#x");
4049ca0716f5SRobert Watson print_delim(fp, del);
4050506764c6SRobert Watson print_2_bytes(fp, ntohs(tok->tt.socket_ex32.l_port), "%#x");
4051ca0716f5SRobert Watson print_delim(fp, del);
40527a0a89d2SRobert Watson print_ip_ex_address(fp, tok->tt.socket_ex32.atype,
40537a0a89d2SRobert Watson tok->tt.socket_ex32.l_addr);
4054ca0716f5SRobert Watson print_delim(fp, del);
4055506764c6SRobert Watson print_4_bytes(fp, ntohs(tok->tt.socket_ex32.r_port), "%#x");
4056ca0716f5SRobert Watson print_delim(fp, del);
40577a0a89d2SRobert Watson print_ip_ex_address(fp, tok->tt.socket_ex32.atype,
40587a0a89d2SRobert Watson tok->tt.socket_ex32.r_addr);
4059ca0716f5SRobert Watson }
4060bc168a6cSRobert Watson }
4061ca0716f5SRobert Watson
4062ca0716f5SRobert Watson static int
fetch_invalid_tok(tokenstr_t * tok,u_char * buf,int len)4063bc168a6cSRobert Watson fetch_invalid_tok(tokenstr_t *tok, u_char *buf, int len)
4064ca0716f5SRobert Watson {
4065ca0716f5SRobert Watson int err = 0;
4066ca0716f5SRobert Watson int recoversize;
4067ca0716f5SRobert Watson
406822ccb20dSRobert Watson recoversize = len - (tok->len + AUDIT_TRAILER_SIZE);
4069ca0716f5SRobert Watson if (recoversize <= 0)
4070ca0716f5SRobert Watson return (-1);
4071ca0716f5SRobert Watson
4072ca0716f5SRobert Watson tok->tt.invalid.length = recoversize;
4073ca0716f5SRobert Watson
4074bc168a6cSRobert Watson SET_PTR((char*)buf, len, tok->tt.invalid.data, recoversize, tok->len,
4075bc168a6cSRobert Watson err);
4076ca0716f5SRobert Watson if (err)
4077ca0716f5SRobert Watson return (-1);
4078ca0716f5SRobert Watson
4079ca0716f5SRobert Watson return (0);
4080ca0716f5SRobert Watson }
4081ca0716f5SRobert Watson
4082ca0716f5SRobert Watson static void
print_invalid_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)4083aa772005SRobert Watson print_invalid_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
4084ca0716f5SRobert Watson {
4085ca0716f5SRobert Watson
4086aa772005SRobert Watson if (!(oflags & AU_OFLAG_XML)) {
4087aa772005SRobert Watson print_tok_type(fp, tok->id, "unknown", oflags);
4088ca0716f5SRobert Watson print_delim(fp, del);
4089bc168a6cSRobert Watson print_mem(fp, (u_char*)tok->tt.invalid.data,
4090bc168a6cSRobert Watson tok->tt.invalid.length);
4091bc168a6cSRobert Watson }
4092ca0716f5SRobert Watson }
4093ca0716f5SRobert Watson
4094ca0716f5SRobert Watson
4095ca0716f5SRobert Watson /*
4096bc168a6cSRobert Watson * size 2 bytes;
4097bc168a6cSRobert Watson * zonename size bytes;
4098bc168a6cSRobert Watson */
4099bc168a6cSRobert Watson static int
fetch_zonename_tok(tokenstr_t * tok,u_char * buf,int len)4100eb336521SRobert Watson fetch_zonename_tok(tokenstr_t *tok, u_char *buf, int len)
4101bc168a6cSRobert Watson {
4102bc168a6cSRobert Watson int err = 0;
4103bc168a6cSRobert Watson
4104bc168a6cSRobert Watson READ_TOKEN_U_INT16(buf, len, tok->tt.zonename.len, tok->len, err);
4105bc168a6cSRobert Watson if (err)
4106bc168a6cSRobert Watson return (-1);
4107eb336521SRobert Watson SET_PTR((char *)buf, len, tok->tt.zonename.zonename, tok->tt.zonename.len,
4108bc168a6cSRobert Watson tok->len, err);
4109bc168a6cSRobert Watson if (err)
4110bc168a6cSRobert Watson return (-1);
4111bc168a6cSRobert Watson return (0);
4112bc168a6cSRobert Watson }
4113bc168a6cSRobert Watson
4114bc168a6cSRobert Watson static void
print_zonename_tok(FILE * fp,tokenstr_t * tok,char * del,int oflags)4115aa772005SRobert Watson print_zonename_tok(FILE *fp, tokenstr_t *tok, char *del, int oflags)
4116bc168a6cSRobert Watson {
4117bc168a6cSRobert Watson
4118aa772005SRobert Watson print_tok_type(fp, tok->id, "zone", oflags);
4119aa772005SRobert Watson if (oflags & AU_OFLAG_XML) {
4120bc168a6cSRobert Watson open_attr(fp, "name");
4121bc168a6cSRobert Watson print_string(fp, tok->tt.zonename.zonename,
4122bc168a6cSRobert Watson tok->tt.zonename.len);
4123bc168a6cSRobert Watson close_attr(fp);
4124bc168a6cSRobert Watson close_tag(fp, tok->id);
4125bc168a6cSRobert Watson } else {
4126bc168a6cSRobert Watson print_delim(fp, del);
4127bc168a6cSRobert Watson print_string(fp, tok->tt.zonename.zonename,
4128bc168a6cSRobert Watson tok->tt.zonename.len);
4129bc168a6cSRobert Watson }
4130bc168a6cSRobert Watson }
4131bc168a6cSRobert Watson
4132bc168a6cSRobert Watson /*
4133ca0716f5SRobert Watson * Reads the token beginning at buf into tok.
4134ca0716f5SRobert Watson */
4135ca0716f5SRobert Watson int
au_fetch_tok(tokenstr_t * tok,u_char * buf,int len)4136ca0716f5SRobert Watson au_fetch_tok(tokenstr_t *tok, u_char *buf, int len)
4137ca0716f5SRobert Watson {
4138ca0716f5SRobert Watson
4139ca0716f5SRobert Watson if (len <= 0)
4140ca0716f5SRobert Watson return (-1);
4141ca0716f5SRobert Watson
4142ca0716f5SRobert Watson tok->len = 1;
4143ca0716f5SRobert Watson tok->data = buf;
4144ca0716f5SRobert Watson tok->id = *buf;
4145ca0716f5SRobert Watson
4146ca0716f5SRobert Watson switch(tok->id) {
4147ca0716f5SRobert Watson case AUT_HEADER32:
4148ca0716f5SRobert Watson return (fetch_header32_tok(tok, buf, len));
4149ca0716f5SRobert Watson
4150ca0716f5SRobert Watson case AUT_HEADER32_EX:
4151ca0716f5SRobert Watson return (fetch_header32_ex_tok(tok, buf, len));
4152ca0716f5SRobert Watson
4153ca0716f5SRobert Watson case AUT_HEADER64:
4154ca0716f5SRobert Watson return (fetch_header64_tok(tok, buf, len));
4155ca0716f5SRobert Watson
4156ca0716f5SRobert Watson case AUT_HEADER64_EX:
4157ca0716f5SRobert Watson return (fetch_header64_ex_tok(tok, buf, len));
4158ca0716f5SRobert Watson
4159ca0716f5SRobert Watson case AUT_TRAILER:
4160ca0716f5SRobert Watson return (fetch_trailer_tok(tok, buf, len));
4161ca0716f5SRobert Watson
4162ca0716f5SRobert Watson case AUT_ARG32:
4163ca0716f5SRobert Watson return (fetch_arg32_tok(tok, buf, len));
4164ca0716f5SRobert Watson
4165ca0716f5SRobert Watson case AUT_ARG64:
4166ca0716f5SRobert Watson return (fetch_arg64_tok(tok, buf, len));
4167ca0716f5SRobert Watson
4168ca0716f5SRobert Watson case AUT_ATTR32:
4169ca0716f5SRobert Watson return (fetch_attr32_tok(tok, buf, len));
4170ca0716f5SRobert Watson
4171ca0716f5SRobert Watson case AUT_ATTR64:
4172ca0716f5SRobert Watson return (fetch_attr64_tok(tok, buf, len));
4173ca0716f5SRobert Watson
4174ca0716f5SRobert Watson case AUT_EXIT:
4175ca0716f5SRobert Watson return (fetch_exit_tok(tok, buf, len));
4176ca0716f5SRobert Watson
4177ca0716f5SRobert Watson case AUT_EXEC_ARGS:
4178ca0716f5SRobert Watson return (fetch_execarg_tok(tok, buf, len));
4179ca0716f5SRobert Watson
4180ca0716f5SRobert Watson case AUT_EXEC_ENV:
4181ca0716f5SRobert Watson return (fetch_execenv_tok(tok, buf, len));
4182ca0716f5SRobert Watson
4183ca0716f5SRobert Watson case AUT_OTHER_FILE32:
4184ca0716f5SRobert Watson return (fetch_file_tok(tok, buf, len));
4185ca0716f5SRobert Watson
4186ca0716f5SRobert Watson case AUT_NEWGROUPS:
4187ca0716f5SRobert Watson return (fetch_newgroups_tok(tok, buf, len));
4188ca0716f5SRobert Watson
4189ca0716f5SRobert Watson case AUT_IN_ADDR:
4190ca0716f5SRobert Watson return (fetch_inaddr_tok(tok, buf, len));
4191ca0716f5SRobert Watson
4192ca0716f5SRobert Watson case AUT_IN_ADDR_EX:
4193ca0716f5SRobert Watson return (fetch_inaddr_ex_tok(tok, buf, len));
4194ca0716f5SRobert Watson
4195ca0716f5SRobert Watson case AUT_IP:
4196ca0716f5SRobert Watson return (fetch_ip_tok(tok, buf, len));
4197ca0716f5SRobert Watson
4198ca0716f5SRobert Watson case AUT_IPC:
4199ca0716f5SRobert Watson return (fetch_ipc_tok(tok, buf, len));
4200ca0716f5SRobert Watson
4201ca0716f5SRobert Watson case AUT_IPC_PERM:
4202ca0716f5SRobert Watson return (fetch_ipcperm_tok(tok, buf, len));
4203ca0716f5SRobert Watson
4204ca0716f5SRobert Watson case AUT_IPORT:
4205ca0716f5SRobert Watson return (fetch_iport_tok(tok, buf, len));
4206ca0716f5SRobert Watson
4207ca0716f5SRobert Watson case AUT_OPAQUE:
4208ca0716f5SRobert Watson return (fetch_opaque_tok(tok, buf, len));
4209ca0716f5SRobert Watson
4210ca0716f5SRobert Watson case AUT_PATH:
4211ca0716f5SRobert Watson return (fetch_path_tok(tok, buf, len));
4212ca0716f5SRobert Watson
4213ca0716f5SRobert Watson case AUT_PROCESS32:
4214ca0716f5SRobert Watson return (fetch_process32_tok(tok, buf, len));
4215ca0716f5SRobert Watson
4216ca0716f5SRobert Watson case AUT_PROCESS32_EX:
4217ca0716f5SRobert Watson return (fetch_process32ex_tok(tok, buf, len));
4218ca0716f5SRobert Watson
4219bc168a6cSRobert Watson case AUT_PROCESS64:
4220bc168a6cSRobert Watson return (fetch_process64_tok(tok, buf, len));
4221bc168a6cSRobert Watson
4222bc168a6cSRobert Watson case AUT_PROCESS64_EX:
4223bc168a6cSRobert Watson return (fetch_process64ex_tok(tok, buf, len));
4224bc168a6cSRobert Watson
4225ca0716f5SRobert Watson case AUT_RETURN32:
4226ca0716f5SRobert Watson return (fetch_return32_tok(tok, buf, len));
4227ca0716f5SRobert Watson
4228ca0716f5SRobert Watson case AUT_RETURN64:
4229ca0716f5SRobert Watson return (fetch_return64_tok(tok, buf, len));
4230ca0716f5SRobert Watson
4231ca0716f5SRobert Watson case AUT_SEQ:
4232ca0716f5SRobert Watson return (fetch_seq_tok(tok, buf, len));
4233ca0716f5SRobert Watson
4234ca0716f5SRobert Watson case AUT_SOCKET:
4235ca0716f5SRobert Watson return (fetch_socket_tok(tok, buf, len));
4236ca0716f5SRobert Watson
4237ca0716f5SRobert Watson case AUT_SOCKINET32:
4238ca0716f5SRobert Watson return (fetch_sock_inet32_tok(tok, buf, len));
4239ca0716f5SRobert Watson
4240ca0716f5SRobert Watson case AUT_SOCKUNIX:
4241ca0716f5SRobert Watson return (fetch_sock_unix_tok(tok, buf, len));
4242ca0716f5SRobert Watson
4243c0020399SRobert Watson case AUT_SOCKINET128:
4244c0020399SRobert Watson return (fetch_sock_inet128_tok(tok, buf, len));
4245c0020399SRobert Watson
4246ca0716f5SRobert Watson case AUT_SUBJECT32:
4247ca0716f5SRobert Watson return (fetch_subject32_tok(tok, buf, len));
4248ca0716f5SRobert Watson
4249bc168a6cSRobert Watson case AUT_SUBJECT32_EX:
4250bc168a6cSRobert Watson return (fetch_subject32ex_tok(tok, buf, len));
4251bc168a6cSRobert Watson
4252ca0716f5SRobert Watson case AUT_SUBJECT64:
4253ca0716f5SRobert Watson return (fetch_subject64_tok(tok, buf, len));
4254ca0716f5SRobert Watson
4255bc168a6cSRobert Watson case AUT_SUBJECT64_EX:
4256bc168a6cSRobert Watson return (fetch_subject64ex_tok(tok, buf, len));
4257ca0716f5SRobert Watson
4258ca0716f5SRobert Watson case AUT_TEXT:
4259ca0716f5SRobert Watson return (fetch_text_tok(tok, buf, len));
4260ca0716f5SRobert Watson
4261ca0716f5SRobert Watson case AUT_SOCKET_EX:
4262ca0716f5SRobert Watson return (fetch_socketex32_tok(tok, buf, len));
4263ca0716f5SRobert Watson
4264ca0716f5SRobert Watson case AUT_DATA:
4265ca0716f5SRobert Watson return (fetch_arb_tok(tok, buf, len));
4266ca0716f5SRobert Watson
4267bc168a6cSRobert Watson case AUT_ZONENAME:
4268bc168a6cSRobert Watson return (fetch_zonename_tok(tok, buf, len));
4269bc168a6cSRobert Watson
4270aa772005SRobert Watson case AUT_UPRIV:
4271aa772005SRobert Watson return (fetch_priv_tok(tok, buf, len));
4272aa772005SRobert Watson
4273aa772005SRobert Watson case AUT_PRIV:
4274aa772005SRobert Watson return (fetch_privset_tok(tok, buf, len));
4275aa772005SRobert Watson
4276ca0716f5SRobert Watson default:
4277ca0716f5SRobert Watson return (fetch_invalid_tok(tok, buf, len));
4278ca0716f5SRobert Watson }
4279ca0716f5SRobert Watson }
4280ca0716f5SRobert Watson
4281aa772005SRobert Watson void
au_print_flags_tok(FILE * outfp,tokenstr_t * tok,char * del,int oflags)4282aa772005SRobert Watson au_print_flags_tok(FILE *outfp, tokenstr_t *tok, char *del, int oflags)
4283aa772005SRobert Watson {
4284aa772005SRobert Watson
4285aa772005SRobert Watson switch(tok->id) {
4286aa772005SRobert Watson case AUT_HEADER32:
4287aa772005SRobert Watson print_header32_tok(outfp, tok, del, oflags);
4288aa772005SRobert Watson return;
4289aa772005SRobert Watson
4290aa772005SRobert Watson case AUT_HEADER32_EX:
4291aa772005SRobert Watson print_header32_ex_tok(outfp, tok, del, oflags);
4292aa772005SRobert Watson return;
4293aa772005SRobert Watson
4294aa772005SRobert Watson case AUT_HEADER64:
4295aa772005SRobert Watson print_header64_tok(outfp, tok, del, oflags);
4296aa772005SRobert Watson return;
4297aa772005SRobert Watson
4298aa772005SRobert Watson case AUT_HEADER64_EX:
4299aa772005SRobert Watson print_header64_ex_tok(outfp, tok, del, oflags);
4300aa772005SRobert Watson return;
4301aa772005SRobert Watson
4302aa772005SRobert Watson case AUT_TRAILER:
4303aa772005SRobert Watson print_trailer_tok(outfp, tok, del, oflags);
4304aa772005SRobert Watson return;
4305aa772005SRobert Watson
4306aa772005SRobert Watson case AUT_ARG32:
4307aa772005SRobert Watson print_arg32_tok(outfp, tok, del, oflags);
4308aa772005SRobert Watson return;
4309aa772005SRobert Watson
4310aa772005SRobert Watson case AUT_ARG64:
4311aa772005SRobert Watson print_arg64_tok(outfp, tok, del, oflags);
4312aa772005SRobert Watson return;
4313aa772005SRobert Watson
4314aa772005SRobert Watson case AUT_DATA:
4315aa772005SRobert Watson print_arb_tok(outfp, tok, del, oflags);
4316aa772005SRobert Watson return;
4317aa772005SRobert Watson
4318aa772005SRobert Watson case AUT_ATTR32:
4319aa772005SRobert Watson print_attr32_tok(outfp, tok, del, oflags);
4320aa772005SRobert Watson return;
4321aa772005SRobert Watson
4322aa772005SRobert Watson case AUT_ATTR64:
4323aa772005SRobert Watson print_attr64_tok(outfp, tok, del, oflags);
4324aa772005SRobert Watson return;
4325aa772005SRobert Watson
4326aa772005SRobert Watson case AUT_EXIT:
4327aa772005SRobert Watson print_exit_tok(outfp, tok, del, oflags);
4328aa772005SRobert Watson return;
4329aa772005SRobert Watson
4330aa772005SRobert Watson case AUT_EXEC_ARGS:
4331aa772005SRobert Watson print_execarg_tok(outfp, tok, del, oflags);
4332aa772005SRobert Watson return;
4333aa772005SRobert Watson
4334aa772005SRobert Watson case AUT_EXEC_ENV:
4335aa772005SRobert Watson print_execenv_tok(outfp, tok, del, oflags);
4336aa772005SRobert Watson return;
4337aa772005SRobert Watson
4338aa772005SRobert Watson case AUT_OTHER_FILE32:
4339aa772005SRobert Watson print_file_tok(outfp, tok, del, oflags);
4340aa772005SRobert Watson return;
4341aa772005SRobert Watson
4342aa772005SRobert Watson case AUT_NEWGROUPS:
4343aa772005SRobert Watson print_newgroups_tok(outfp, tok, del, oflags);
4344aa772005SRobert Watson return;
4345aa772005SRobert Watson
4346aa772005SRobert Watson case AUT_IN_ADDR:
4347aa772005SRobert Watson print_inaddr_tok(outfp, tok, del, oflags);
4348aa772005SRobert Watson return;
4349aa772005SRobert Watson
4350aa772005SRobert Watson case AUT_IN_ADDR_EX:
4351aa772005SRobert Watson print_inaddr_ex_tok(outfp, tok, del, oflags);
4352aa772005SRobert Watson return;
4353aa772005SRobert Watson
4354aa772005SRobert Watson case AUT_IP:
4355aa772005SRobert Watson print_ip_tok(outfp, tok, del, oflags);
4356aa772005SRobert Watson return;
4357aa772005SRobert Watson
4358aa772005SRobert Watson case AUT_IPC:
4359aa772005SRobert Watson print_ipc_tok(outfp, tok, del, oflags);
4360aa772005SRobert Watson return;
4361aa772005SRobert Watson
4362aa772005SRobert Watson case AUT_IPC_PERM:
4363aa772005SRobert Watson print_ipcperm_tok(outfp, tok, del, oflags);
4364aa772005SRobert Watson return;
4365aa772005SRobert Watson
4366aa772005SRobert Watson case AUT_IPORT:
4367aa772005SRobert Watson print_iport_tok(outfp, tok, del, oflags);
4368aa772005SRobert Watson return;
4369aa772005SRobert Watson
4370aa772005SRobert Watson case AUT_OPAQUE:
4371aa772005SRobert Watson print_opaque_tok(outfp, tok, del, oflags);
4372aa772005SRobert Watson return;
4373aa772005SRobert Watson
4374aa772005SRobert Watson case AUT_PATH:
4375aa772005SRobert Watson print_path_tok(outfp, tok, del, oflags);
4376aa772005SRobert Watson return;
4377aa772005SRobert Watson
4378aa772005SRobert Watson case AUT_PROCESS32:
4379aa772005SRobert Watson print_process32_tok(outfp, tok, del, oflags);
4380aa772005SRobert Watson return;
4381aa772005SRobert Watson
4382aa772005SRobert Watson case AUT_PROCESS32_EX:
4383aa772005SRobert Watson print_process32ex_tok(outfp, tok, del, oflags);
4384aa772005SRobert Watson return;
4385aa772005SRobert Watson
4386aa772005SRobert Watson case AUT_PROCESS64:
4387aa772005SRobert Watson print_process64_tok(outfp, tok, del, oflags);
4388aa772005SRobert Watson return;
4389aa772005SRobert Watson
4390aa772005SRobert Watson case AUT_PROCESS64_EX:
4391aa772005SRobert Watson print_process64ex_tok(outfp, tok, del, oflags);
4392aa772005SRobert Watson return;
4393aa772005SRobert Watson
4394aa772005SRobert Watson case AUT_RETURN32:
4395aa772005SRobert Watson print_return32_tok(outfp, tok, del, oflags);
4396aa772005SRobert Watson return;
4397aa772005SRobert Watson
4398aa772005SRobert Watson case AUT_RETURN64:
4399aa772005SRobert Watson print_return64_tok(outfp, tok, del, oflags);
4400aa772005SRobert Watson return;
4401aa772005SRobert Watson
4402aa772005SRobert Watson case AUT_SEQ:
4403aa772005SRobert Watson print_seq_tok(outfp, tok, del, oflags);
4404aa772005SRobert Watson return;
4405aa772005SRobert Watson
4406aa772005SRobert Watson case AUT_SOCKET:
4407aa772005SRobert Watson print_socket_tok(outfp, tok, del, oflags);
4408aa772005SRobert Watson return;
4409aa772005SRobert Watson
4410aa772005SRobert Watson case AUT_SOCKINET32:
4411aa772005SRobert Watson print_sock_inet32_tok(outfp, tok, del, oflags);
4412aa772005SRobert Watson return;
4413aa772005SRobert Watson
4414aa772005SRobert Watson case AUT_SOCKUNIX:
4415aa772005SRobert Watson print_sock_unix_tok(outfp, tok, del, oflags);
4416aa772005SRobert Watson return;
4417aa772005SRobert Watson
4418aa772005SRobert Watson case AUT_SOCKINET128:
4419aa772005SRobert Watson print_sock_inet128_tok(outfp, tok, del, oflags);
4420aa772005SRobert Watson return;
4421aa772005SRobert Watson
4422aa772005SRobert Watson case AUT_SUBJECT32:
4423aa772005SRobert Watson print_subject32_tok(outfp, tok, del, oflags);
4424aa772005SRobert Watson return;
4425aa772005SRobert Watson
4426aa772005SRobert Watson case AUT_SUBJECT64:
4427aa772005SRobert Watson print_subject64_tok(outfp, tok, del, oflags);
4428aa772005SRobert Watson return;
4429aa772005SRobert Watson
4430aa772005SRobert Watson case AUT_SUBJECT32_EX:
4431aa772005SRobert Watson print_subject32ex_tok(outfp, tok, del, oflags);
4432aa772005SRobert Watson return;
4433aa772005SRobert Watson
4434aa772005SRobert Watson case AUT_SUBJECT64_EX:
4435aa772005SRobert Watson print_subject64ex_tok(outfp, tok, del, oflags);
4436aa772005SRobert Watson return;
4437aa772005SRobert Watson
4438aa772005SRobert Watson case AUT_TEXT:
4439aa772005SRobert Watson print_text_tok(outfp, tok, del, oflags);
4440aa772005SRobert Watson return;
4441aa772005SRobert Watson
4442aa772005SRobert Watson case AUT_SOCKET_EX:
4443aa772005SRobert Watson print_socketex32_tok(outfp, tok, del, oflags);
4444aa772005SRobert Watson return;
4445aa772005SRobert Watson
4446aa772005SRobert Watson case AUT_ZONENAME:
4447aa772005SRobert Watson print_zonename_tok(outfp, tok, del, oflags);
4448aa772005SRobert Watson return;
4449aa772005SRobert Watson
4450aa772005SRobert Watson case AUT_UPRIV:
4451aa772005SRobert Watson print_upriv_tok(outfp, tok, del, oflags);
4452aa772005SRobert Watson return;
4453aa772005SRobert Watson
4454aa772005SRobert Watson case AUT_PRIV:
4455aa772005SRobert Watson print_privset_tok(outfp, tok, del, oflags);
4456aa772005SRobert Watson return;
4457aa772005SRobert Watson
4458aa772005SRobert Watson default:
4459aa772005SRobert Watson print_invalid_tok(outfp, tok, del, oflags);
4460aa772005SRobert Watson }
4461aa772005SRobert Watson }
4462aa772005SRobert Watson
4463ca0716f5SRobert Watson /*
4464bc168a6cSRobert Watson * 'prints' the token out to outfp.
4465ca0716f5SRobert Watson */
4466ca0716f5SRobert Watson void
au_print_tok(FILE * outfp,tokenstr_t * tok,char * del,char raw,char sfrm)4467ca0716f5SRobert Watson au_print_tok(FILE *outfp, tokenstr_t *tok, char *del, char raw, char sfrm)
4468ca0716f5SRobert Watson {
4469aa772005SRobert Watson int oflags = AU_OFLAG_NONE;
4470ca0716f5SRobert Watson
4471aa772005SRobert Watson if (raw)
4472aa772005SRobert Watson oflags |= AU_OFLAG_RAW;
4473aa772005SRobert Watson if (sfrm)
4474aa772005SRobert Watson oflags |= AU_OFLAG_SHORT;
4475ca0716f5SRobert Watson
4476aa772005SRobert Watson au_print_flags_tok(outfp, tok, del, oflags);
4477bc168a6cSRobert Watson }
4478bc168a6cSRobert Watson
4479bc168a6cSRobert Watson /*
4480bc168a6cSRobert Watson * 'prints' the token out to outfp in XML format.
4481bc168a6cSRobert Watson */
4482bc168a6cSRobert Watson void
au_print_tok_xml(FILE * outfp,tokenstr_t * tok,char * del,char raw,char sfrm)4483bc168a6cSRobert Watson au_print_tok_xml(FILE *outfp, tokenstr_t *tok, char *del, char raw,
4484bc168a6cSRobert Watson char sfrm)
4485bc168a6cSRobert Watson {
4486aa772005SRobert Watson int oflags = AU_OFLAG_XML;
4487bc168a6cSRobert Watson
4488aa772005SRobert Watson if (raw)
4489aa772005SRobert Watson oflags |= AU_OFLAG_RAW;
4490aa772005SRobert Watson if (sfrm)
4491aa772005SRobert Watson oflags |= AU_OFLAG_SHORT;
4492bc168a6cSRobert Watson
4493aa772005SRobert Watson au_print_flags_tok(outfp, tok, del, oflags);
4494ca0716f5SRobert Watson }
4495ca0716f5SRobert Watson
4496ca0716f5SRobert Watson /*
4497ca0716f5SRobert Watson * Read a record from the file pointer, store data in buf memory for buf is
4498ca0716f5SRobert Watson * also allocated in this function and has to be free'd outside this call.
4499ca0716f5SRobert Watson *
4500ca0716f5SRobert Watson * au_read_rec() handles two possibilities: a stand-alone file token, or a
4501ca0716f5SRobert Watson * complete audit record.
4502ca0716f5SRobert Watson *
4503ca0716f5SRobert Watson * XXXRW: Note that if we hit an error, we leave the stream in an unusable
4504ca0716f5SRobert Watson * state, because it will be partly offset into a record. We should rewind
4505ca0716f5SRobert Watson * or do something more intelligent. Particularly interesting is the case
4506ca0716f5SRobert Watson * where we perform a partial read of a record from a non-blockable file
4507ca0716f5SRobert Watson * descriptor. We should return the partial read and continue...?
4508ca0716f5SRobert Watson */
4509ca0716f5SRobert Watson int
au_read_rec(FILE * fp,u_char ** buf)4510ca0716f5SRobert Watson au_read_rec(FILE *fp, u_char **buf)
4511ca0716f5SRobert Watson {
4512ca0716f5SRobert Watson u_char *bptr;
4513ca0716f5SRobert Watson u_int32_t recsize;
4514ca0716f5SRobert Watson u_int32_t bytestoread;
4515ca0716f5SRobert Watson u_char type;
4516ca0716f5SRobert Watson
4517ca0716f5SRobert Watson u_int32_t sec, msec;
4518ca0716f5SRobert Watson u_int16_t filenamelen;
4519ca0716f5SRobert Watson
4520ca0716f5SRobert Watson type = fgetc(fp);
4521ca0716f5SRobert Watson
4522ca0716f5SRobert Watson switch (type) {
4523ca0716f5SRobert Watson case AUT_HEADER32:
4524ca0716f5SRobert Watson case AUT_HEADER32_EX:
4525ca0716f5SRobert Watson case AUT_HEADER64:
4526ca0716f5SRobert Watson case AUT_HEADER64_EX:
4527ca0716f5SRobert Watson /* read the record size from the token */
4528ca0716f5SRobert Watson if (fread(&recsize, 1, sizeof(u_int32_t), fp) <
4529ca0716f5SRobert Watson sizeof(u_int32_t)) {
4530ca0716f5SRobert Watson errno = EINVAL;
4531ca0716f5SRobert Watson return (-1);
4532ca0716f5SRobert Watson }
4533ca0716f5SRobert Watson recsize = be32toh(recsize);
4534ca0716f5SRobert Watson
4535ca0716f5SRobert Watson /* Check for recsize sanity */
4536ca0716f5SRobert Watson if (recsize < (sizeof(u_int32_t) + sizeof(u_char))) {
4537ca0716f5SRobert Watson errno = EINVAL;
4538ca0716f5SRobert Watson return (-1);
4539ca0716f5SRobert Watson }
4540ca0716f5SRobert Watson
4541aa772005SRobert Watson *buf = calloc(recsize, sizeof(u_char));
4542ca0716f5SRobert Watson if (*buf == NULL)
4543ca0716f5SRobert Watson return (-1);
4544ca0716f5SRobert Watson bptr = *buf;
4545ca0716f5SRobert Watson
4546ca0716f5SRobert Watson /* store the token contents already read, back to the buffer*/
4547ca0716f5SRobert Watson *bptr = type;
4548ca0716f5SRobert Watson bptr++;
4549ca0716f5SRobert Watson be32enc(bptr, recsize);
4550ca0716f5SRobert Watson bptr += sizeof(u_int32_t);
4551ca0716f5SRobert Watson
4552ca0716f5SRobert Watson /* now read remaining record bytes */
4553ca0716f5SRobert Watson bytestoread = recsize - (sizeof(u_int32_t) + sizeof(u_char));
4554ca0716f5SRobert Watson
4555ca0716f5SRobert Watson if (fread(bptr, 1, bytestoread, fp) < bytestoread) {
4556ca0716f5SRobert Watson free(*buf);
4557ca0716f5SRobert Watson errno = EINVAL;
4558ca0716f5SRobert Watson return (-1);
4559ca0716f5SRobert Watson }
4560ca0716f5SRobert Watson break;
4561ca0716f5SRobert Watson
4562ca0716f5SRobert Watson case AUT_OTHER_FILE32:
4563ca0716f5SRobert Watson /*
4564ca0716f5SRobert Watson * The file token is variable-length, as it includes a
4565ca0716f5SRobert Watson * pathname. As a result, we have to read incrementally
4566ca0716f5SRobert Watson * until we know the total length, then allocate space and
4567ca0716f5SRobert Watson * read the rest.
4568ca0716f5SRobert Watson */
4569ca0716f5SRobert Watson if (fread(&sec, 1, sizeof(sec), fp) < sizeof(sec)) {
4570ca0716f5SRobert Watson errno = EINVAL;
4571ca0716f5SRobert Watson return (-1);
4572ca0716f5SRobert Watson }
4573ca0716f5SRobert Watson if (fread(&msec, 1, sizeof(msec), fp) < sizeof(msec)) {
4574ca0716f5SRobert Watson errno = EINVAL;
4575ca0716f5SRobert Watson return (-1);
4576ca0716f5SRobert Watson }
4577ca0716f5SRobert Watson if (fread(&filenamelen, 1, sizeof(filenamelen), fp) <
4578ca0716f5SRobert Watson sizeof(filenamelen)) {
4579ca0716f5SRobert Watson errno = EINVAL;
4580ca0716f5SRobert Watson return (-1);
4581ca0716f5SRobert Watson }
4582ca0716f5SRobert Watson recsize = sizeof(type) + sizeof(sec) + sizeof(msec) +
4583ca0716f5SRobert Watson sizeof(filenamelen) + ntohs(filenamelen);
4584ca0716f5SRobert Watson *buf = malloc(recsize);
4585ca0716f5SRobert Watson if (*buf == NULL)
4586ca0716f5SRobert Watson return (-1);
4587ca0716f5SRobert Watson bptr = *buf;
4588ca0716f5SRobert Watson
4589ca0716f5SRobert Watson bcopy(&type, bptr, sizeof(type));
4590ca0716f5SRobert Watson bptr += sizeof(type);
4591ca0716f5SRobert Watson bcopy(&sec, bptr, sizeof(sec));
4592ca0716f5SRobert Watson bptr += sizeof(sec);
4593ca0716f5SRobert Watson bcopy(&msec, bptr, sizeof(msec));
4594ca0716f5SRobert Watson bptr += sizeof(msec);
4595ca0716f5SRobert Watson bcopy(&filenamelen, bptr, sizeof(filenamelen));
4596ca0716f5SRobert Watson bptr += sizeof(filenamelen);
4597ca0716f5SRobert Watson
4598ca0716f5SRobert Watson if (fread(bptr, 1, ntohs(filenamelen), fp) <
4599ca0716f5SRobert Watson ntohs(filenamelen)) {
4600c61b3f7dSEd Maste free(*buf);
4601ca0716f5SRobert Watson errno = EINVAL;
4602ca0716f5SRobert Watson return (-1);
4603ca0716f5SRobert Watson }
4604ca0716f5SRobert Watson break;
4605ca0716f5SRobert Watson
4606ca0716f5SRobert Watson default:
4607ca0716f5SRobert Watson errno = EINVAL;
4608ca0716f5SRobert Watson return (-1);
4609ca0716f5SRobert Watson }
4610ca0716f5SRobert Watson
4611ca0716f5SRobert Watson return (recsize);
4612ca0716f5SRobert Watson }
4613