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