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