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