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