]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - contrib/openbsm/bin/praudit/praudit.c
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / contrib / openbsm / bin / praudit / praudit.c
1 /*-
2  * Copyright (c) 2004-2008 Apple Inc.
3  * Copyright (c) 2006 Martin Voros
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
22  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * $P4: //depot/projects/trustedbsd/openbsm/bin/praudit/praudit.c#14 $
31  */
32
33 /*
34  * Tool used to parse audit records conforming to the BSM structure.
35  */
36
37 /*
38  * praudit [-lpx] [-r | -s] [-d del] [file ...]
39  */
40
41 #include <bsm/libbsm.h>
42
43 #include <stdio.h>
44 #include <stdlib.h>
45 #include <unistd.h>
46
47 extern char     *optarg;
48 extern int       optind, optopt, opterr,optreset;
49
50 static char     *del = ",";     /* Default delimiter. */
51 static int       oneline = 0;
52 static int       raw = 0;
53 static int       shortfrm = 0;
54 static int       partial = 0;
55 static int       xml = 0;
56
57 static void
58 usage(void)
59 {
60
61         fprintf(stderr, "usage: praudit [-lpx] [-r | -s] [-d del] "
62             "[file ...]\n");
63         exit(1);
64 }
65
66 /*
67  * Token printing for each token type .
68  */
69 static int
70 print_tokens(FILE *fp)
71 {
72         u_char *buf;
73         tokenstr_t tok;
74         int reclen;
75         int bytesread;
76
77         /* Allow tail -f | praudit to work. */
78         if (partial) {
79                 u_char type = 0;
80                 /* Record must begin with a header token. */
81                 do {
82                         type = fgetc(fp);
83                 } while(type != AUT_HEADER32);
84                 ungetc(type, fp);
85         }
86
87         while ((reclen = au_read_rec(fp, &buf)) != -1) {
88                 bytesread = 0;
89                 while (bytesread < reclen) {
90                         /* Is this an incomplete record? */
91                         if (-1 == au_fetch_tok(&tok, buf + bytesread,
92                             reclen - bytesread))
93                                 break;
94                         if (xml)
95                                 au_print_tok_xml(stdout, &tok, del, raw,
96                                     shortfrm);
97                         else
98                                 au_print_tok(stdout, &tok, del, raw,
99                                     shortfrm);
100                         bytesread += tok.len;
101                         if (oneline) {
102                                 if (!xml)
103                                         printf("%s", del);
104                         } else
105                                 printf("\n");
106                 }
107                 free(buf);
108                 if (oneline)
109                         printf("\n");
110                 fflush(stdout);
111         }
112         return (0);
113 }
114
115 int
116 main(int argc, char **argv)
117 {
118         int ch;
119         int i;
120         FILE *fp;
121
122         while ((ch = getopt(argc, argv, "d:lprsx")) != -1) {
123                 switch(ch) {
124                 case 'd':
125                         del = optarg;
126                         break;
127
128                 case 'l':
129                         oneline = 1;
130                         break;
131
132                 case 'p':
133                         partial = 1;
134                         break;
135
136                 case 'r':
137                         if (shortfrm)
138                                 usage();        /* Exclusive from shortfrm. */
139                         raw = 1;
140                         break;
141
142                 case 's':
143                         if (raw)
144                                 usage();        /* Exclusive from raw. */
145                         shortfrm = 1;
146                         break;
147
148                 case 'x':
149                         xml = 1;
150                         break;
151
152                 case '?':
153                 default:
154                         usage();
155                 }
156         }
157
158         if (xml)
159                 au_print_xml_header(stdout);
160
161         /* For each of the files passed as arguments dump the contents. */
162         if (optind == argc) {
163                 print_tokens(stdin);
164                 return (1);
165         }
166         for (i = optind; i < argc; i++) {
167                 fp = fopen(argv[i], "r");
168                 if ((fp == NULL) || (print_tokens(fp) == -1))
169                         perror(argv[i]);
170                 if (fp != NULL)
171                         fclose(fp);
172         }
173
174         if (xml)
175                 au_print_xml_footer(stdout);
176
177         return (1);
178 }