1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
23 */
24
25 #include <dirent.h>
26 #include <locale.h>
27 #include <libintl.h>
28 #include <stdlib.h>
29 #include <strings.h>
30 #include <stdio.h>
31 #include <unistd.h>
32
33 #include <sys/types.h>
34 #include <sys/file.h>
35
36 #include <bsm/audit.h>
37 #include <bsm/audit_record.h>
38 #include <bsm/libbsm.h>
39
40 #include "praudit.h"
41 #include "toktable.h"
42
43 static int process_options(int *argc, char *argv[], char *names[]);
44
45 static int input_mode; /* audit file source */
46 static int format = PRF_DEFAULTM; /* output mode */
47
48 static char SEPARATOR[SEP_SIZE] = ","; /* field separator */
49
50
51 /*
52 * ----------------------------------------------------------------------
53 * praudit - display contents of audit trail file
54 *
55 * main() - main control
56 * input: - command line input: praudit -r|s -l -x -ddelim. -c filename(s)
57 * ----------------------------------------------------------------------
58 */
59
60 int
main(int argc,char ** argv)61 main(int argc, char **argv)
62 {
63 int i = 0, retstat;
64 char *names[MAXFILENAMES];
65
66 /* Internationalization */
67 (void) setlocale(LC_ALL, "");
68 (void) textdomain(TEXT_DOMAIN);
69 /*
70 * get audit file names
71 */
72 if ((retstat = process_options(&argc, argv, names)) == 0) {
73 if (format & PRF_XMLM)
74 print_audit_xml_prolog();
75 do {
76 retstat = 0;
77 /*
78 * process each audit file
79 */
80 if (input_mode == FILEMODE) {
81 if (freopen(names[i], "r", stdin) == NULL) {
82 (void) fprintf(stderr,
83 gettext("praudit: Cannot associate "
84 "stdin with %s: %s\n"),
85 names[i], strerror(errno));
86 exit(1);
87 }
88 }
89
90 /*
91 * Call the library routine to format the
92 * audit data from stdin and print to stdout
93 */
94 retstat = print_audit(format, SEPARATOR);
95
96 } while ((++i < argc) && retstat >= 0);
97 }
98 if ((retstat == 0) && (format & PRF_XMLM))
99 print_audit_xml_ending();
100
101 if (retstat == -2) {
102 (void) printf(gettext("\nusage: praudit [-r/-s] [-l] [-x] "
103 "[-ddel] [-c] filename...\n"));
104 exit(1);
105 } else if (retstat < 0) {
106 exit(1);
107 }
108 return (0);
109 }
110
111
112 /*
113 * -------------------------------------------------------------------
114 * process_options() - get command line flags and file names
115 * input: - praudit [-r]/[-s] [-l] [-x] [-ddel] [-c] {audit file names}
116 * output: - {audit file names}
117 * globals set: format: RAWM / SHORTM / XML / ONELINE or DEFAULTM
118 * SEPARATOR: default, ",", set here if
119 * user specified
120 * NOTE: no changes required here for new audit record format
121 * -------------------------------------------------------------------
122 */
123 int
process_options(int * argc,char ** argv,char ** names)124 process_options(int *argc, char **argv, char **names)
125 {
126 int c, returnstat = 0;
127
128 /*
129 * check for flags
130 */
131
132 while ((c = getopt(*argc, argv, "crslxd:")) != -1) {
133 switch (c) {
134 case 'c':
135 format |= PRF_NOCACHE; /* turn off cache */
136 break;
137 case 'r':
138 if (format & PRF_SHORTM)
139 returnstat = -2;
140 else
141 format |= PRF_RAWM;
142 break;
143 case 's':
144 if (format & PRF_RAWM)
145 returnstat = -2;
146 else
147 format |= PRF_SHORTM;
148 break;
149 case 'l':
150 format |= PRF_ONELINE;
151 break;
152 case 'x':
153 format |= PRF_XMLM;
154 break;
155 case 'd':
156 if (strlen(optarg) < sizeof (SEPARATOR))
157 (void) strlcpy(SEPARATOR, optarg,
158 sizeof (SEPARATOR));
159 else {
160 (void) fprintf(stderr,
161 gettext("praudit: Delimiter too "
162 "long. Using default.\n"));
163 }
164 break;
165 default:
166 returnstat = -2;
167 break;
168 }
169 }
170
171 argv = &argv[optind - 1];
172 *argc -= optind;
173
174 if (*argc > MAXFILENAMES) {
175 (void) fprintf(stderr, gettext("praudit: Too many file "
176 "names.\n"));
177 return (-1);
178 }
179 if (*argc > 0) {
180 int count = *argc;
181
182 input_mode = FILEMODE;
183 /*
184 * copy file names from command line
185 */
186 do {
187 *names++ = *++argv;
188 } while (--count > 0);
189 } else
190 input_mode = PIPEMODE;
191
192 return (returnstat);
193 }
194