xref: /freebsd/contrib/openbsm/libbsm/bsm_io.c (revision f0a75d274af375d15b97b830966b99a02b7db911)
1 /*
2  * Copyright (c) 2004 Apple Computer, Inc.
3  * Copyright (c) 2005 SPARTA, Inc.
4  * Copyright (c) 2006 Robert N. M. Watson
5  * All rights reserved.
6  *
7  * This code was developed in part by Robert N. M. Watson, Senior Principal
8  * Scientist, SPARTA, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1.  Redistributions of source code must retain the above copyright
14  *     notice, this list of conditions and the following disclaimer.
15  * 2.  Redistributions in binary form must reproduce the above copyright
16  *     notice, this list of conditions and the following disclaimer in the
17  *     documentation and/or other materials provided with the distribution.
18  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
19  *     its contributors may be used to endorse or promote products derived
20  *     from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
26  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * $P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_io.c#41 $
35  */
36 
37 #include <sys/types.h>
38 
39 #include <config/config.h>
40 #ifdef HAVE_SYS_ENDIAN_H
41 #include <sys/endian.h>
42 #else /* !HAVE_SYS_ENDIAN_H */
43 #ifdef HAVE_MACHINE_ENDIAN_H
44 #include <machine/endian.h>
45 #else /* !HAVE_MACHINE_ENDIAN_H */
46 #ifdef HAVE_ENDIAN_H
47 #include <endian.h>
48 #else /* !HAVE_ENDIAN_H */
49 #error "No supported endian.h"
50 #endif /* !HAVE_ENDIAN_H */
51 #endif /* !HAVE_MACHINE_ENDIAN_H */
52 #include <compat/endian.h>
53 #endif /* !HAVE_SYS_ENDIAN_H */
54 #ifdef HAVE_FULL_QUEUE_H
55 #include <sys/queue.h>
56 #else /* !HAVE_FULL_QUEUE_H */
57 #include <compat/queue.h>
58 #endif /* !HAVE_FULL_QUEUE_H */
59 
60 #include <sys/stat.h>
61 #include <sys/socket.h>
62 
63 #include <bsm/libbsm.h>
64 
65 #include <unistd.h>
66 #include <netinet/in.h>
67 #include <arpa/inet.h>
68 #include <errno.h>
69 #include <time.h>
70 #include <stdlib.h>
71 #include <stdio.h>
72 #include <string.h>
73 #include <pwd.h>
74 #include <grp.h>
75 
76 #include <bsm/audit_internal.h>
77 
78 #define	READ_TOKEN_BYTES(buf, len, dest, size, bytesread, err) do {	\
79 	if (bytesread + size > len) {					\
80 		err = 1;						\
81 	} else {							\
82 		memcpy(dest, buf + bytesread, size);			\
83 		bytesread += size;					\
84 	}								\
85 } while (0)
86 
87 #define	READ_TOKEN_U_CHAR(buf, len, dest, bytesread, err) do {		\
88 	if (bytesread + sizeof(u_char) <= len) {			\
89 		dest = buf[bytesread];					\
90 		bytesread += sizeof(u_char);				\
91 	} else								\
92 		err = 1;						\
93 } while (0)
94 
95 #define	READ_TOKEN_U_INT16(buf, len, dest, bytesread, err) do {		\
96 	if (bytesread + sizeof(u_int16_t) <= len) {			\
97 		dest = be16dec(buf + bytesread);			\
98 		bytesread += sizeof(u_int16_t);				\
99 	} else								\
100 		err = 1;						\
101 } while (0)
102 
103 #define	READ_TOKEN_U_INT32(buf, len, dest, bytesread, err) do {		\
104 	if (bytesread + sizeof(u_int32_t) <= len) {			\
105 		dest = be32dec(buf + bytesread);			\
106 		bytesread += sizeof(u_int32_t);				\
107 	} else								\
108 		err = 1; 						\
109 } while (0)
110 
111 #define	READ_TOKEN_U_INT64(buf, len, dest, bytesread, err) do {		\
112 	if (bytesread + sizeof(u_int64_t) <= len) {			\
113 		dest = be64dec(buf + bytesread);			\
114 		bytesread += sizeof(u_int64_t);				\
115 	} else								\
116 		err = 1; 						\
117 } while (0)
118 
119 #define	SET_PTR(buf, len, ptr, size, bytesread, err) do {		\
120 	if ((bytesread) + (size) > (len))				\
121 		(err) = 1;						\
122 	else {								\
123 		(ptr) = (buf) + (bytesread);				\
124 		(bytesread) += (size);					\
125 	}								\
126 } while (0)
127 
128 /*
129  * Prints the delimiter string.
130  */
131 static void
132 print_delim(FILE *fp, const char *del)
133 {
134 
135 	fprintf(fp, "%s", del);
136 }
137 
138 /*
139  * Prints a single byte in the given format.
140  */
141 static void
142 print_1_byte(FILE *fp, u_char val, const char *format)
143 {
144 
145 	fprintf(fp, format, val);
146 }
147 
148 /*
149  * Print 2 bytes in the given format.
150  */
151 static void
152 print_2_bytes(FILE *fp, u_int16_t val, const char *format)
153 {
154 
155 	fprintf(fp, format, val);
156 }
157 
158 /*
159  * Prints 4 bytes in the given format.
160  */
161 static void
162 print_4_bytes(FILE *fp, u_int32_t val, const char *format)
163 {
164 
165 	fprintf(fp, format, val);
166 }
167 
168 /*
169  * Prints 8 bytes in the given format.
170  */
171 static void
172 print_8_bytes(FILE *fp, u_int64_t val, const char *format)
173 {
174 
175 	fprintf(fp, format, val);
176 }
177 
178 /*
179  * Prints the given size of data bytes in hex.
180  */
181 static void
182 print_mem(FILE *fp, u_char *data, size_t len)
183 {
184 	int i;
185 
186 	if (len > 0) {
187 		fprintf(fp, "0x");
188 		for (i = 0; i < len; i++)
189 			fprintf(fp, "%x", data[i]);
190 	}
191 }
192 
193 /*
194  * Prints the given data bytes as a string.
195  */
196 static void
197 print_string(FILE *fp, u_char *str, size_t len)
198 {
199 	int i;
200 
201 	if (len > 0) {
202 		for (i = 0; i < len; i++) {
203 			if (str[i] != '\0')
204 				fprintf(fp, "%c", str[i]);
205 		}
206 	}
207 }
208 
209 /*
210  * Prints the token type in either the raw or the default form.
211  */
212 static void
213 print_tok_type(FILE *fp, u_char type, const char *tokname, char raw)
214 {
215 
216 	if (raw)
217 		fprintf(fp, "%u", type);
218 	else
219 		fprintf(fp, "%s", tokname);
220 }
221 
222 /*
223  * Prints a user value.
224  */
225 static void
226 print_user(FILE *fp, u_int32_t usr, char raw)
227 {
228 	struct passwd *pwent;
229 
230 	if (raw)
231 		fprintf(fp, "%d", usr);
232 	else {
233 		pwent = getpwuid(usr);
234 		if (pwent != NULL)
235 			fprintf(fp, "%s", pwent->pw_name);
236 		else
237 			fprintf(fp, "%d", usr);
238 	}
239 }
240 
241 /*
242  * Prints a group value.
243  */
244 static void
245 print_group(FILE *fp, u_int32_t grp, char raw)
246 {
247 	struct group *grpent;
248 
249 	if (raw)
250 		fprintf(fp, "%d", grp);
251 	else {
252 		grpent = getgrgid(grp);
253 		if (grpent != NULL)
254 			fprintf(fp, "%s", grpent->gr_name);
255 		else
256 			fprintf(fp, "%d", grp);
257 	}
258 }
259 
260 /*
261  * Prints the event from the header token in either the short, default or raw
262  * form.
263  */
264 static void
265 print_event(FILE *fp, u_int16_t ev, char raw, char sfrm)
266 {
267 	char event_ent_name[AU_EVENT_NAME_MAX];
268 	char event_ent_desc[AU_EVENT_DESC_MAX];
269 	struct au_event_ent e, *ep;
270 
271 	bzero(&e, sizeof(e));
272 	bzero(event_ent_name, sizeof(event_ent_name));
273 	bzero(event_ent_desc, sizeof(event_ent_desc));
274 	e.ae_name = event_ent_name;
275 	e.ae_desc = event_ent_desc;
276 
277 	ep = getauevnum_r(&e, ev);
278 	if (ep == NULL) {
279 		fprintf(fp, "%u", ev);
280 		return;
281 	}
282 
283 	if (raw)
284 		fprintf(fp, "%u", ev);
285 	else if (sfrm)
286 		fprintf(fp, "%s", e.ae_name);
287 	else
288 		fprintf(fp, "%s", e.ae_desc);
289 }
290 
291 
292 /*
293  * Prints the event modifier from the header token in either the default or
294  * raw form.
295  */
296 static void
297 print_evmod(FILE *fp, u_int16_t evmod, char raw)
298 {
299 	if (raw)
300 		fprintf(fp, "%u", evmod);
301 	else
302 		fprintf(fp, "%u", evmod);
303 }
304 
305 /*
306  * Prints seconds in the ctime format.
307  */
308 static void
309 print_sec32(FILE *fp, u_int32_t sec, char raw)
310 {
311 	time_t timestamp;
312 	char timestr[26];
313 
314 	if (raw)
315 		fprintf(fp, "%u", sec);
316 	else {
317 		timestamp = (time_t)sec;
318 		ctime_r(&timestamp, timestr);
319 		timestr[24] = '\0'; /* No new line */
320 		fprintf(fp, "%s", timestr);
321 	}
322 }
323 
324 /*
325  * XXXRW: 64-bit token streams make use of 64-bit time stamps; since we
326  * assume a 32-bit time_t, we simply truncate for now.
327  */
328 static void
329 print_sec64(FILE *fp, u_int64_t sec, char raw)
330 {
331 	time_t timestamp;
332 	char timestr[26];
333 
334 	if (raw)
335 		fprintf(fp, "%u", (u_int32_t)sec);
336 	else {
337 		timestamp = (time_t)sec;
338 		ctime_r(&timestamp, timestr);
339 		timestr[24] = '\0'; /* No new line */
340 		fprintf(fp, "%s", timestr);
341 	}
342 }
343 
344 /*
345  * Prints the excess milliseconds.
346  */
347 static void
348 print_msec32(FILE *fp, u_int32_t msec, char raw)
349 {
350 	if (raw)
351 		fprintf(fp, "%u", msec);
352 	else
353 		fprintf(fp, " + %u msec", msec);
354 }
355 
356 /*
357  * XXXRW: 64-bit token streams make use of 64-bit time stamps; since we assume
358  * a 32-bit msec, we simply truncate for now.
359  */
360 static void
361 print_msec64(FILE *fp, u_int64_t msec, char raw)
362 {
363 
364 	msec &= 0xffffffff;
365 	if (raw)
366 		fprintf(fp, "%u", (u_int32_t)msec);
367 	else
368 		fprintf(fp, " + %u msec", (u_int32_t)msec);
369 }
370 
371 /*
372  * Prints a dotted form for the IP address.
373  */
374 static void
375 print_ip_address(FILE *fp, u_int32_t ip)
376 {
377 	struct in_addr ipaddr;
378 
379 	ipaddr.s_addr = ip;
380 	fprintf(fp, "%s", inet_ntoa(ipaddr));
381 }
382 
383 /*
384  * Prints a string value for the given ip address.
385  */
386 static void
387 print_ip_ex_address(FILE *fp, u_int32_t type, u_int32_t *ipaddr)
388 {
389 	struct in_addr ipv4;
390 	struct in6_addr ipv6;
391 	char dst[INET6_ADDRSTRLEN];
392 
393 	switch (type) {
394 	case AU_IPv4:
395 		ipv4.s_addr = (in_addr_t)(ipaddr[0]);
396 		fprintf(fp, "%s", inet_ntop(AF_INET, &ipv4, dst,
397 		    INET6_ADDRSTRLEN));
398 		break;
399 
400 	case AU_IPv6:
401 		bcopy(ipaddr, &ipv6, sizeof(ipv6));
402 		fprintf(fp, "%s", inet_ntop(AF_INET6, &ipv6, dst,
403 		    INET6_ADDRSTRLEN));
404 		break;
405 
406 	default:
407 		fprintf(fp, "invalid");
408 	}
409 }
410 
411 /*
412  * Prints return value as success or failure.
413  */
414 static void
415 print_retval(FILE *fp, u_char status, char raw)
416 {
417 	if (raw)
418 		fprintf(fp, "%u", status);
419 	else {
420 		if (status == 0)
421 			fprintf(fp, "success");
422 		else
423 			fprintf(fp, "failure : %s", strerror(status));
424 	}
425 }
426 
427 /*
428  * Prints the exit value.
429  */
430 static void
431 print_errval(FILE *fp, u_int32_t val)
432 {
433 
434 	fprintf(fp, "Error %u", val);
435 }
436 
437 /*
438  * Prints IPC type.
439  */
440 static void
441 print_ipctype(FILE *fp, u_char type, char raw)
442 {
443 	if (raw)
444 		fprintf(fp, "%u", type);
445 	else {
446 		if (type == AT_IPC_MSG)
447 			fprintf(fp, "Message IPC");
448 		else if (type == AT_IPC_SEM)
449 			fprintf(fp, "Semaphore IPC");
450 		else if (type == AT_IPC_SHM)
451 			fprintf(fp, "Shared Memory IPC");
452 		else
453 			fprintf(fp, "%u", type);
454 	}
455 }
456 
457 /*
458  * record byte count       4 bytes
459  * version #               1 byte    [2]
460  * event type              2 bytes
461  * event modifier          2 bytes
462  * seconds of time         4 bytes/8 bytes (32-bit/64-bit value)
463  * milliseconds of time    4 bytes/8 bytes (32-bit/64-bit value)
464  */
465 static int
466 fetch_header32_tok(tokenstr_t *tok, char *buf, int len)
467 {
468 	int err = 0;
469 
470 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32.size, tok->len, err);
471 	if (err)
472 		return (-1);
473 
474 	READ_TOKEN_U_CHAR(buf, len, tok->tt.hdr32.version, tok->len, err);
475 	if (err)
476 		return (-1);
477 
478 	READ_TOKEN_U_INT16(buf, len, tok->tt.hdr32.e_type, tok->len, err);
479 	if (err)
480 		return (-1);
481 
482 	READ_TOKEN_U_INT16(buf, len, tok->tt.hdr32.e_mod, tok->len, err);
483 	if (err)
484 		return (-1);
485 
486 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32.s, tok->len, err);
487 	if (err)
488 		return (-1);
489 
490 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32.ms, tok->len, err);
491 	if (err)
492 		return (-1);
493 
494 	return (0);
495 }
496 
497 static void
498 print_header32_tok(FILE *fp, tokenstr_t *tok, char *del, char raw, char sfrm)
499 {
500 
501 	print_tok_type(fp, tok->id, "header", raw);
502 	print_delim(fp, del);
503 	print_4_bytes(fp, tok->tt.hdr32.size, "%u");
504 	print_delim(fp, del);
505 	print_1_byte(fp, tok->tt.hdr32.version, "%u");
506 	print_delim(fp, del);
507 	print_event(fp, tok->tt.hdr32.e_type, raw, sfrm);
508 	print_delim(fp, del);
509 	print_evmod(fp, tok->tt.hdr32.e_mod, raw);
510 	print_delim(fp, del);
511 	print_sec32(fp, tok->tt.hdr32.s, raw);
512 	print_delim(fp, del);
513 	print_msec32(fp, tok->tt.hdr32.ms, raw);
514 }
515 
516 /*
517  * The Solaris specifications for AUE_HEADER32_EX seem to differ a bit
518  * depending on the bit of the specifications found.  The OpenSolaris source
519  * code uses a 4-byte address length, followed by some number of bytes of
520  * address data.  This contrasts with the Solaris audit.log.5 man page, which
521  * specifies a 1-byte length field.  We use the Solaris 10 definition so that
522  * we can parse audit trails from that system.
523  *
524  * record byte count       4 bytes
525  * version #               1 byte     [2]
526  * event type              2 bytes
527  * event modifier          2 bytes
528  * address type/length     4 bytes
529  *   [ Solaris man page: address type/length     1 byte]
530  * machine address         4 bytes/16 bytes (IPv4/IPv6 address)
531  * seconds of time         4 bytes/8 bytes  (32/64-bits)
532  * nanoseconds of time     4 bytes/8 bytes  (32/64-bits)
533  */
534 static int
535 fetch_header32_ex_tok(tokenstr_t *tok, char *buf, int len)
536 {
537 	int err = 0;
538 
539 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32_ex.size, tok->len, err);
540 	if (err)
541 		return (-1);
542 
543 	READ_TOKEN_U_CHAR(buf, len, tok->tt.hdr32_ex.version, tok->len, err);
544 	if (err)
545 		return (-1);
546 
547 	READ_TOKEN_U_INT16(buf, len, tok->tt.hdr32_ex.e_type, tok->len, err);
548 	if (err)
549 		return (-1);
550 
551 	READ_TOKEN_U_INT16(buf, len, tok->tt.hdr32_ex.e_mod, tok->len, err);
552 	if (err)
553 		return (-1);
554 
555 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32_ex.ad_type, tok->len, err);
556 	if (err)
557 		return (-1);
558 
559 	bzero(tok->tt.hdr32_ex.addr, sizeof(tok->tt.hdr32_ex.addr));
560 	switch (tok->tt.hdr32_ex.ad_type) {
561 	case AU_IPv4:
562 		READ_TOKEN_BYTES(buf, len, &tok->tt.hdr32_ex.addr[0],
563 		    sizeof(tok->tt.hdr32_ex.addr[0]), tok->len, err);
564 		if (err)
565 			return (-1);
566 		break;
567 
568 	case AU_IPv6:
569 		READ_TOKEN_BYTES(buf, len, tok->tt.hdr32_ex.addr,
570 		    sizeof(tok->tt.hdr32_ex.addr), tok->len, err);
571 		break;
572 	}
573 
574 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32_ex.s, tok->len, err);
575 	if (err)
576 		return (-1);
577 
578 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr32_ex.ms, tok->len, err);
579 	if (err)
580 		return (-1);
581 
582 	return (0);
583 }
584 
585 static void
586 print_header32_ex_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
587     char sfrm)
588 {
589 
590 	print_tok_type(fp, tok->id, "header_ex", raw);
591 	print_delim(fp, del);
592 	print_4_bytes(fp, tok->tt.hdr32_ex.size, "%u");
593 	print_delim(fp, del);
594 	print_1_byte(fp, tok->tt.hdr32_ex.version, "%u");
595 	print_delim(fp, del);
596 	print_event(fp, tok->tt.hdr32_ex.e_type, raw, sfrm);
597 	print_delim(fp, del);
598 	print_evmod(fp, tok->tt.hdr32_ex.e_mod, raw);
599 	print_delim(fp, del);
600 	print_ip_ex_address(fp, tok->tt.hdr32_ex.ad_type,
601 	    tok->tt.hdr32_ex.addr);
602 	print_delim(fp, del);
603 	print_sec32(fp, tok->tt.hdr32_ex.s, raw);
604 	print_delim(fp, del);
605 	print_msec32(fp, tok->tt.hdr32_ex.ms, raw);
606 }
607 
608 /*
609  * record byte count       4 bytes
610  * event type              2 bytes
611  * event modifier          2 bytes
612  * seconds of time         4 bytes/8 bytes (32-bit/64-bit value)
613  * milliseconds of time    4 bytes/8 bytes (32-bit/64-bit value)
614  * version #
615  */
616 static int
617 fetch_header64_tok(tokenstr_t *tok, char *buf, int len)
618 {
619 	int err = 0;
620 
621 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr64.size, tok->len, err);
622 	if (err)
623 		return (-1);
624 
625 	READ_TOKEN_U_CHAR(buf, len, tok->tt.hdr64.version, tok->len, err);
626 	if (err)
627 		return (-1);
628 
629 	READ_TOKEN_U_INT16(buf, len, tok->tt.hdr64.e_type, tok->len, err);
630 	if (err)
631 		return (-1);
632 
633 	READ_TOKEN_U_INT16(buf, len, tok->tt.hdr64.e_mod, tok->len, err);
634 	if (err)
635 		return (-1);
636 
637 	READ_TOKEN_U_INT64(buf, len, tok->tt.hdr64.s, tok->len, err);
638 	if (err)
639 		return (-1);
640 
641 	READ_TOKEN_U_INT64(buf, len, tok->tt.hdr64.ms, tok->len, err);
642 	if (err)
643 		return (-1);
644 
645 	return (0);
646 }
647 
648 static void
649 print_header64_tok(FILE *fp, tokenstr_t *tok, char *del, char raw, char sfrm)
650 {
651 
652 	print_tok_type(fp, tok->id, "header", raw);
653 	print_delim(fp, del);
654 	print_4_bytes(fp, tok->tt.hdr64.size, "%u");
655 	print_delim(fp, del);
656 	print_1_byte(fp, tok->tt.hdr64.version, "%u");
657 	print_delim(fp, del);
658 	print_event(fp, tok->tt.hdr64.e_type, raw, sfrm);
659 	print_delim(fp, del);
660 	print_evmod(fp, tok->tt.hdr64.e_mod, raw);
661 	print_delim(fp, del);
662 	print_sec64(fp, tok->tt.hdr64.s, raw);
663 	print_delim(fp, del);
664 	print_msec64(fp, tok->tt.hdr64.ms, raw);
665 }
666 /*
667  * record byte count       4 bytes
668  * version #               1 byte     [2]
669  * event type              2 bytes
670  * event modifier          2 bytes
671  * address type/length     4 bytes
672  *   [ Solaris man page: address type/length     1 byte]
673  * machine address         4 bytes/16 bytes (IPv4/IPv6 address)
674  * seconds of time         4 bytes/8 bytes  (32/64-bits)
675  * nanoseconds of time     4 bytes/8 bytes  (32/64-bits)
676  *
677  * XXXAUDIT: See comment by fetch_header32_ex_tok() for details on the
678  * accuracy of the BSM spec.
679  */
680 static int
681 fetch_header64_ex_tok(tokenstr_t *tok, char *buf, int len)
682 {
683 	int err = 0;
684 
685 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr64_ex.size, tok->len, err);
686 	if (err)
687 		return (-1);
688 
689 	READ_TOKEN_U_CHAR(buf, len, tok->tt.hdr64_ex.version, tok->len, err);
690 	if (err)
691 		return (-1);
692 
693 	READ_TOKEN_U_INT16(buf, len, tok->tt.hdr64_ex.e_type, tok->len, err);
694 	if (err)
695 		return (-1);
696 
697 	READ_TOKEN_U_INT16(buf, len, tok->tt.hdr64_ex.e_mod, tok->len, err);
698 	if (err)
699 		return (-1);
700 
701 	READ_TOKEN_U_INT32(buf, len, tok->tt.hdr64_ex.ad_type, tok->len, err);
702 	if (err)
703 		return (-1);
704 
705 	bzero(tok->tt.hdr64_ex.addr, sizeof(tok->tt.hdr64_ex.addr));
706 	switch (tok->tt.hdr64_ex.ad_type) {
707 	case AU_IPv4:
708 		READ_TOKEN_BYTES(buf, len, &tok->tt.hdr64_ex.addr[0],
709 		    sizeof(tok->tt.hdr64_ex.addr[0]), tok->len, err);
710 		if (err)
711 			return (-1);
712 		break;
713 
714 	case AU_IPv6:
715 		READ_TOKEN_BYTES(buf, len, tok->tt.hdr64_ex.addr,
716 		    sizeof(tok->tt.hdr64_ex.addr), tok->len, err);
717 		break;
718 	}
719 
720 	READ_TOKEN_U_INT64(buf, len, tok->tt.hdr64_ex.s, tok->len, err);
721 	if (err)
722 		return (-1);
723 
724 	READ_TOKEN_U_INT64(buf, len, tok->tt.hdr64_ex.ms, tok->len, err);
725 	if (err)
726 		return (-1);
727 
728 	return (0);
729 }
730 
731 static void
732 print_header64_ex_tok(FILE *fp, tokenstr_t *tok, char *del, char raw, char sfrm)
733 {
734 
735 	print_tok_type(fp, tok->id, "header_ex", raw);
736 	print_delim(fp, del);
737 	print_4_bytes(fp, tok->tt.hdr64_ex.size, "%u");
738 	print_delim(fp, del);
739 	print_1_byte(fp, tok->tt.hdr64_ex.version, "%u");
740 	print_delim(fp, del);
741 	print_event(fp, tok->tt.hdr64_ex.e_type, raw, sfrm);
742 	print_delim(fp, del);
743 	print_evmod(fp, tok->tt.hdr64_ex.e_mod, raw);
744 	print_delim(fp, del);
745 	print_ip_ex_address(fp, tok->tt.hdr64_ex.ad_type,
746 	    tok->tt.hdr64_ex.addr);
747 	print_delim(fp, del);
748 	print_sec64(fp, tok->tt.hdr64_ex.s, raw);
749 	print_delim(fp, del);
750 	print_msec64(fp, tok->tt.hdr64_ex.ms, raw);
751 }
752 
753 /*
754  * trailer magic                        2 bytes
755  * record size                          4 bytes
756  */
757 static int
758 fetch_trailer_tok(tokenstr_t *tok, char *buf, int len)
759 {
760 	int err = 0;
761 
762 	READ_TOKEN_U_INT16(buf, len, tok->tt.trail.magic, tok->len, err);
763 	if (err)
764 		return (-1);
765 
766 	READ_TOKEN_U_INT32(buf, len, tok->tt.trail.count, tok->len, err);
767 	if (err)
768 		return (-1);
769 
770 	return (0);
771 }
772 
773 static void
774 print_trailer_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
775     __unused char sfrm)
776 {
777 
778 	print_tok_type(fp, tok->id, "trailer", raw);
779 	print_delim(fp, del);
780 	print_4_bytes(fp, tok->tt.trail.count, "%u");
781 }
782 
783 /*
784  * argument #              1 byte
785  * argument value          4 bytes/8 bytes (32-bit/64-bit value)
786  * text length             2 bytes
787  * text                    N bytes + 1 terminating NULL byte
788  */
789 static int
790 fetch_arg32_tok(tokenstr_t *tok, char *buf, int len)
791 {
792 	int err = 0;
793 
794 	READ_TOKEN_U_CHAR(buf, len, tok->tt.arg32.no, tok->len, err);
795 	if (err)
796 		return (-1);
797 
798 	READ_TOKEN_U_INT32(buf, len, tok->tt.arg32.val, tok->len, err);
799 	if (err)
800 		return (-1);
801 
802 	READ_TOKEN_U_INT16(buf, len, tok->tt.arg32.len, tok->len, err);
803 	if (err)
804 		return (-1);
805 
806 	SET_PTR(buf, len, tok->tt.arg32.text, tok->tt.arg32.len, tok->len,
807 	    err);
808 	if (err)
809 		return (-1);
810 
811 	return (0);
812 }
813 
814 static void
815 print_arg32_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
816     __unused char sfrm)
817 {
818 
819 	print_tok_type(fp, tok->id, "argument", raw);
820 	print_delim(fp, del);
821 	print_1_byte(fp, tok->tt.arg32.no, "%u");
822 	print_delim(fp, del);
823 	print_4_bytes(fp, tok->tt.arg32.val, "0x%x");
824 	print_delim(fp, del);
825 	print_string(fp, tok->tt.arg32.text, tok->tt.arg32.len);
826 }
827 
828 static int
829 fetch_arg64_tok(tokenstr_t *tok, char *buf, int len)
830 {
831 	int err = 0;
832 
833 	READ_TOKEN_U_CHAR(buf, len, tok->tt.arg64.no, tok->len, err);
834 	if (err)
835 		return (-1);
836 
837 	READ_TOKEN_U_INT64(buf, len, tok->tt.arg64.val, tok->len, err);
838 	if (err)
839 		return (-1);
840 
841 	READ_TOKEN_U_INT16(buf, len, tok->tt.arg64.len, tok->len, err);
842 	if (err)
843 		return (-1);
844 
845 	SET_PTR(buf, len, tok->tt.arg64.text, tok->tt.arg64.len, tok->len,
846 	    err);
847 	if (err)
848 		return (-1);
849 
850 	return (0);
851 }
852 
853 static void
854 print_arg64_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
855     __unused char sfrm)
856 {
857 
858 	print_tok_type(fp, tok->id, "argument", raw);
859 	print_delim(fp, del);
860 	print_1_byte(fp, tok->tt.arg64.no, "%u");
861 	print_delim(fp, del);
862 	print_8_bytes(fp, tok->tt.arg64.val, "0x%llx");
863 	print_delim(fp, del);
864 	print_string(fp, tok->tt.arg64.text, tok->tt.arg64.len);
865 }
866 
867 /*
868  * how to print            1 byte
869  * basic unit              1 byte
870  * unit count              1 byte
871  * data items              (depends on basic unit)
872  */
873 static int
874 fetch_arb_tok(tokenstr_t *tok, char *buf, int len)
875 {
876 	int err = 0;
877 	int datasize;
878 
879 	READ_TOKEN_U_CHAR(buf, len, tok->tt.arb.howtopr, tok->len, err);
880 	if (err)
881 		return (-1);
882 
883 	READ_TOKEN_U_CHAR(buf, len, tok->tt.arb.bu, tok->len, err);
884 	if (err)
885 		return (-1);
886 
887 	READ_TOKEN_U_CHAR(buf, len, tok->tt.arb.uc, tok->len, err);
888 	if (err)
889 		return (-1);
890 
891 	/*
892 	 * Determine the size of the basic unit.
893 	 */
894 	switch(tok->tt.arb.bu) {
895 	case AUR_BYTE:
896 	/* case AUR_CHAR: */
897 		datasize = AUR_BYTE_SIZE;
898 		break;
899 
900 	case AUR_SHORT:
901 		datasize = AUR_SHORT_SIZE;
902 		break;
903 
904 	case AUR_INT32:
905 	/* case AUR_INT: */
906 		datasize = AUR_INT32_SIZE;
907 		break;
908 
909 	case AUR_INT64:
910 		datasize = AUR_INT64_SIZE;
911 		break;
912 
913 	default:
914 		return (-1);
915 	}
916 
917 	SET_PTR(buf, len, tok->tt.arb.data, datasize * tok->tt.arb.uc,
918 	    tok->len, err);
919 	if (err)
920 		return (-1);
921 
922 	return (0);
923 }
924 
925 static void
926 print_arb_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
927     __unused char sfrm)
928 {
929 	char *str;
930 	char *format;
931 	size_t size;
932 	int i;
933 
934 	print_tok_type(fp, tok->id, "arbitrary", raw);
935 	print_delim(fp, del);
936 
937 	switch(tok->tt.arb.howtopr) {
938 	case AUP_BINARY:
939 		str = "binary";
940 		format = " %c";
941 		break;
942 
943 	case AUP_OCTAL:
944 		str = "octal";
945 		format = " %o";
946 		break;
947 
948 	case AUP_DECIMAL:
949 		str = "decimal";
950 		format = " %d";
951 		break;
952 
953 	case AUP_HEX:
954 		str = "hex";
955 		format = " %x";
956 		break;
957 
958 	case AUP_STRING:
959 		str = "string";
960 		format = "%c";
961 		break;
962 
963 	default:
964 		return;
965 	}
966 
967 	print_string(fp, str, strlen(str));
968 	print_delim(fp, del);
969 	switch(tok->tt.arb.bu) {
970 	case AUR_BYTE:
971 	/* case AUR_CHAR: */
972 		str = "byte";
973 		size = AUR_BYTE_SIZE;
974 		print_string(fp, str, strlen(str));
975 		print_delim(fp, del);
976 		print_1_byte(fp, tok->tt.arb.uc, "%u");
977 		print_delim(fp, del);
978 		for (i = 0; i<tok->tt.arb.uc; i++)
979 			fprintf(fp, format, *(tok->tt.arb.data + (size * i)));
980 		break;
981 
982 	case AUR_SHORT:
983 		str = "short";
984 		size = AUR_SHORT_SIZE;
985 		print_string(fp, str, strlen(str));
986 		print_delim(fp, del);
987 		print_1_byte(fp, tok->tt.arb.uc, "%u");
988 		print_delim(fp, del);
989 		for (i = 0; i < tok->tt.arb.uc; i++)
990 			fprintf(fp, format, *((u_int16_t *)(tok->tt.arb.data +
991 			    (size * i))));
992 		break;
993 
994 	case AUR_INT32:
995 	/* case AUR_INT: */
996 		str = "int";
997 		size = AUR_INT32_SIZE;
998 		print_string(fp, str, strlen(str));
999 		print_delim(fp, del);
1000 		print_1_byte(fp, tok->tt.arb.uc, "%u");
1001 		print_delim(fp, del);
1002 		for (i = 0; i < tok->tt.arb.uc; i++)
1003 			fprintf(fp, format, *((u_int32_t *)(tok->tt.arb.data +
1004 			    (size * i))));
1005 		break;
1006 
1007 	case AUR_INT64:
1008 		str = "int64";
1009 		size = AUR_INT64_SIZE;
1010 		print_string(fp, str, strlen(str));
1011 		print_delim(fp, del);
1012 		print_1_byte(fp, tok->tt.arb.uc, "%u");
1013 		print_delim(fp, del);
1014 		for (i = 0; i < tok->tt.arb.uc; i++)
1015 			fprintf(fp, format, *((u_int64_t *)(tok->tt.arb.data +
1016 			    (size * i))));
1017 		break;
1018 
1019 	default:
1020 		return;
1021 	}
1022 }
1023 
1024 /*
1025  * file access mode        4 bytes
1026  * owner user ID           4 bytes
1027  * owner group ID          4 bytes
1028  * file system ID          4 bytes
1029  * node ID                 8 bytes
1030  * device                  4 bytes/8 bytes (32-bit/64-bit)
1031  */
1032 static int
1033 fetch_attr32_tok(tokenstr_t *tok, char *buf, int len)
1034 {
1035 	int err = 0;
1036 
1037 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.mode, tok->len, err);
1038 	if (err)
1039 		return (-1);
1040 
1041 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.uid, tok->len, err);
1042 	if (err)
1043 		return (-1);
1044 
1045 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.gid, tok->len, err);
1046 	if (err)
1047 		return (-1);
1048 
1049 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.fsid, tok->len, err);
1050 	if (err)
1051 		return (-1);
1052 
1053 	READ_TOKEN_U_INT64(buf, len, tok->tt.attr32.nid, tok->len, err);
1054 	if (err)
1055 		return (-1);
1056 
1057 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr32.dev, tok->len, err);
1058 	if (err)
1059 		return (-1);
1060 
1061 	return (0);
1062 }
1063 
1064 static void
1065 print_attr32_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1066     __unused char sfrm)
1067 {
1068 
1069 	print_tok_type(fp, tok->id, "attribute", raw);
1070 	print_delim(fp, del);
1071 	print_4_bytes(fp, tok->tt.attr32.mode, "%o");
1072 	print_delim(fp, del);
1073 	print_user(fp, tok->tt.attr32.uid, raw);
1074 	print_delim(fp, del);
1075 	print_group(fp, tok->tt.attr32.gid, raw);
1076 	print_delim(fp, del);
1077 	print_4_bytes(fp, tok->tt.attr32.fsid, "%u");
1078 	print_delim(fp, del);
1079 	print_8_bytes(fp, tok->tt.attr32.nid, "%lld");
1080 	print_delim(fp, del);
1081 	print_4_bytes(fp, tok->tt.attr32.dev, "%u");
1082 }
1083 
1084 /*
1085  * file access mode        4 bytes
1086  * owner user ID           4 bytes
1087  * owner group ID          4 bytes
1088  * file system ID          4 bytes
1089  * node ID                 8 bytes
1090  * device                  4 bytes/8 bytes (32-bit/64-bit)
1091  */
1092 static int
1093 fetch_attr64_tok(tokenstr_t *tok, char *buf, int len)
1094 {
1095 	int err = 0;
1096 
1097 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr64.mode, tok->len, err);
1098 	if (err)
1099 		return (-1);
1100 
1101 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr64.uid, tok->len, err);
1102 	if (err)
1103 		return (-1);
1104 
1105 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr64.gid, tok->len, err);
1106 	if (err)
1107 		return (-1);
1108 
1109 	READ_TOKEN_U_INT32(buf, len, tok->tt.attr64.fsid, tok->len, err);
1110 	if (err)
1111 		return (-1);
1112 
1113 	READ_TOKEN_U_INT64(buf, len, tok->tt.attr64.nid, tok->len, err);
1114 	if (err)
1115 		return (-1);
1116 
1117 	READ_TOKEN_U_INT64(buf, len, tok->tt.attr64.dev, tok->len, err);
1118 	if (err)
1119 		return (-1);
1120 
1121 	return (0);
1122 }
1123 
1124 static void
1125 print_attr64_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1126     __unused char sfrm)
1127 {
1128 
1129 	print_tok_type(fp, tok->id, "attribute", raw);
1130 	print_delim(fp, del);
1131 	print_4_bytes(fp, tok->tt.attr64.mode, "%o");
1132 	print_delim(fp, del);
1133 	print_user(fp, tok->tt.attr64.uid, raw);
1134 	print_delim(fp, del);
1135 	print_group(fp, tok->tt.attr64.gid, raw);
1136 	print_delim(fp, del);
1137 	print_4_bytes(fp, tok->tt.attr64.fsid, "%u");
1138 	print_delim(fp, del);
1139 	print_8_bytes(fp, tok->tt.attr64.nid, "%lld");
1140 	print_delim(fp, del);
1141 	print_8_bytes(fp, tok->tt.attr64.dev, "%llu");
1142 }
1143 
1144 /*
1145  * status                  4 bytes
1146  * return value            4 bytes
1147  */
1148 static int
1149 fetch_exit_tok(tokenstr_t *tok, char *buf, int len)
1150 {
1151 	int err = 0;
1152 
1153 	READ_TOKEN_U_INT32(buf, len, tok->tt.exit.status, tok->len, err);
1154 	if (err)
1155 		return (-1);
1156 
1157 	READ_TOKEN_U_INT32(buf, len, tok->tt.exit.ret, tok->len, err);
1158 	if (err)
1159 		return (-1);
1160 
1161 	return (0);
1162 }
1163 
1164 static void
1165 print_exit_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1166     __unused char sfrm)
1167 {
1168 
1169 	print_tok_type(fp, tok->id, "exit", raw);
1170 	print_delim(fp, del);
1171 	print_errval(fp, tok->tt.exit.status);
1172 	print_delim(fp, del);
1173 	print_4_bytes(fp, tok->tt.exit.ret, "%u");
1174 }
1175 
1176 /*
1177  * count                   4 bytes
1178  * text                    count null-terminated string(s)
1179  */
1180 static int
1181 fetch_execarg_tok(tokenstr_t *tok, char *buf, int len)
1182 {
1183 	int err = 0;
1184 	int i;
1185 	char *bptr;
1186 
1187 	READ_TOKEN_U_INT32(buf, len, tok->tt.execarg.count, tok->len, err);
1188 	if (err)
1189 		return (-1);
1190 
1191 	for (i = 0; i < tok->tt.execarg.count; i++) {
1192 		bptr = buf + tok->len;
1193 		if (i < AUDIT_MAX_ARGS)
1194 			tok->tt.execarg.text[i] = bptr;
1195 
1196 		/* Look for a null terminated string. */
1197 		while (bptr && (*bptr != '\0')) {
1198 			if (++tok->len >=len)
1199 				return (-1);
1200 			bptr = buf + tok->len;
1201 		}
1202 		if (!bptr)
1203 			return (-1);
1204 		tok->len++; /* \0 character */
1205 	}
1206 	if (tok->tt.execarg.count > AUDIT_MAX_ARGS)
1207 		tok->tt.execarg.count = AUDIT_MAX_ARGS;
1208 
1209 	return (0);
1210 }
1211 
1212 static void
1213 print_execarg_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1214     __unused char sfrm)
1215 {
1216 	int i;
1217 
1218 	print_tok_type(fp, tok->id, "exec arg", raw);
1219 	for (i = 0; i < tok->tt.execarg.count; i++) {
1220 		print_delim(fp, del);
1221 		print_string(fp, tok->tt.execarg.text[i],
1222 		    strlen(tok->tt.execarg.text[i]));
1223 	}
1224 }
1225 
1226 /*
1227  * count                   4 bytes
1228  * text                    count null-terminated string(s)
1229  */
1230 static int
1231 fetch_execenv_tok(tokenstr_t *tok, char *buf, int len)
1232 {
1233 	int err = 0;
1234 	int i;
1235 	char *bptr;
1236 
1237 	READ_TOKEN_U_INT32(buf, len, tok->tt.execenv.count, tok->len, err);
1238 	if (err)
1239 		return (-1);
1240 
1241 	for (i = 0; i < tok->tt.execenv.count; i++) {
1242 		bptr = buf + tok->len;
1243 		if (i < AUDIT_MAX_ENV)
1244 			tok->tt.execenv.text[i] = bptr;
1245 
1246 		/* Look for a null terminated string. */
1247 		while (bptr && (*bptr != '\0')) {
1248 			if (++tok->len >=len)
1249 				return (-1);
1250 			bptr = buf + tok->len;
1251 		}
1252 		if (!bptr)
1253 			return (-1);
1254 		tok->len++; /* \0 character */
1255 	}
1256 	if (tok->tt.execenv.count > AUDIT_MAX_ENV)
1257 		tok->tt.execenv.count = AUDIT_MAX_ENV;
1258 
1259 	return (0);
1260 }
1261 
1262 static void
1263 print_execenv_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1264     __unused char sfrm)
1265 {
1266 	int i;
1267 
1268 	print_tok_type(fp, tok->id, "exec env", raw);
1269 	for (i = 0; i< tok->tt.execenv.count; i++) {
1270 		print_delim(fp, del);
1271 		print_string(fp, tok->tt.execenv.text[i],
1272 		    strlen(tok->tt.execenv.text[i]));
1273 	}
1274 }
1275 
1276 /*
1277  * seconds of time          4 bytes
1278  * milliseconds of time     4 bytes
1279  * file name len            2 bytes
1280  * file pathname            N bytes + 1 terminating NULL byte
1281  */
1282 static int
1283 fetch_file_tok(tokenstr_t *tok, char *buf, int len)
1284 {
1285 	int err = 0;
1286 
1287 	READ_TOKEN_U_INT32(buf, len, tok->tt.file.s, tok->len, err);
1288 	if (err)
1289 		return (-1);
1290 
1291 	READ_TOKEN_U_INT32(buf, len, tok->tt.file.ms, tok->len, err);
1292 	if (err)
1293 		return (-1);
1294 
1295 	READ_TOKEN_U_INT16(buf, len, tok->tt.file.len, tok->len, err);
1296 	if (err)
1297 		return (-1);
1298 
1299 	SET_PTR(buf, len, tok->tt.file.name, tok->tt.file.len, tok->len, err);
1300 	if (err)
1301 		return (-1);
1302 
1303 	return (0);
1304 }
1305 
1306 static void
1307 print_file_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1308     __unused char sfrm)
1309 {
1310 
1311 	print_tok_type(fp, tok->id, "file", raw);
1312 	print_delim(fp, del);
1313 	print_sec32(fp, tok->tt.file.s, raw);
1314 	print_delim(fp, del);
1315 	print_msec32(fp, tok->tt.file.ms, raw);
1316 	print_delim(fp, del);
1317 	print_string(fp, tok->tt.file.name, tok->tt.file.len);
1318 }
1319 
1320 /*
1321  * number groups           2 bytes
1322  * group list              count * 4 bytes
1323  */
1324 static int
1325 fetch_newgroups_tok(tokenstr_t *tok, char *buf, int len)
1326 {
1327 	int i;
1328 	int err = 0;
1329 
1330 	READ_TOKEN_U_INT16(buf, len, tok->tt.grps.no, tok->len, err);
1331 	if (err)
1332 		return (-1);
1333 
1334 	for (i = 0; i<tok->tt.grps.no; i++) {
1335 		READ_TOKEN_U_INT32(buf, len, tok->tt.grps.list[i], tok->len,
1336 		    err);
1337     		if (err)
1338     			return (-1);
1339 	}
1340 
1341 	return (0);
1342 }
1343 
1344 static void
1345 print_newgroups_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1346     __unused char sfrm)
1347 {
1348 	int i;
1349 
1350 	print_tok_type(fp, tok->id, "group", raw);
1351 	for (i = 0; i < tok->tt.grps.no; i++) {
1352 		print_delim(fp, del);
1353 		print_group(fp, tok->tt.grps.list[i], raw);
1354 	}
1355 }
1356 
1357 /*
1358  * Internet addr 4 bytes
1359  */
1360 static int
1361 fetch_inaddr_tok(tokenstr_t *tok, char *buf, int len)
1362 {
1363 	int err = 0;
1364 
1365 	READ_TOKEN_BYTES(buf, len, &tok->tt.inaddr.addr, sizeof(uint32_t),
1366 	    tok->len, err);
1367 	if (err)
1368 		return (-1);
1369 
1370 	return (0);
1371 
1372 }
1373 
1374 static void
1375 print_inaddr_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1376     __unused char sfrm)
1377 {
1378 
1379 	print_tok_type(fp, tok->id, "ip addr", raw);
1380 	print_delim(fp, del);
1381 	print_ip_address(fp, tok->tt.inaddr.addr);
1382 }
1383 
1384 /*
1385  * type 	4 bytes
1386  * address 16 bytes
1387  */
1388 static int
1389 fetch_inaddr_ex_tok(tokenstr_t *tok, char *buf, int len)
1390 {
1391 	int err = 0;
1392 
1393 	READ_TOKEN_U_INT32(buf, len, tok->tt.inaddr_ex.type, tok->len, err);
1394 	if (err)
1395 		return (-1);
1396 
1397 	if (tok->tt.inaddr_ex.type == AU_IPv4) {
1398 		READ_TOKEN_BYTES(buf, len, &tok->tt.inaddr_ex.addr[0],
1399 		    sizeof(tok->tt.inaddr_ex.addr[0]), tok->len, err);
1400 		if (err)
1401 			return (-1);
1402 	} else if (tok->tt.inaddr_ex.type == AU_IPv6) {
1403 		READ_TOKEN_BYTES(buf, len, tok->tt.inaddr_ex.addr,
1404 		    sizeof(tok->tt.inaddr_ex.addr), tok->len, err);
1405 		if (err)
1406 			return (-1);
1407 	} else
1408 		return (-1);
1409 
1410 	return (0);
1411 }
1412 
1413 static void
1414 print_inaddr_ex_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1415     __unused char sfrm)
1416 {
1417 
1418 	print_tok_type(fp, tok->id, "ip addr ex", raw);
1419 	print_delim(fp, del);
1420 	print_ip_ex_address(fp, tok->tt.inaddr_ex.type,
1421 	    tok->tt.inaddr_ex.addr);
1422 }
1423 
1424 /*
1425  * ip header     20 bytes
1426  */
1427 static int
1428 fetch_ip_tok(tokenstr_t *tok, char *buf, int len)
1429 {
1430 	int err = 0;
1431 
1432 	READ_TOKEN_U_CHAR(buf, len, tok->tt.ip.version, tok->len, err);
1433 	if (err)
1434 		return (-1);
1435 
1436 	READ_TOKEN_U_CHAR(buf, len, tok->tt.ip.tos, tok->len, err);
1437 	if (err)
1438 		return (-1);
1439 
1440 	READ_TOKEN_BYTES(buf, len, &tok->tt.ip.len, sizeof(uint16_t),
1441 	    tok->len, err);
1442 	if (err)
1443 		return (-1);
1444 
1445 	READ_TOKEN_BYTES(buf, len, &tok->tt.ip.id, sizeof(uint16_t),
1446 	    tok->len, err);
1447 	if (err)
1448 		return (-1);
1449 
1450 	READ_TOKEN_BYTES(buf, len, &tok->tt.ip.offset, sizeof(uint16_t),
1451 	    tok->len, err);
1452 	if (err)
1453 		return (-1);
1454 
1455 	READ_TOKEN_U_CHAR(buf, len, tok->tt.ip.ttl, tok->len, err);
1456 	if (err)
1457 		return (-1);
1458 
1459 	READ_TOKEN_U_CHAR(buf, len, tok->tt.ip.prot, tok->len, err);
1460 	if (err)
1461 		return (-1);
1462 
1463 	READ_TOKEN_BYTES(buf, len, &tok->tt.ip.chksm, sizeof(uint16_t),
1464 	    tok->len, err);
1465 	if (err)
1466 		return (-1);
1467 
1468 	READ_TOKEN_BYTES(buf, len, &tok->tt.ip.src, sizeof(tok->tt.ip.src),
1469 	    tok->len, err);
1470 	if (err)
1471 		return (-1);
1472 
1473 	READ_TOKEN_BYTES(buf, len, &tok->tt.ip.dest, sizeof(tok->tt.ip.dest),
1474 	    tok->len, err);
1475 	if (err)
1476 		return (-1);
1477 
1478 	return (0);
1479 }
1480 
1481 static void
1482 print_ip_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1483     __unused char sfrm)
1484 {
1485 
1486 	print_tok_type(fp, tok->id, "ip", raw);
1487 	print_delim(fp, del);
1488 	print_mem(fp, (u_char *)(&tok->tt.ip.version), sizeof(u_char));
1489 	print_delim(fp, del);
1490 	print_mem(fp, (u_char *)(&tok->tt.ip.tos), sizeof(u_char));
1491 	print_delim(fp, del);
1492 	print_2_bytes(fp, ntohs(tok->tt.ip.len), "%u");
1493 	print_delim(fp, del);
1494 	print_2_bytes(fp, ntohs(tok->tt.ip.id), "%u");
1495 	print_delim(fp, del);
1496 	print_2_bytes(fp, ntohs(tok->tt.ip.offset), "%u");
1497 	print_delim(fp, del);
1498 	print_mem(fp, (u_char *)(&tok->tt.ip.ttl), sizeof(u_char));
1499 	print_delim(fp, del);
1500 	print_mem(fp, (u_char *)(&tok->tt.ip.prot), sizeof(u_char));
1501 	print_delim(fp, del);
1502 	print_2_bytes(fp, ntohs(tok->tt.ip.chksm), "%u");
1503 	print_delim(fp, del);
1504 	print_ip_address(fp, tok->tt.ip.src);
1505 	print_delim(fp, del);
1506 	print_ip_address(fp, tok->tt.ip.dest);
1507 }
1508 
1509 /*
1510  * object ID type       1 byte
1511  * Object ID            4 bytes
1512  */
1513 static int
1514 fetch_ipc_tok(tokenstr_t *tok, char *buf, int len)
1515 {
1516 	int err = 0;
1517 
1518 	READ_TOKEN_U_CHAR(buf, len, tok->tt.ipc.type, tok->len, err);
1519 	if (err)
1520 		return (-1);
1521 
1522 	READ_TOKEN_U_INT32(buf, len, tok->tt.ipc.id, tok->len, err);
1523 	if (err)
1524 		return (-1);
1525 
1526 	return (0);
1527 }
1528 
1529 static void
1530 print_ipc_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1531     __unused char sfrm)
1532 {
1533 
1534 	print_tok_type(fp, tok->id, "IPC", raw);
1535 	print_delim(fp, del);
1536 	print_ipctype(fp, tok->tt.ipc.type, raw);
1537 	print_delim(fp, del);
1538 	print_4_bytes(fp, tok->tt.ipc.id, "%u");
1539 }
1540 
1541 /*
1542  * owner user id        4 bytes
1543  * owner group id       4 bytes
1544  * creator user id      4 bytes
1545  * creator group id     4 bytes
1546  * access mode          4 bytes
1547  * slot seq                     4 bytes
1548  * key                          4 bytes
1549  */
1550 static int
1551 fetch_ipcperm_tok(tokenstr_t *tok, char *buf, int len)
1552 {
1553 	int err = 0;
1554 
1555 	READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.uid, tok->len, err);
1556 	if (err)
1557 		return (-1);
1558 
1559 	READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.gid, tok->len, err);
1560 	if (err)
1561 		return (-1);
1562 
1563 	READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.puid, tok->len, err);
1564 	if (err)
1565 		return (-1);
1566 
1567 	READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.pgid, tok->len, err);
1568 	if (err)
1569 		return (-1);
1570 
1571 	READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.mode, tok->len, err);
1572 	if (err)
1573 		return (-1);
1574 
1575 	READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.seq, tok->len, err);
1576 	if (err)
1577 		return (-1);
1578 
1579 	READ_TOKEN_U_INT32(buf, len, tok->tt.ipcperm.key, tok->len, err);
1580 	if (err)
1581 		return (-1);
1582 
1583 	return (0);
1584 }
1585 
1586 static void
1587 print_ipcperm_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1588     __unused char sfrm)
1589 {
1590 
1591 	print_tok_type(fp, tok->id, "IPC perm", raw);
1592 	print_delim(fp, del);
1593 	print_user(fp, tok->tt.ipcperm.uid, raw);
1594 	print_delim(fp, del);
1595 	print_group(fp, tok->tt.ipcperm.gid, raw);
1596 	print_delim(fp, del);
1597 	print_user(fp, tok->tt.ipcperm.puid, raw);
1598 	print_delim(fp, del);
1599 	print_group(fp, tok->tt.ipcperm.pgid, raw);
1600 	print_delim(fp, del);
1601 	print_4_bytes(fp, tok->tt.ipcperm.mode, "%o");
1602 	print_delim(fp, del);
1603 	print_4_bytes(fp, tok->tt.ipcperm.seq, "%u");
1604 	print_delim(fp, del);
1605 	print_4_bytes(fp, tok->tt.ipcperm.key, "%u");
1606 }
1607 
1608 /*
1609  * port Ip address  2 bytes
1610  */
1611 static int
1612 fetch_iport_tok(tokenstr_t *tok, char *buf, int len)
1613 {
1614 	int err = 0;
1615 
1616 	READ_TOKEN_BYTES(buf, len, &tok->tt.iport.port, sizeof(uint16_t),
1617 	    tok->len, err);
1618 	if (err)
1619 		return (-1);
1620 
1621 	return (0);
1622 }
1623 
1624 static void
1625 print_iport_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1626     __unused char sfrm)
1627 {
1628 
1629 	print_tok_type(fp, tok->id, "ip port", raw);
1630 	print_delim(fp, del);
1631 	print_2_bytes(fp, ntohs(tok->tt.iport.port), "%#x");
1632 }
1633 
1634 /*
1635  * size                         2 bytes
1636  * data                         size bytes
1637  */
1638 static int
1639 fetch_opaque_tok(tokenstr_t *tok, char *buf, int len)
1640 {
1641 	int err = 0;
1642 
1643 	READ_TOKEN_U_INT16(buf, len, tok->tt.opaque.size, tok->len, err);
1644 	if (err)
1645 		return (-1);
1646 
1647 	SET_PTR(buf, len, tok->tt.opaque.data, tok->tt.opaque.size, tok->len,
1648 	    err);
1649 	if (err)
1650 		return (-1);
1651 
1652 	return (0);
1653 }
1654 
1655 static void
1656 print_opaque_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1657     __unused char sfrm)
1658 {
1659 
1660 	print_tok_type(fp, tok->id, "opaque", raw);
1661 	print_delim(fp, del);
1662 	print_2_bytes(fp, tok->tt.opaque.size, "%u");
1663 	print_delim(fp, del);
1664 	print_mem(fp, tok->tt.opaque.data, tok->tt.opaque.size);
1665 }
1666 
1667 /*
1668  * size                         2 bytes
1669  * data                         size bytes
1670  */
1671 static int
1672 fetch_path_tok(tokenstr_t *tok, char *buf, int len)
1673 {
1674 	int err = 0;
1675 
1676 	READ_TOKEN_U_INT16(buf, len, tok->tt.path.len, tok->len, err);
1677 	if (err)
1678 		return (-1);
1679 
1680 	SET_PTR(buf, len, tok->tt.path.path, tok->tt.path.len, tok->len, err);
1681 	if (err)
1682 		return (-1);
1683 
1684 	return (0);
1685 }
1686 
1687 static void
1688 print_path_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1689     __unused char sfrm)
1690 {
1691 
1692 	print_tok_type(fp, tok->id, "path", raw);
1693 	print_delim(fp, del);
1694 	print_string(fp, tok->tt.path.path, tok->tt.path.len);
1695 }
1696 
1697 /*
1698  * token ID                     1 byte
1699  * audit ID                     4 bytes
1700  * euid                         4 bytes
1701  * egid                         4 bytes
1702  * ruid                         4 bytes
1703  * rgid                         4 bytes
1704  * pid                          4 bytes
1705  * sessid                       4 bytes
1706  * terminal ID
1707  *   portid             4 bytes
1708  *   machine id         4 bytes
1709  */
1710 static int
1711 fetch_process32_tok(tokenstr_t *tok, char *buf, int len)
1712 {
1713 	int err = 0;
1714 
1715 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.auid, tok->len, err);
1716 	if (err)
1717 		return (-1);
1718 
1719 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.euid, tok->len, err);
1720 	if (err)
1721 		return (-1);
1722 
1723 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.egid, tok->len, err);
1724 	if (err)
1725 		return (-1);
1726 
1727 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.ruid, tok->len, err);
1728 	if (err)
1729 		return (-1);
1730 
1731 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.rgid, tok->len, err);
1732 	if (err)
1733 		return (-1);
1734 
1735 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.pid, tok->len, err);
1736 	if (err)
1737 		return (-1);
1738 
1739 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.sid, tok->len, err);
1740 	if (err)
1741 		return (-1);
1742 
1743 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32.tid.port, tok->len, err);
1744 	if (err)
1745 		return (-1);
1746 
1747 	READ_TOKEN_BYTES(buf, len, &tok->tt.proc32.tid.addr,
1748 	    sizeof(tok->tt.proc32.tid.addr), tok->len, err);
1749 	if (err)
1750 		return (-1);
1751 
1752 	return (0);
1753 }
1754 
1755 static void
1756 print_process32_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1757     __unused char sfrm)
1758 {
1759 
1760 	print_tok_type(fp, tok->id, "process", raw);
1761 	print_delim(fp, del);
1762 	print_user(fp, tok->tt.proc32.auid, raw);
1763 	print_delim(fp, del);
1764 	print_user(fp, tok->tt.proc32.euid, raw);
1765 	print_delim(fp, del);
1766 	print_group(fp, tok->tt.proc32.egid, raw);
1767 	print_delim(fp, del);
1768 	print_user(fp, tok->tt.proc32.ruid, raw);
1769 	print_delim(fp, del);
1770 	print_group(fp, tok->tt.proc32.rgid, raw);
1771 	print_delim(fp, del);
1772 	print_4_bytes(fp, tok->tt.proc32.pid, "%u");
1773 	print_delim(fp, del);
1774 	print_4_bytes(fp, tok->tt.proc32.sid, "%u");
1775 	print_delim(fp, del);
1776 	print_4_bytes(fp, tok->tt.proc32.tid.port, "%u");
1777 	print_delim(fp, del);
1778 	print_ip_address(fp, tok->tt.proc32.tid.addr);
1779 }
1780 
1781 static int
1782 fetch_process32ex_tok(tokenstr_t *tok, char *buf, int len)
1783 {
1784 	int err = 0;
1785 
1786 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.auid, tok->len, err);
1787 	if (err)
1788 		return (-1);
1789 
1790 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.euid, tok->len, err);
1791 	if (err)
1792 		return (-1);
1793 
1794 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.egid, tok->len, err);
1795 	if (err)
1796 		return (-1);
1797 
1798 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.ruid, tok->len, err);
1799 	if (err)
1800 		return (-1);
1801 
1802 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.rgid, tok->len, err);
1803 	if (err)
1804 		return (-1);
1805 
1806 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.pid, tok->len, err);
1807 	if (err)
1808 		return (-1);
1809 
1810 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.sid, tok->len, err);
1811 	if (err)
1812 		return (-1);
1813 
1814 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.tid.port, tok->len,
1815 	    err);
1816 	if (err)
1817 		return (-1);
1818 
1819 	READ_TOKEN_U_INT32(buf, len, tok->tt.proc32_ex.tid.type, tok->len,
1820 	    err);
1821 	if (err)
1822 		return (-1);
1823 
1824 	if (tok->tt.proc32_ex.tid.type == AU_IPv4) {
1825 		READ_TOKEN_BYTES(buf, len, &tok->tt.proc32_ex.tid.addr[0],
1826 		    sizeof(tok->tt.proc32_ex.tid.addr[0]), tok->len, err);
1827 		if (err)
1828 			return (-1);
1829 	} else if (tok->tt.proc32_ex.tid.type == AU_IPv6) {
1830 		READ_TOKEN_BYTES(buf, len, tok->tt.proc32_ex.tid.addr,
1831 		    sizeof(tok->tt.proc32_ex.tid.addr), tok->len, err);
1832 		if (err)
1833 			return (-1);
1834 	} else
1835 		return (-1);
1836 
1837 	return (0);
1838 }
1839 
1840 static void
1841 print_process32ex_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1842     __unused char sfrm)
1843 {
1844 
1845 	print_tok_type(fp, tok->id, "process_ex", raw);
1846 	print_delim(fp, del);
1847 	print_user(fp, tok->tt.proc32_ex.auid, raw);
1848 	print_delim(fp, del);
1849 	print_user(fp, tok->tt.proc32_ex.euid, raw);
1850 	print_delim(fp, del);
1851 	print_group(fp, tok->tt.proc32_ex.egid, raw);
1852 	print_delim(fp, del);
1853 	print_user(fp, tok->tt.proc32_ex.ruid, raw);
1854 	print_delim(fp, del);
1855 	print_group(fp, tok->tt.proc32_ex.rgid, raw);
1856 	print_delim(fp, del);
1857 	print_4_bytes(fp, tok->tt.proc32_ex.pid, "%u");
1858 	print_delim(fp, del);
1859 	print_4_bytes(fp, tok->tt.proc32_ex.sid, "%u");
1860 	print_delim(fp, del);
1861 	print_4_bytes(fp, tok->tt.proc32_ex.tid.port, "%u");
1862 	print_delim(fp, del);
1863 	print_ip_ex_address(fp, tok->tt.proc32_ex.tid.type,
1864 	    tok->tt.proc32_ex.tid.addr);
1865 }
1866 
1867 /*
1868  * errno                        1 byte
1869  * return value         4 bytes
1870  */
1871 static int
1872 fetch_return32_tok(tokenstr_t *tok, char *buf, int len)
1873 {
1874 	int err = 0;
1875 
1876 	READ_TOKEN_U_CHAR(buf, len, tok->tt.ret32.status, tok->len, err);
1877 	if (err)
1878 		return (-1);
1879 
1880 	READ_TOKEN_U_INT32(buf, len, tok->tt.ret32.ret, tok->len, err);
1881 	if (err)
1882 		return (-1);
1883 
1884 	return (0);
1885 }
1886 
1887 static void
1888 print_return32_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1889     __unused char sfrm)
1890 {
1891 
1892 	print_tok_type(fp, tok->id, "return", raw);
1893 	print_delim(fp, del);
1894 	print_retval(fp, tok->tt.ret32.status, raw);
1895 	print_delim(fp, del);
1896 	print_4_bytes(fp, tok->tt.ret32.ret, "%u");
1897 }
1898 
1899 static int
1900 fetch_return64_tok(tokenstr_t *tok, char *buf, int len)
1901 {
1902 	int err = 0;
1903 
1904 	READ_TOKEN_U_CHAR(buf, len, tok->tt.ret64.err, tok->len, err);
1905 	if (err)
1906 		return (-1);
1907 
1908 	READ_TOKEN_U_INT64(buf, len, tok->tt.ret64.val, tok->len, err);
1909 	if (err)
1910 		return (-1);
1911 
1912 	return (0);
1913 }
1914 
1915 static void
1916 print_return64_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1917     __unused char sfrm)
1918 {
1919 
1920 	print_tok_type(fp, tok->id, "return", raw);
1921 	print_delim(fp, del);
1922 	print_retval(fp, tok->tt.ret64.err, raw);
1923 	print_delim(fp, del);
1924 	print_8_bytes(fp, tok->tt.ret64.val, "%lld");
1925 }
1926 
1927 /*
1928  * seq                          4 bytes
1929  */
1930 static int
1931 fetch_seq_tok(tokenstr_t *tok, char *buf, int len)
1932 {
1933 	int err = 0;
1934 
1935 	READ_TOKEN_U_INT32(buf, len, tok->tt.seq.seqno, tok->len, err);
1936 	if (err)
1937 		return (-1);
1938 
1939 	return (0);
1940 }
1941 
1942 static void
1943 print_seq_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1944     __unused char sfrm)
1945 {
1946 
1947 	print_tok_type(fp, tok->id, "sequence", raw);
1948 	print_delim(fp, del);
1949 	print_4_bytes(fp, tok->tt.seq.seqno, "%u");
1950 }
1951 
1952 /*
1953  * socket family           2 bytes
1954  * local port              2 bytes
1955  * socket address          4 bytes
1956  */
1957 static int
1958 fetch_sock_inet32_tok(tokenstr_t *tok, char *buf, int len)
1959 {
1960 	int err = 0;
1961 
1962 	READ_TOKEN_U_INT16(buf, len, tok->tt.sockinet32.family, tok->len,
1963 	    err);
1964 	if (err)
1965 		return (-1);
1966 
1967 	READ_TOKEN_BYTES(buf, len, &tok->tt.sockinet32.port,
1968 	    sizeof(uint16_t), tok->len, err);
1969 	if (err)
1970 		return (-1);
1971 
1972 	READ_TOKEN_BYTES(buf, len, &tok->tt.sockinet32.addr,
1973 	    sizeof(tok->tt.sockinet32.addr), tok->len, err);
1974 	if (err)
1975 		return (-1);
1976 
1977 	return (0);
1978 }
1979 
1980 static void
1981 print_sock_inet32_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
1982     __unused char sfrm)
1983 {
1984 
1985 	print_tok_type(fp, tok->id, "socket-inet", raw);
1986 	print_delim(fp, del);
1987 	print_2_bytes(fp, tok->tt.sockinet32.family, "%u");
1988 	print_delim(fp, del);
1989 	print_2_bytes(fp, ntohs(tok->tt.sockinet32.port), "%u");
1990 	print_delim(fp, del);
1991 	print_ip_address(fp, tok->tt.sockinet32.addr);
1992 }
1993 
1994 /*
1995  * socket family           2 bytes
1996  * path                    104 bytes
1997  */
1998 static int
1999 fetch_sock_unix_tok(tokenstr_t *tok, char *buf, int len)
2000 {
2001 	int err = 0;
2002 
2003 	READ_TOKEN_U_INT16(buf, len, tok->tt.sockunix.family, tok->len, err);
2004 	if (err)
2005 		return (-1);
2006 
2007 	READ_TOKEN_BYTES(buf, len, tok->tt.sockunix.path, 104, tok->len,
2008 	    err);
2009 	if (err)
2010 		return (-1);
2011 
2012 	return (0);
2013 }
2014 
2015 static void
2016 print_sock_unix_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
2017     __unused char sfrm)
2018 {
2019 
2020 	print_tok_type(fp, tok->id, "socket-unix", raw);
2021 	print_delim(fp, del);
2022 	print_2_bytes(fp, tok->tt.sockunix.family, "%u");
2023 	print_delim(fp, del);
2024 	print_string(fp, tok->tt.sockunix.path,
2025 	    strlen(tok->tt.sockunix.path));
2026 }
2027 
2028 /*
2029  * socket type             2 bytes
2030  * local port              2 bytes
2031  * local address           4 bytes
2032  * remote port             2 bytes
2033  * remote address          4 bytes
2034  */
2035 static int
2036 fetch_socket_tok(tokenstr_t *tok, char *buf, int len)
2037 {
2038 	int err = 0;
2039 
2040 	READ_TOKEN_U_INT16(buf, len, tok->tt.socket.type, tok->len, err);
2041 	if (err)
2042 		return (-1);
2043 
2044 	READ_TOKEN_BYTES(buf, len, &tok->tt.socket.l_port, sizeof(uint16_t),
2045 	    tok->len, err);
2046 	if (err)
2047 		return (-1);
2048 
2049 	READ_TOKEN_BYTES(buf, len, &tok->tt.socket.l_addr,
2050 	    sizeof(tok->tt.socket.l_addr), tok->len, err);
2051 	if (err)
2052 		return (-1);
2053 
2054 	READ_TOKEN_BYTES(buf, len, &tok->tt.socket.r_port, sizeof(uint16_t),
2055 	    tok->len, err);
2056 	if (err)
2057 		return (-1);
2058 
2059 	READ_TOKEN_BYTES(buf, len, &tok->tt.socket.l_addr,
2060 	    sizeof(tok->tt.socket.r_addr), tok->len, err);
2061 	if (err)
2062 		return (-1);
2063 
2064 	return (0);
2065 }
2066 
2067 static void
2068 print_socket_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
2069     __unused char sfrm)
2070 {
2071 
2072 	print_tok_type(fp, tok->id, "socket", raw);
2073 	print_delim(fp, del);
2074 	print_2_bytes(fp, tok->tt.socket.type, "%u");
2075 	print_delim(fp, del);
2076 	print_2_bytes(fp, ntohs(tok->tt.socket.l_port), "%u");
2077 	print_delim(fp, del);
2078 	print_ip_address(fp, tok->tt.socket.l_addr);
2079 	print_delim(fp, del);
2080 	print_2_bytes(fp, ntohs(tok->tt.socket.r_port), "%u");
2081 	print_delim(fp, del);
2082 	print_ip_address(fp, tok->tt.socket.r_addr);
2083 }
2084 
2085 /*
2086  * audit ID                     4 bytes
2087  * euid                         4 bytes
2088  * egid                         4 bytes
2089  * ruid                         4 bytes
2090  * rgid                         4 bytes
2091  * pid                          4 bytes
2092  * sessid                       4 bytes
2093  * terminal ID
2094  *   portid             4 bytes/8 bytes (32-bit/64-bit value)
2095  *   machine id         4 bytes
2096  */
2097 static int
2098 fetch_subject32_tok(tokenstr_t *tok, char *buf, int len)
2099 {
2100 	int err = 0;
2101 
2102 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.auid, tok->len, err);
2103 	if (err)
2104 		return (-1);
2105 
2106 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.euid, tok->len, err);
2107 	if (err)
2108 		return (-1);
2109 
2110 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.egid, tok->len, err);
2111 	if (err)
2112 		return (-1);
2113 
2114 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.ruid, tok->len, err);
2115 	if (err)
2116 		return (-1);
2117 
2118 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.rgid, tok->len, err);
2119 	if (err)
2120 		return (-1);
2121 
2122 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.pid, tok->len, err);
2123 	if (err)
2124 		return (-1);
2125 
2126 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.sid, tok->len, err);
2127 	if (err)
2128 		return (-1);
2129 
2130 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32.tid.port, tok->len, err);
2131 	if (err)
2132 		return (-1);
2133 
2134 	READ_TOKEN_BYTES(buf, len, &tok->tt.subj32.tid.addr,
2135 	    sizeof(tok->tt.subj32.tid.addr), tok->len, err);
2136 	if (err)
2137 		return (-1);
2138 
2139 	return (0);
2140 }
2141 
2142 static void
2143 print_subject32_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
2144     __unused char sfrm)
2145 {
2146 
2147 	print_tok_type(fp, tok->id, "subject", raw);
2148 	print_delim(fp, del);
2149 	print_user(fp, tok->tt.subj32.auid, raw);
2150 	print_delim(fp, del);
2151 	print_user(fp, tok->tt.subj32.euid, raw);
2152 	print_delim(fp, del);
2153 	print_group(fp, tok->tt.subj32.egid, raw);
2154 	print_delim(fp, del);
2155 	print_user(fp, tok->tt.subj32.ruid, raw);
2156 	print_delim(fp, del);
2157 	print_group(fp, tok->tt.subj32.rgid, raw);
2158 	print_delim(fp, del);
2159 	print_4_bytes(fp, tok->tt.subj32.pid, "%u");
2160 	print_delim(fp, del);
2161 	print_4_bytes(fp, tok->tt.subj32.sid, "%u");
2162 	print_delim(fp, del);
2163 	print_4_bytes(fp, tok->tt.subj32.tid.port, "%u");
2164 	print_delim(fp, del);
2165 	print_ip_address(fp, tok->tt.subj32.tid.addr);
2166 }
2167 
2168 /*
2169  * audit ID                     4 bytes
2170  * euid                         4 bytes
2171  * egid                         4 bytes
2172  * ruid                         4 bytes
2173  * rgid                         4 bytes
2174  * pid                          4 bytes
2175  * sessid                       4 bytes
2176  * terminal ID
2177  *   portid             4 bytes/8 bytes (32-bit/64-bit value)
2178  *   machine id         4 bytes
2179  */
2180 static int
2181 fetch_subject64_tok(tokenstr_t *tok, char *buf, int len)
2182 {
2183 	int err = 0;
2184 
2185 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.auid, tok->len, err);
2186 	if (err)
2187 		return (-1);
2188 
2189 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.euid, tok->len, err);
2190 	if (err)
2191 		return (-1);
2192 
2193 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.egid, tok->len, err);
2194 	if (err)
2195 		return (-1);
2196 
2197 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.ruid, tok->len, err);
2198 	if (err)
2199 		return (-1);
2200 
2201 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.rgid, tok->len, err);
2202 	if (err)
2203 		return (-1);
2204 
2205 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.pid, tok->len, err);
2206 	if (err)
2207 		return (-1);
2208 
2209 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj64.sid, tok->len, err);
2210 	if (err)
2211 		return (-1);
2212 
2213 	READ_TOKEN_U_INT64(buf, len, tok->tt.subj64.tid.port, tok->len, err);
2214 	if (err)
2215 		return (-1);
2216 
2217 	READ_TOKEN_BYTES(buf, len, &tok->tt.subj64.tid.addr,
2218 	    sizeof(tok->tt.subj64.tid.addr), tok->len, err);
2219 	if (err)
2220 		return (-1);
2221 
2222 	return (0);
2223 }
2224 
2225 static void
2226 print_subject64_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
2227     __unused char sfrm)
2228 {
2229 
2230 	print_tok_type(fp, tok->id, "subject", raw);
2231 	print_delim(fp, del);
2232 	print_user(fp, tok->tt.subj64.auid, raw);
2233 	print_delim(fp, del);
2234 	print_user(fp, tok->tt.subj64.euid, raw);
2235 	print_delim(fp, del);
2236 	print_group(fp, tok->tt.subj64.egid, raw);
2237 	print_delim(fp, del);
2238 	print_user(fp, tok->tt.subj64.ruid, raw);
2239 	print_delim(fp, del);
2240 	print_group(fp, tok->tt.subj64.rgid, raw);
2241 	print_delim(fp, del);
2242 	print_4_bytes(fp, tok->tt.subj64.pid, "%u");
2243 	print_delim(fp, del);
2244 	print_4_bytes(fp, tok->tt.subj64.sid, "%u");
2245 	print_delim(fp, del);
2246 	print_8_bytes(fp, tok->tt.subj64.tid.port, "%llu");
2247 	print_delim(fp, del);
2248 	print_ip_address(fp, tok->tt.subj64.tid.addr);
2249 }
2250 
2251 /*
2252  * audit ID                     4 bytes
2253  * euid                         4 bytes
2254  * egid                         4 bytes
2255  * ruid                         4 bytes
2256  * rgid                         4 bytes
2257  * pid                          4 bytes
2258  * sessid                       4 bytes
2259  * terminal ID
2260  *   portid             4 bytes
2261  *	 type				4 bytes
2262  *   machine id         16 bytes
2263  */
2264 static int
2265 fetch_subject32ex_tok(tokenstr_t *tok, char *buf, int len)
2266 {
2267 	int err = 0;
2268 
2269 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.auid, tok->len, err);
2270 	if (err)
2271 		return (-1);
2272 
2273 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.euid, tok->len, err);
2274 	if (err)
2275 		return (-1);
2276 
2277 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.egid, tok->len, err);
2278 	if (err)
2279 		return (-1);
2280 
2281 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.ruid, tok->len, err);
2282 	if (err)
2283 		return (-1);
2284 
2285 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.rgid, tok->len, err);
2286 	if (err)
2287 		return (-1);
2288 
2289 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.pid, tok->len, err);
2290 	if (err)
2291 		return (-1);
2292 
2293 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.sid, tok->len, err);
2294 	if (err)
2295 		return (-1);
2296 
2297 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.tid.port, tok->len,
2298 	    err);
2299 	if (err)
2300 		return (-1);
2301 
2302 	READ_TOKEN_U_INT32(buf, len, tok->tt.subj32_ex.tid.type, tok->len,
2303 	    err);
2304 	if (err)
2305 		return (-1);
2306 
2307 	if (tok->tt.subj32_ex.tid.type == AU_IPv4) {
2308 		READ_TOKEN_BYTES(buf, len, &tok->tt.subj32_ex.tid.addr[0],
2309 		    sizeof(tok->tt.subj32_ex.tid.addr[0]), tok->len, err);
2310 		if (err)
2311 			return (-1);
2312 	} else if (tok->tt.subj32_ex.tid.type == AU_IPv6) {
2313 		READ_TOKEN_BYTES(buf, len, tok->tt.subj32_ex.tid.addr,
2314 		    sizeof(tok->tt.subj32_ex.tid.addr), tok->len, err);
2315 		if (err)
2316 			return (-1);
2317 	} else
2318 		return (-1);
2319 
2320 	return (0);
2321 }
2322 
2323 static void
2324 print_subject32ex_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
2325     __unused char sfrm)
2326 {
2327 
2328 	print_tok_type(fp, tok->id, "subject_ex", raw);
2329 	print_delim(fp, del);
2330 	print_user(fp, tok->tt.subj32_ex.auid, raw);
2331 	print_delim(fp, del);
2332 	print_user(fp, tok->tt.subj32_ex.euid, raw);
2333 	print_delim(fp, del);
2334 	print_group(fp, tok->tt.subj32_ex.egid, raw);
2335 	print_delim(fp, del);
2336 	print_user(fp, tok->tt.subj32_ex.ruid, raw);
2337 	print_delim(fp, del);
2338 	print_group(fp, tok->tt.subj32_ex.rgid, raw);
2339 	print_delim(fp, del);
2340 	print_4_bytes(fp, tok->tt.subj32_ex.pid, "%u");
2341 	print_delim(fp, del);
2342 	print_4_bytes(fp, tok->tt.subj32_ex.sid, "%u");
2343 	print_delim(fp, del);
2344 	print_4_bytes(fp, tok->tt.subj32_ex.tid.port, "%u");
2345 	print_delim(fp, del);
2346 	print_ip_ex_address(fp, tok->tt.subj32_ex.tid.type,
2347 	    tok->tt.subj32_ex.tid.addr);
2348 }
2349 
2350 /*
2351  * size                         2 bytes
2352  * data                         size bytes
2353  */
2354 static int
2355 fetch_text_tok(tokenstr_t *tok, char *buf, int len)
2356 {
2357 	int err = 0;
2358 
2359 	READ_TOKEN_U_INT16(buf, len, tok->tt.text.len, tok->len, err);
2360 	if (err)
2361 		return (-1);
2362 
2363 	SET_PTR(buf, len, tok->tt.text.text, tok->tt.text.len, tok->len,
2364 	    err);
2365 	if (err)
2366 		return (-1);
2367 
2368 	return (0);
2369 }
2370 
2371 static void
2372 print_text_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
2373     __unused char sfrm)
2374 {
2375 
2376 	print_tok_type(fp, tok->id, "text", raw);
2377 	print_delim(fp, del);
2378 	print_string(fp, tok->tt.text.text, tok->tt.text.len);
2379 }
2380 
2381 /*
2382  * socket type             2 bytes
2383  * local port              2 bytes
2384  * address type/length     4 bytes
2385  * local Internet address  4 bytes
2386  * remote port             4 bytes
2387  * address type/length     4 bytes
2388  * remote Internet address 4 bytes
2389  */
2390 static int
2391 fetch_socketex32_tok(tokenstr_t *tok, char *buf, int len)
2392 {
2393 	int err = 0;
2394 
2395 	READ_TOKEN_U_INT16(buf, len, tok->tt.socket_ex32.type, tok->len,
2396 	    err);
2397 	if (err)
2398 		return (-1);
2399 
2400 	READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.l_port,
2401 	    sizeof(uint16_t), tok->len, err);
2402 	if (err)
2403 		return (-1);
2404 
2405 	READ_TOKEN_U_INT32(buf, len, tok->tt.socket_ex32.l_ad_type, tok->len,
2406 	    err);
2407 	if (err)
2408 		return (-1);
2409 
2410 	READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.l_addr,
2411 	    sizeof(tok->tt.socket_ex32.l_addr), tok->len, err);
2412 	if (err)
2413 		return (-1);
2414 
2415 	READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.r_port,
2416 	    sizeof(uint16_t), tok->len, err);
2417 	if (err)
2418 		return (-1);
2419 
2420 	READ_TOKEN_U_INT32(buf, len, tok->tt.socket_ex32.r_ad_type, tok->len,
2421 	    err);
2422 	if (err)
2423 		return (-1);
2424 
2425 	READ_TOKEN_BYTES(buf, len, &tok->tt.socket_ex32.r_addr,
2426 	    sizeof(tok->tt.socket_ex32.r_addr), tok->len, err);
2427 	if (err)
2428 		return (-1);
2429 
2430 	return (0);
2431 }
2432 
2433 static void
2434 print_socketex32_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
2435     __unused char sfrm)
2436 {
2437 
2438 	print_tok_type(fp, tok->id, "socket", raw);
2439 	print_delim(fp, del);
2440 	print_2_bytes(fp, tok->tt.socket_ex32.type, "%#x");
2441 	print_delim(fp, del);
2442 	print_2_bytes(fp, ntohs(tok->tt.socket_ex32.l_port), "%#x");
2443 	print_delim(fp, del);
2444 	print_ip_address(fp, tok->tt.socket_ex32.l_addr);
2445 	print_delim(fp, del);
2446 	print_4_bytes(fp, ntohs(tok->tt.socket_ex32.r_port), "%#x");
2447 	print_delim(fp, del);
2448 	print_ip_address(fp, tok->tt.socket_ex32.r_addr);
2449 }
2450 
2451 static int
2452 fetch_invalid_tok(tokenstr_t *tok, char *buf, int len)
2453 {
2454 	int err = 0;
2455 	int recoversize;
2456 
2457 	recoversize = len - (tok->len + AUDIT_TRAILER_SIZE);
2458 	if (recoversize <= 0)
2459 		return (-1);
2460 
2461 	tok->tt.invalid.length = recoversize;
2462 
2463 	SET_PTR(buf, len, tok->tt.invalid.data, recoversize, tok->len, err);
2464 	if (err)
2465 		return (-1);
2466 
2467 	return (0);
2468 }
2469 
2470 static void
2471 print_invalid_tok(FILE *fp, tokenstr_t *tok, char *del, char raw,
2472     __unused char sfrm)
2473 {
2474 
2475 	print_tok_type(fp, tok->id, "unknown", raw);
2476 	print_delim(fp, del);
2477 	print_mem(fp, tok->tt.invalid.data, tok->tt.invalid.length);
2478 }
2479 
2480 
2481 /*
2482  * Reads the token beginning at buf into tok.
2483  */
2484 int
2485 au_fetch_tok(tokenstr_t *tok, u_char *buf, int len)
2486 {
2487 
2488 	if (len <= 0)
2489 		return (-1);
2490 
2491 	tok->len = 1;
2492 	tok->data = buf;
2493 	tok->id = *buf;
2494 
2495 	switch(tok->id) {
2496 	case AUT_HEADER32:
2497 		return (fetch_header32_tok(tok, buf, len));
2498 
2499 	case AUT_HEADER32_EX:
2500 		return (fetch_header32_ex_tok(tok, buf, len));
2501 
2502 	case AUT_HEADER64:
2503 		return (fetch_header64_tok(tok, buf, len));
2504 
2505 	case AUT_HEADER64_EX:
2506 		return (fetch_header64_ex_tok(tok, buf, len));
2507 
2508 	case AUT_TRAILER:
2509 		return (fetch_trailer_tok(tok, buf, len));
2510 
2511 	case AUT_ARG32:
2512 		return (fetch_arg32_tok(tok, buf, len));
2513 
2514 	case AUT_ARG64:
2515 		return (fetch_arg64_tok(tok, buf, len));
2516 
2517 	case AUT_ATTR32:
2518 		return (fetch_attr32_tok(tok, buf, len));
2519 
2520 	case AUT_ATTR64:
2521 		return (fetch_attr64_tok(tok, buf, len));
2522 
2523 	case AUT_EXIT:
2524 		return (fetch_exit_tok(tok, buf, len));
2525 
2526 	case AUT_EXEC_ARGS:
2527 		return (fetch_execarg_tok(tok, buf, len));
2528 
2529 	case AUT_EXEC_ENV:
2530 		return (fetch_execenv_tok(tok, buf, len));
2531 
2532 	case AUT_OTHER_FILE32:
2533 		return (fetch_file_tok(tok, buf, len));
2534 
2535 	case AUT_NEWGROUPS:
2536 		return (fetch_newgroups_tok(tok, buf, len));
2537 
2538 	case AUT_IN_ADDR:
2539 		return (fetch_inaddr_tok(tok, buf, len));
2540 
2541 	case AUT_IN_ADDR_EX:
2542 		return (fetch_inaddr_ex_tok(tok, buf, len));
2543 
2544 	case AUT_IP:
2545 		return (fetch_ip_tok(tok, buf, len));
2546 
2547 	case AUT_IPC:
2548 		return (fetch_ipc_tok(tok, buf, len));
2549 
2550 	case AUT_IPC_PERM:
2551 		return (fetch_ipcperm_tok(tok, buf, len));
2552 
2553 	case AUT_IPORT:
2554 		return (fetch_iport_tok(tok, buf, len));
2555 
2556 	case AUT_OPAQUE:
2557 		return (fetch_opaque_tok(tok, buf, len));
2558 
2559 	case AUT_PATH:
2560 		return (fetch_path_tok(tok, buf, len));
2561 
2562 	case AUT_PROCESS32:
2563 		return (fetch_process32_tok(tok, buf, len));
2564 
2565 	case AUT_PROCESS32_EX:
2566 		return (fetch_process32ex_tok(tok, buf, len));
2567 
2568 	case AUT_RETURN32:
2569 		return (fetch_return32_tok(tok, buf, len));
2570 
2571 	case AUT_RETURN64:
2572 		return (fetch_return64_tok(tok, buf, len));
2573 
2574 	case AUT_SEQ:
2575 		return (fetch_seq_tok(tok, buf, len));
2576 
2577 	case AUT_SOCKET:
2578 		return (fetch_socket_tok(tok, buf, len));
2579 
2580 	case AUT_SOCKINET32:
2581 		return (fetch_sock_inet32_tok(tok, buf, len));
2582 
2583 	case AUT_SOCKUNIX:
2584 		return (fetch_sock_unix_tok(tok, buf, len));
2585 
2586 	case AUT_SUBJECT32:
2587 		return (fetch_subject32_tok(tok, buf, len));
2588 
2589 	case AUT_SUBJECT64:
2590 		return (fetch_subject64_tok(tok, buf, len));
2591 
2592 	case AUT_SUBJECT32_EX:
2593 		return (fetch_subject32ex_tok(tok, buf, len));
2594 
2595 	case AUT_TEXT:
2596 		return (fetch_text_tok(tok, buf, len));
2597 
2598 	case AUT_SOCKET_EX:
2599 		return (fetch_socketex32_tok(tok, buf, len));
2600 
2601 	case AUT_DATA:
2602 		return (fetch_arb_tok(tok, buf, len));
2603 
2604 	default:
2605 		return (fetch_invalid_tok(tok, buf, len));
2606 	}
2607 }
2608 
2609 /*
2610  * 'prints' the token out to outfp
2611  */
2612 void
2613 au_print_tok(FILE *outfp, tokenstr_t *tok, char *del, char raw, char sfrm)
2614 {
2615 
2616 	switch(tok->id) {
2617 	case AUT_HEADER32:
2618 		print_header32_tok(outfp, tok, del, raw, sfrm);
2619 		return;
2620 
2621 	case AUT_HEADER32_EX:
2622 		print_header32_ex_tok(outfp, tok, del, raw, sfrm);
2623 		return;
2624 
2625 	case AUT_HEADER64:
2626 		print_header64_tok(outfp, tok, del, raw, sfrm);
2627 		return;
2628 
2629 	case AUT_HEADER64_EX:
2630 		print_header64_ex_tok(outfp, tok, del, raw, sfrm);
2631 		return;
2632 
2633 	case AUT_TRAILER:
2634 		print_trailer_tok(outfp, tok, del, raw, sfrm);
2635 		return;
2636 
2637 	case AUT_ARG32:
2638 		print_arg32_tok(outfp, tok, del, raw, sfrm);
2639 		return;
2640 
2641 	case AUT_ARG64:
2642 		print_arg64_tok(outfp, tok, del, raw, sfrm);
2643 		return;
2644 
2645 	case AUT_DATA:
2646 		print_arb_tok(outfp, tok, del, raw, sfrm);
2647 		return;
2648 
2649 	case AUT_ATTR32:
2650 		print_attr32_tok(outfp, tok, del, raw, sfrm);
2651 		return;
2652 
2653 	case AUT_ATTR64:
2654 		print_attr64_tok(outfp, tok, del, raw, sfrm);
2655 		return;
2656 
2657 	case AUT_EXIT:
2658 		print_exit_tok(outfp, tok, del, raw, sfrm);
2659 		return;
2660 
2661 	case AUT_EXEC_ARGS:
2662 		print_execarg_tok(outfp, tok, del, raw, sfrm);
2663 		return;
2664 
2665 	case AUT_EXEC_ENV:
2666 		print_execenv_tok(outfp, tok, del, raw, sfrm);
2667 		return;
2668 
2669 	case AUT_OTHER_FILE32:
2670 		print_file_tok(outfp, tok, del, raw, sfrm);
2671 		return;
2672 
2673 	case AUT_NEWGROUPS:
2674 		print_newgroups_tok(outfp, tok, del, raw, sfrm);
2675 		return;
2676 
2677 	case AUT_IN_ADDR:
2678 		print_inaddr_tok(outfp, tok, del, raw, sfrm);
2679 		return;
2680 
2681 	case AUT_IN_ADDR_EX:
2682 		print_inaddr_ex_tok(outfp, tok, del, raw, sfrm);
2683 		return;
2684 
2685 	case AUT_IP:
2686 		print_ip_tok(outfp, tok, del, raw, sfrm);
2687 		return;
2688 
2689 	case AUT_IPC:
2690 		print_ipc_tok(outfp, tok, del, raw, sfrm);
2691 		return;
2692 
2693 	case AUT_IPC_PERM:
2694 		print_ipcperm_tok(outfp, tok, del, raw, sfrm);
2695 		return;
2696 
2697 	case AUT_IPORT:
2698 		print_iport_tok(outfp, tok, del, raw, sfrm);
2699 		return;
2700 
2701 	case AUT_OPAQUE:
2702 		print_opaque_tok(outfp, tok, del, raw, sfrm);
2703 		return;
2704 
2705 	case AUT_PATH:
2706 		print_path_tok(outfp, tok, del, raw, sfrm);
2707 		return;
2708 
2709 	case AUT_PROCESS32:
2710 		print_process32_tok(outfp, tok, del, raw, sfrm);
2711 		return;
2712 
2713 	case AUT_PROCESS32_EX:
2714 		print_process32ex_tok(outfp, tok, del, raw, sfrm);
2715 		return;
2716 
2717 	case AUT_RETURN32:
2718 		print_return32_tok(outfp, tok, del, raw, sfrm);
2719 		return;
2720 
2721 	case AUT_RETURN64:
2722 		print_return64_tok(outfp, tok, del, raw, sfrm);
2723 		return;
2724 
2725 	case AUT_SEQ:
2726 		print_seq_tok(outfp, tok, del, raw, sfrm);
2727 		return;
2728 
2729 	case AUT_SOCKET:
2730 		print_socket_tok(outfp, tok, del, raw, sfrm);
2731 		return;
2732 
2733 	case AUT_SOCKINET32:
2734 		print_sock_inet32_tok(outfp, tok, del, raw, sfrm);
2735 		return;
2736 
2737 	case AUT_SOCKUNIX:
2738 		print_sock_unix_tok(outfp, tok, del, raw, sfrm);
2739 		return;
2740 
2741 	case AUT_SUBJECT32:
2742 		print_subject32_tok(outfp, tok, del, raw, sfrm);
2743 		return;
2744 
2745 	case AUT_SUBJECT64:
2746 		print_subject64_tok(outfp, tok, del, raw, sfrm);
2747 		return;
2748 
2749 	case AUT_SUBJECT32_EX:
2750 		print_subject32ex_tok(outfp, tok, del, raw, sfrm);
2751 		return;
2752 
2753 	case AUT_TEXT:
2754 		print_text_tok(outfp, tok, del, raw, sfrm);
2755 		return;
2756 
2757 	case AUT_SOCKET_EX:
2758 		print_socketex32_tok(outfp, tok, del, raw, sfrm);
2759 		return;
2760 
2761 	default:
2762 		print_invalid_tok(outfp, tok, del, raw, sfrm);
2763 	}
2764 }
2765 
2766 /*
2767  * Read a record from the file pointer, store data in buf memory for buf is
2768  * also allocated in this function and has to be free'd outside this call.
2769  *
2770  * au_read_rec() handles two possibilities: a stand-alone file token, or a
2771  * complete audit record.
2772  *
2773  * XXXRW: Note that if we hit an error, we leave the stream in an unusable
2774  * state, because it will be partly offset into a record.  We should rewind
2775  * or do something more intelligent.  Particularly interesting is the case
2776  * where we perform a partial read of a record from a non-blockable file
2777  * descriptor.  We should return the partial read and continue...?
2778  */
2779 int
2780 au_read_rec(FILE *fp, u_char **buf)
2781 {
2782 	u_char *bptr;
2783 	u_int32_t recsize;
2784 	u_int32_t bytestoread;
2785 	u_char type;
2786 
2787 	u_int32_t sec, msec;
2788 	u_int16_t filenamelen;
2789 
2790 	type = fgetc(fp);
2791 
2792 	switch (type) {
2793 	case AUT_HEADER32:
2794 	case AUT_HEADER32_EX:
2795 	case AUT_HEADER64:
2796 	case AUT_HEADER64_EX:
2797 		/* read the record size from the token */
2798 		if (fread(&recsize, 1, sizeof(u_int32_t), fp) <
2799 		    sizeof(u_int32_t)) {
2800 			errno = EINVAL;
2801 			return (-1);
2802 		}
2803 		recsize = be32toh(recsize);
2804 
2805 		/* Check for recsize sanity */
2806 		if (recsize < (sizeof(u_int32_t) + sizeof(u_char))) {
2807 			errno = EINVAL;
2808 			return (-1);
2809 		}
2810 
2811 		*buf = malloc(recsize * sizeof(u_char));
2812 		if (*buf == NULL)
2813 			return (-1);
2814 		bptr = *buf;
2815 		memset(bptr, 0, recsize);
2816 
2817 		/* store the token contents already read, back to the buffer*/
2818 		*bptr = type;
2819 		bptr++;
2820 		be32enc(bptr, recsize);
2821 		bptr += sizeof(u_int32_t);
2822 
2823 		/* now read remaining record bytes */
2824 		bytestoread = recsize - (sizeof(u_int32_t) + sizeof(u_char));
2825 
2826 		if (fread(bptr, 1, bytestoread, fp) < bytestoread) {
2827 			free(*buf);
2828 			errno = EINVAL;
2829 			return (-1);
2830 		}
2831 		break;
2832 
2833 	case AUT_OTHER_FILE32:
2834 		/*
2835 		 * The file token is variable-length, as it includes a
2836 		 * pathname.  As a result, we have to read incrementally
2837 		 * until we know the total length, then allocate space and
2838 		 * read the rest.
2839 		 */
2840 		if (fread(&sec, 1, sizeof(sec), fp) < sizeof(sec)) {
2841 			errno = EINVAL;
2842 			return (-1);
2843 		}
2844 		if (fread(&msec, 1, sizeof(msec), fp) < sizeof(msec)) {
2845 			errno = EINVAL;
2846 			return (-1);
2847 		}
2848 		if (fread(&filenamelen, 1, sizeof(filenamelen), fp) <
2849 		    sizeof(filenamelen)) {
2850 			errno = EINVAL;
2851 			return (-1);
2852 		}
2853 		recsize = sizeof(type) + sizeof(sec) + sizeof(msec) +
2854 		    sizeof(filenamelen) + ntohs(filenamelen);
2855 		*buf = malloc(recsize);
2856 		if (*buf == NULL)
2857 			return (-1);
2858 		bptr = *buf;
2859 
2860 		bcopy(&type, bptr, sizeof(type));
2861 		bptr += sizeof(type);
2862 		bcopy(&sec, bptr, sizeof(sec));
2863 		bptr += sizeof(sec);
2864 		bcopy(&msec, bptr, sizeof(msec));
2865 		bptr += sizeof(msec);
2866 		bcopy(&filenamelen, bptr, sizeof(filenamelen));
2867 		bptr += sizeof(filenamelen);
2868 
2869 		if (fread(bptr, 1, ntohs(filenamelen), fp) <
2870 		    ntohs(filenamelen)) {
2871 			free(buf);
2872 			errno = EINVAL;
2873 			return (-1);
2874 		}
2875 		break;
2876 
2877 	default:
2878 		errno = EINVAL;
2879 		return (-1);
2880 	}
2881 
2882 	return (recsize);
2883 }
2884