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