17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
545916cd2Sjpk  * Common Development and Distribution License (the "License").
645916cd2Sjpk  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22f8994074SJan Friedel  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
237c478bd9Sstevel@tonic-gate  */
247c478bd9Sstevel@tonic-gate 
257c478bd9Sstevel@tonic-gate /*
267c478bd9Sstevel@tonic-gate  * auditconfig - set and display audit parameters
277c478bd9Sstevel@tonic-gate  */
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #include <locale.h>
307c478bd9Sstevel@tonic-gate #include <sys/types.h>
317c478bd9Sstevel@tonic-gate #include <ctype.h>
327c478bd9Sstevel@tonic-gate #include <stdlib.h>
337c478bd9Sstevel@tonic-gate #include <stdarg.h>
347c478bd9Sstevel@tonic-gate #include <unistd.h>
357c478bd9Sstevel@tonic-gate #include <errno.h>
367c478bd9Sstevel@tonic-gate #include <sys/param.h>
377c478bd9Sstevel@tonic-gate #include <stdio.h>
387c478bd9Sstevel@tonic-gate #include <string.h>
397c478bd9Sstevel@tonic-gate #include <strings.h>
407c478bd9Sstevel@tonic-gate #include <nlist.h>
417c478bd9Sstevel@tonic-gate #include <fcntl.h>
427c478bd9Sstevel@tonic-gate #include <sys/socket.h>
437c478bd9Sstevel@tonic-gate #include <netdb.h>
447c478bd9Sstevel@tonic-gate #include <netinet/in.h>
457c478bd9Sstevel@tonic-gate #include <arpa/inet.h>
467c478bd9Sstevel@tonic-gate #include <sys/mkdev.h>
477c478bd9Sstevel@tonic-gate #include <sys/param.h>
487c478bd9Sstevel@tonic-gate #include <pwd.h>
497c478bd9Sstevel@tonic-gate #include <libintl.h>
507c478bd9Sstevel@tonic-gate #include <zone.h>
518523fda3SJan Friedel #include <libscf_priv.h>
529e3700dfSgww #include <tsol/label.h>
537c478bd9Sstevel@tonic-gate #include <bsm/libbsm.h>
54f8994074SJan Friedel #include <audit_policy.h>
55f8994074SJan Friedel #include <audit_scf.h>
567c478bd9Sstevel@tonic-gate 
579e3700dfSgww enum	commands {
589e3700dfSgww 	AC_ARG_ACONF,
598523fda3SJan Friedel 	AC_ARG_AUDIT,
609e3700dfSgww 	AC_ARG_CHKACONF,
618523fda3SJan Friedel 	AC_ARG_CHKCONF,
629e3700dfSgww 	AC_ARG_CONF,
639e3700dfSgww 	AC_ARG_GETASID,
649e3700dfSgww 	AC_ARG_GETAUDIT,
659e3700dfSgww 	AC_ARG_GETAUID,
669e3700dfSgww 	AC_ARG_GETCAR,
679e3700dfSgww 	AC_ARG_GETCLASS,
689e3700dfSgww 	AC_ARG_GETCOND,
699e3700dfSgww 	AC_ARG_GETCWD,
709e3700dfSgww 	AC_ARG_GETESTATE,
71f8994074SJan Friedel 	AC_ARG_GETFLAGS,
729e3700dfSgww 	AC_ARG_GETKAUDIT,
739e3700dfSgww 	AC_ARG_GETKMASK,
74f8994074SJan Friedel 	AC_ARG_GETNAFLAGS,
759e3700dfSgww 	AC_ARG_GETPINFO,
76f8994074SJan Friedel 	AC_ARG_GETPLUGIN,
779e3700dfSgww 	AC_ARG_GETPOLICY,
789e3700dfSgww 	AC_ARG_GETQBUFSZ,
799e3700dfSgww 	AC_ARG_GETQCTRL,
809e3700dfSgww 	AC_ARG_GETQDELAY,
819e3700dfSgww 	AC_ARG_GETQHIWATER,
829e3700dfSgww 	AC_ARG_GETQLOWATER,
839e3700dfSgww 	AC_ARG_GETSTAT,
849e3700dfSgww 	AC_ARG_GETTERMID,
859e3700dfSgww 	AC_ARG_LSEVENT,
869e3700dfSgww 	AC_ARG_LSPOLICY,
879e3700dfSgww 	AC_ARG_SETASID,
889e3700dfSgww 	AC_ARG_SETAUDIT,
899e3700dfSgww 	AC_ARG_SETAUID,
909e3700dfSgww 	AC_ARG_SETCLASS,
91f8994074SJan Friedel 	AC_ARG_SETFLAGS,
929e3700dfSgww 	AC_ARG_SETKAUDIT,
939e3700dfSgww 	AC_ARG_SETKMASK,
94f8994074SJan Friedel 	AC_ARG_SETNAFLAGS,
95f8994074SJan Friedel 	AC_ARG_SETPLUGIN,
969e3700dfSgww 	AC_ARG_SETPMASK,
979e3700dfSgww 	AC_ARG_SETPOLICY,
989e3700dfSgww 	AC_ARG_SETQBUFSZ,
999e3700dfSgww 	AC_ARG_SETQCTRL,
1009e3700dfSgww 	AC_ARG_SETQDELAY,
1019e3700dfSgww 	AC_ARG_SETQHIWATER,
1029e3700dfSgww 	AC_ARG_SETQLOWATER,
1038523fda3SJan Friedel 	AC_ARG_SETSMASK,
1048523fda3SJan Friedel 	AC_ARG_SETSTAT,
1058523fda3SJan Friedel 	AC_ARG_SETUMASK,
1068523fda3SJan Friedel 	AC_ARG_SET_TEMPORARY
1079e3700dfSgww };
1087c478bd9Sstevel@tonic-gate 
109*de4cec48SToomas Soome #define	AC_KERN_EVENT		0
110*de4cec48SToomas Soome #define	AC_USER_EVENT		1
1117c478bd9Sstevel@tonic-gate 
1127c478bd9Sstevel@tonic-gate #define	NONE(s) (!strlen(s) ? gettext("none") : s)
1137c478bd9Sstevel@tonic-gate 
1147c478bd9Sstevel@tonic-gate #define	ONEK 1024
1157c478bd9Sstevel@tonic-gate 
1167c478bd9Sstevel@tonic-gate /*
1177c478bd9Sstevel@tonic-gate  * remove this after the audit.h is fixed
1187c478bd9Sstevel@tonic-gate  */
1197c478bd9Sstevel@tonic-gate struct arg_entry {
1209e3700dfSgww 	char		*arg_str;
1219e3700dfSgww 	char		*arg_opts;
1229e3700dfSgww 	enum commands	auditconfig_cmd;
1238523fda3SJan Friedel 	boolean_t	temporary_allowed;	/* -t allowed for the option */
1247c478bd9Sstevel@tonic-gate };
1258523fda3SJan Friedel typedef struct arg_entry arg_entry_t;
1268523fda3SJan Friedel 
1278523fda3SJan Friedel /* arg_table - command option and usage message table */
1288523fda3SJan Friedel static arg_entry_t arg_table[] = {
1298523fda3SJan Friedel 	{ "-aconf",	"",			AC_ARG_ACONF,	B_FALSE},
1308523fda3SJan Friedel 	{ "-audit",	" event sorf retval string", AC_ARG_AUDIT, B_FALSE},
1318523fda3SJan Friedel 	{ "-chkaconf",	"",			AC_ARG_CHKACONF, B_FALSE},
1328523fda3SJan Friedel 	{ "-chkconf",	"",			AC_ARG_CHKCONF,	B_FALSE},
1338523fda3SJan Friedel 	{ "-conf",	"",			AC_ARG_CONF,	B_FALSE},
1348523fda3SJan Friedel 	{ "-getasid",	"",			AC_ARG_GETASID,	B_FALSE},
1358523fda3SJan Friedel 	{ "-getaudit",	"",			AC_ARG_GETAUDIT, B_FALSE},
1368523fda3SJan Friedel 	{ "-getauid",	"",			AC_ARG_GETAUID, B_FALSE},
1378523fda3SJan Friedel 	{ "-getcar",	"",			AC_ARG_GETCAR,	B_FALSE},
1388523fda3SJan Friedel 	{ "-getclass",	" event",		AC_ARG_GETCLASS, B_FALSE},
1398523fda3SJan Friedel 	{ "-getcond",	"",			AC_ARG_GETCOND,	B_FALSE},
1408523fda3SJan Friedel 	{ "-getcwd",	"",			AC_ARG_GETCWD,	B_FALSE},
1418523fda3SJan Friedel 	{ "-getestate",	" event",		AC_ARG_GETESTATE, B_FALSE},
142f8994074SJan Friedel 	{ "-getflags",	"",			AC_ARG_GETFLAGS, B_FALSE},
1438523fda3SJan Friedel 	{ "-getkaudit",	"",			AC_ARG_GETKAUDIT, B_FALSE},
1448523fda3SJan Friedel 	{ "-getkmask",	"",			AC_ARG_GETKMASK, B_FALSE},
145f8994074SJan Friedel 	{ "-getnaflags", "",			AC_ARG_GETNAFLAGS, B_FALSE},
1468523fda3SJan Friedel 	{ "-getpinfo",	" pid",			AC_ARG_GETPINFO, B_FALSE},
147f8994074SJan Friedel 	{ "-getplugin",	" [plugin]",		AC_ARG_GETPLUGIN, B_FALSE},
1488523fda3SJan Friedel 	{ "-getpolicy",	"",			AC_ARG_GETPOLICY, B_TRUE},
1498523fda3SJan Friedel 	{ "-getqbufsz",	"",			AC_ARG_GETQBUFSZ, B_TRUE},
1508523fda3SJan Friedel 	{ "-getqctrl",	"",			AC_ARG_GETQCTRL, B_TRUE},
1518523fda3SJan Friedel 	{ "-getqdelay",	"",			AC_ARG_GETQDELAY, B_TRUE},
1528523fda3SJan Friedel 	{ "-getqhiwater", "",			AC_ARG_GETQHIWATER, B_TRUE},
1538523fda3SJan Friedel 	{ "-getqlowater", "",			AC_ARG_GETQLOWATER, B_TRUE},
1548523fda3SJan Friedel 	{ "-getstat",	"",			AC_ARG_GETSTAT,	B_FALSE},
1558523fda3SJan Friedel 	{ "-gettid",	"",			AC_ARG_GETTERMID, B_FALSE},
1568523fda3SJan Friedel 	{ "-lsevent",	"",			AC_ARG_LSEVENT,	B_FALSE},
1578523fda3SJan Friedel 	{ "-lspolicy",	"",			AC_ARG_LSPOLICY, B_FALSE},
1588523fda3SJan Friedel 	{ "-setasid",	" asid [cmd]",		AC_ARG_SETASID,	B_FALSE},
1598523fda3SJan Friedel 	{ "-setaudit",	" auid audit_flags termid asid [cmd]",
1608523fda3SJan Friedel 						AC_ARG_SETAUDIT, B_FALSE},
1618523fda3SJan Friedel 	{ "-setauid",	" auid [cmd]",		AC_ARG_SETAUID,	B_FALSE},
1628523fda3SJan Friedel 	{ "-setclass",	" event audit_flags",	AC_ARG_SETCLASS, B_FALSE},
163f8994074SJan Friedel 	{ "-setflags",	" audit_flags",		AC_ARG_SETFLAGS, B_FALSE},
1648523fda3SJan Friedel 	{ "-setkaudit",	" type IP_address",	AC_ARG_SETKAUDIT, B_FALSE},
1658523fda3SJan Friedel 	{ "-setkmask",	" audit_flags",		AC_ARG_SETKMASK, B_FALSE},
166f8994074SJan Friedel 	{ "-setnaflags", " audit_naflags",	AC_ARG_SETNAFLAGS, B_FALSE},
167f8994074SJan Friedel 	{ "-setplugin",	" name active|inactive [attributes [qsize]]",
168f8994074SJan Friedel 						AC_ARG_SETPLUGIN, B_FALSE},
1698523fda3SJan Friedel 	{ "-setpmask",	" pid audit_flags",	AC_ARG_SETPMASK, B_FALSE},
1708523fda3SJan Friedel 	{ "-setpolicy",	" [+|-]policy_flags",	AC_ARG_SETPOLICY, B_TRUE},
1718523fda3SJan Friedel 	{ "-setqbufsz",	" bufsz",		AC_ARG_SETQBUFSZ, B_TRUE},
1728523fda3SJan Friedel 	{ "-setqctrl",	" hiwater lowater bufsz delay",
1738523fda3SJan Friedel 						AC_ARG_SETQCTRL, B_TRUE},
1748523fda3SJan Friedel 	{ "-setqdelay",	" delay",		AC_ARG_SETQDELAY, B_TRUE},
1758523fda3SJan Friedel 	{ "-setqhiwater", " hiwater",		AC_ARG_SETQHIWATER, B_TRUE},
1768523fda3SJan Friedel 	{ "-setqlowater", " lowater",		AC_ARG_SETQLOWATER, B_TRUE},
1778523fda3SJan Friedel 	{ "-setsmask",	" asid audit_flags",	AC_ARG_SETSMASK, B_FALSE},
1788523fda3SJan Friedel 	{ "-setstat",	"",			AC_ARG_SETSTAT, B_FALSE},
1798523fda3SJan Friedel 	{ "-setumask",	" user audit_flags",	AC_ARG_SETUMASK, B_FALSE},
1808523fda3SJan Friedel 	{ "-t",		"",			AC_ARG_SET_TEMPORARY, B_FALSE},
1817c478bd9Sstevel@tonic-gate };
1827c478bd9Sstevel@tonic-gate 
1838523fda3SJan Friedel #define	ARG_TBL_SZ (sizeof (arg_table) / sizeof (arg_entry_t))
1847c478bd9Sstevel@tonic-gate 
1858523fda3SJan Friedel char	*progname = "auditconfig";
1867c478bd9Sstevel@tonic-gate 
1878523fda3SJan Friedel /*
1888523fda3SJan Friedel  * temporary_set true to get/set only kernel settings,
1898523fda3SJan Friedel  *		 false to get/set kernel settings and service properties
1908523fda3SJan Friedel  */
1918523fda3SJan Friedel static boolean_t temporary_set = B_FALSE;
1929e3700dfSgww 
1939e3700dfSgww static au_event_ent_t *egetauevnam(char *event_name);
1949e3700dfSgww static au_event_ent_t *egetauevnum(au_event_t event_number);
1959e3700dfSgww static int arg_ent_compare(const void *aep1, const void *aep2);
1969e3700dfSgww static char *cond2str(void);
1978523fda3SJan Friedel static int policy2str(uint32_t policy, char *policy_str, size_t len);
1989e3700dfSgww static int str2type(char *s, uint_t *type);
1998523fda3SJan Friedel static int str2policy(char *policy_str, uint32_t *policy_mask);
2009e3700dfSgww static int str2ipaddr(char *s, uint32_t *addr, uint32_t type);
2019e3700dfSgww static int strisipaddr(char *s);
2029e3700dfSgww static int strisnum(char *s);
2038523fda3SJan Friedel static arg_entry_t *get_arg_ent(char *arg_str);
2049e3700dfSgww static uid_t get_user_id(char *user);
205f8994074SJan Friedel static void chk_arg_len(char *argv, uint_t len);
2069e3700dfSgww static void chk_event_num(int etype, au_event_t event);
2079e3700dfSgww static void chk_event_str(int etype, char *event_str);
208f8994074SJan Friedel static void chk_known_plugin(char *plugin_str);
2099e3700dfSgww static void chk_retval(char *retval_str);
2109e3700dfSgww static void chk_sorf(char *sorf_str);
2119e3700dfSgww static void do_aconf(void);
212f8994074SJan Friedel static void do_args(char **argv, au_mask_t *mask);
2139e3700dfSgww static void do_audit(char *, char, int, char *);
2149e3700dfSgww static void do_chkaconf(void);
2159e3700dfSgww static void do_chkconf(void);
2169e3700dfSgww static void do_conf(void);
2179e3700dfSgww static void do_getasid(void);
2189e3700dfSgww static void do_getaudit(void);
2199e3700dfSgww static void do_getkaudit(void);
2209e3700dfSgww static void do_setkaudit(char *t, char *s);
2219e3700dfSgww static void do_getauid(void);
2229e3700dfSgww static void do_getcar(void);
2239e3700dfSgww static void do_getclass(char *event_str);
2249e3700dfSgww static void do_getcond(void);
2259e3700dfSgww static void do_getcwd(void);
226f8994074SJan Friedel static void do_getflags(void);
2279e3700dfSgww static void do_getkmask(void);
228f8994074SJan Friedel static void do_getnaflags(void);
2299e3700dfSgww static void do_getpinfo(char *pid_str);
230f8994074SJan Friedel static void do_getplugin(char *plugin_str);
2319e3700dfSgww static void do_getpolicy(void);
2329e3700dfSgww static void do_getqbufsz(void);
2339e3700dfSgww static void do_getqctrl(void);
2349e3700dfSgww static void do_getqdelay(void);
2359e3700dfSgww static void do_getqhiwater(void);
2369e3700dfSgww static void do_getqlowater(void);
2379e3700dfSgww static void do_getstat(void);
2389e3700dfSgww static void do_gettermid(void);
2399e3700dfSgww static void do_lsevent(void);
2409e3700dfSgww static void do_lspolicy(void);
2419e3700dfSgww static void do_setasid(char *sid_str, char **argv);
2429e3700dfSgww static void do_setaudit(char *user_str, char *mask_str, char *tid_str,
2439e3700dfSgww     char *sid_str, char **argv);
2449e3700dfSgww static void do_setauid(char *user, char **argv);
245f8994074SJan Friedel static void do_setclass(char *event_str, au_mask_t *mask);
246f8994074SJan Friedel static void do_setflags(char *audit_flags, au_mask_t *amask);
247f8994074SJan Friedel static void do_setkmask(au_mask_t *pmask);
248f8994074SJan Friedel static void do_setnaflags(char *audit_naflags, au_mask_t *namask);
249f8994074SJan Friedel static void do_setpmask(char *pid_str, au_mask_t *mask);
250f8994074SJan Friedel static void do_setsmask(char *asid_str, au_mask_t *mask);
251f8994074SJan Friedel static void do_setumask(char *auid_str, au_mask_t *mask);
252f8994074SJan Friedel static void do_setplugin(char *plugin_str, boolean_t plugin_state,
253f8994074SJan Friedel     char *plugin_attr, int plugin_qsize);
2549e3700dfSgww static void do_setpolicy(char *policy_str);
2559e3700dfSgww static void do_setqbufsz(char *bufsz);
2569e3700dfSgww static void do_setqctrl(char *hiwater, char *lowater, char *bufsz, char *delay);
2579e3700dfSgww static void do_setqdelay(char *delay);
2589e3700dfSgww static void do_setqhiwater(char *hiwater);
2599e3700dfSgww static void do_setqlowater(char *lowater);
2609e3700dfSgww static void do_setstat(void);
2619e3700dfSgww static void str2tid(char *tid_str, au_tid_addr_t *tp);
2629e3700dfSgww 
2639e3700dfSgww static void eauditon(int cmd, caddr_t data, int length);
264f8994074SJan Friedel static void echkflags(char *auditflags, au_mask_t *mask);
2659e3700dfSgww static void egetaudit(auditinfo_addr_t *ai, int size);
2669e3700dfSgww static void egetauditflagsbin(char *auditflags, au_mask_t *pmask);
2679e3700dfSgww static void egetauid(au_id_t *auid);
268f8994074SJan Friedel static void egetkaudit(auditinfo_addr_t *ai, int size);
2699e3700dfSgww static void esetaudit(auditinfo_addr_t *ai, int size);
2709e3700dfSgww static void esetauid(au_id_t *auid);
271f8994074SJan Friedel static void esetkaudit(auditinfo_addr_t *ai, int size);
2729e3700dfSgww static void execit(char **argv);
2739e3700dfSgww static void exit_error(char *fmt, ...);
2749e3700dfSgww static void exit_usage(int status);
275f8994074SJan Friedel static void parse_args(int argc, char **argv, au_mask_t *mask);
2769e3700dfSgww static void print_asid(au_asid_t asid);
2779e3700dfSgww static void print_auid(au_id_t auid);
2789e3700dfSgww static void print_mask(char *desc, au_mask_t *pmp);
279f8994074SJan Friedel static void print_plugin(char *plugin_name, kva_t *plugin_kva);
2809e3700dfSgww static void print_tid_ex(au_tid_addr_t *tidp);
2817c478bd9Sstevel@tonic-gate 
2828523fda3SJan Friedel #if !defined(TEXT_DOMAIN)
2838523fda3SJan Friedel #define	TEXT_DOMAIN	"SUNW_OST_OSCMD"
2848523fda3SJan Friedel #endif
2858523fda3SJan Friedel 
2867c478bd9Sstevel@tonic-gate int
2879e3700dfSgww main(int argc, char **argv)
2887c478bd9Sstevel@tonic-gate {
289f8994074SJan Friedel 	au_mask_t mask;			/* for options manipulating flags */
290f8994074SJan Friedel 
2917c478bd9Sstevel@tonic-gate 	(void) setlocale(LC_ALL, "");
2927c478bd9Sstevel@tonic-gate 	(void) textdomain(TEXT_DOMAIN);
2937c478bd9Sstevel@tonic-gate 
2947c478bd9Sstevel@tonic-gate 	if (argc == 1) {
2957c478bd9Sstevel@tonic-gate 		exit_usage(0);
2967c478bd9Sstevel@tonic-gate 	}
2977c478bd9Sstevel@tonic-gate 
2987c478bd9Sstevel@tonic-gate 	if (argc == 2 &&
2998523fda3SJan Friedel 	    (argv[1][0] == '?' ||
3008523fda3SJan Friedel 	    strcmp(argv[1], "-h") == 0 ||
3018523fda3SJan Friedel 	    strcmp(argv[1], "-?") == 0)) {
3027c478bd9Sstevel@tonic-gate 		exit_usage(0);
3038523fda3SJan Friedel 	}
3047c478bd9Sstevel@tonic-gate 
305f8994074SJan Friedel 	parse_args(argc, argv, &mask);
306f8994074SJan Friedel 	do_args(argv, &mask);
3077c478bd9Sstevel@tonic-gate 
3087c478bd9Sstevel@tonic-gate 	return (0);
3097c478bd9Sstevel@tonic-gate }
3107c478bd9Sstevel@tonic-gate 
3117c478bd9Sstevel@tonic-gate /*
3127c478bd9Sstevel@tonic-gate  * parse_args()
3137c478bd9Sstevel@tonic-gate  *     Desc: Checks command line argument syntax.
3147c478bd9Sstevel@tonic-gate  *     Inputs: Command line argv;
3157c478bd9Sstevel@tonic-gate  *     Returns: If a syntax error is detected, a usage message is printed
3167c478bd9Sstevel@tonic-gate  *              and exit() is called. If a syntax error is not detected,
3177c478bd9Sstevel@tonic-gate  *              parse_args() returns without a value.
3187c478bd9Sstevel@tonic-gate  */
3197c478bd9Sstevel@tonic-gate static void
320f8994074SJan Friedel parse_args(int argc, char **argv, au_mask_t *mask)
3217c478bd9Sstevel@tonic-gate {
3228523fda3SJan Friedel 	arg_entry_t *ae;
3237c478bd9Sstevel@tonic-gate 
3247c478bd9Sstevel@tonic-gate 	uint_t type;
3257c478bd9Sstevel@tonic-gate 	uint_t addr[4];
3267c478bd9Sstevel@tonic-gate 
3277c478bd9Sstevel@tonic-gate 	for (++argv; *argv; argv++) {
3289e3700dfSgww 		if ((ae = get_arg_ent(*argv)) == NULL) {
3297c478bd9Sstevel@tonic-gate 			exit_usage(1);
3307c478bd9Sstevel@tonic-gate 		}
3317c478bd9Sstevel@tonic-gate 
3327c478bd9Sstevel@tonic-gate 		switch (ae->auditconfig_cmd) {
3337c478bd9Sstevel@tonic-gate 
3347c478bd9Sstevel@tonic-gate 		case AC_ARG_AUDIT:
3357c478bd9Sstevel@tonic-gate 			++argv;
3367c478bd9Sstevel@tonic-gate 			if (!*argv)
3377c478bd9Sstevel@tonic-gate 				exit_usage(1);
3387c478bd9Sstevel@tonic-gate 			if (strisnum(*argv)) {
3397c478bd9Sstevel@tonic-gate 				chk_event_num(AC_USER_EVENT,
3408523fda3SJan Friedel 				    (au_event_t)atol(*argv));
3419e3700dfSgww 			} else {
3427c478bd9Sstevel@tonic-gate 				chk_event_str(AC_USER_EVENT, *argv);
3439e3700dfSgww 			}
3447c478bd9Sstevel@tonic-gate 			++argv;
3457c478bd9Sstevel@tonic-gate 			if (!*argv)
3467c478bd9Sstevel@tonic-gate 				exit_usage(1);
3477c478bd9Sstevel@tonic-gate 			chk_sorf(*argv);
3487c478bd9Sstevel@tonic-gate 			++argv;
3497c478bd9Sstevel@tonic-gate 			if (!*argv)
3507c478bd9Sstevel@tonic-gate 				exit_usage(1);
3517c478bd9Sstevel@tonic-gate 			chk_retval(*argv);
3527c478bd9Sstevel@tonic-gate 			++argv;
3537c478bd9Sstevel@tonic-gate 			if (!*argv)
3547c478bd9Sstevel@tonic-gate 				exit_usage(1);
3557c478bd9Sstevel@tonic-gate 			break;
3567c478bd9Sstevel@tonic-gate 
3577c478bd9Sstevel@tonic-gate 		case AC_ARG_CHKCONF:
3587c478bd9Sstevel@tonic-gate 		case AC_ARG_CONF:
3597c478bd9Sstevel@tonic-gate 		case AC_ARG_ACONF:
3607c478bd9Sstevel@tonic-gate 		case AC_ARG_CHKACONF:
3617c478bd9Sstevel@tonic-gate 		case AC_ARG_GETASID:
3627c478bd9Sstevel@tonic-gate 		case AC_ARG_GETAUID:
3637c478bd9Sstevel@tonic-gate 		case AC_ARG_GETAUDIT:
3647c478bd9Sstevel@tonic-gate 		case AC_ARG_GETKAUDIT:
3657c478bd9Sstevel@tonic-gate 			break;
3667c478bd9Sstevel@tonic-gate 
3677c478bd9Sstevel@tonic-gate 		case AC_ARG_GETCLASS:
3687c478bd9Sstevel@tonic-gate 		case AC_ARG_GETESTATE:
3697c478bd9Sstevel@tonic-gate 			++argv;
3707c478bd9Sstevel@tonic-gate 			if (!*argv)
3717c478bd9Sstevel@tonic-gate 				exit_usage(1);
3729e3700dfSgww 			if (strisnum(*argv)) {
3737c478bd9Sstevel@tonic-gate 				chk_event_num(AC_KERN_EVENT,
3749e3700dfSgww 				    (au_event_t)atol(*argv));
3759e3700dfSgww 			} else {
3767c478bd9Sstevel@tonic-gate 				chk_event_str(AC_KERN_EVENT, *argv);
3779e3700dfSgww 			}
3787c478bd9Sstevel@tonic-gate 			break;
3797c478bd9Sstevel@tonic-gate 
3807c478bd9Sstevel@tonic-gate 		case AC_ARG_GETCAR:
3817c478bd9Sstevel@tonic-gate 		case AC_ARG_GETCOND:
3827c478bd9Sstevel@tonic-gate 		case AC_ARG_GETCWD:
383f8994074SJan Friedel 		case AC_ARG_GETFLAGS:
3847c478bd9Sstevel@tonic-gate 		case AC_ARG_GETKMASK:
385f8994074SJan Friedel 		case AC_ARG_GETNAFLAGS:
386f8994074SJan Friedel 			break;
387f8994074SJan Friedel 
388f8994074SJan Friedel 		case AC_ARG_GETPLUGIN:
389f8994074SJan Friedel 			if (*++argv == NULL) {
390f8994074SJan Friedel 				--argv;
391f8994074SJan Friedel 				break;
392f8994074SJan Friedel 			}
393f8994074SJan Friedel 			if (get_arg_ent(*argv) != NULL) {
394f8994074SJan Friedel 				--argv;
395f8994074SJan Friedel 			} else {
396f8994074SJan Friedel 				chk_arg_len(*argv, PLUGIN_MAXBUF);
397f8994074SJan Friedel 				chk_known_plugin(*argv);
398f8994074SJan Friedel 			}
399f8994074SJan Friedel 			break;
400f8994074SJan Friedel 
4017c478bd9Sstevel@tonic-gate 		case AC_ARG_GETPOLICY:
4027c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQBUFSZ:
4037c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQCTRL:
4047c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQDELAY:
4057c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQHIWATER:
4067c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQLOWATER:
4077c478bd9Sstevel@tonic-gate 		case AC_ARG_GETSTAT:
4087c478bd9Sstevel@tonic-gate 		case AC_ARG_GETTERMID:
4097c478bd9Sstevel@tonic-gate 		case AC_ARG_LSEVENT:
4107c478bd9Sstevel@tonic-gate 		case AC_ARG_LSPOLICY:
4117c478bd9Sstevel@tonic-gate 			break;
4127c478bd9Sstevel@tonic-gate 
4137c478bd9Sstevel@tonic-gate 		case AC_ARG_SETASID:
4147c478bd9Sstevel@tonic-gate 		case AC_ARG_SETAUID:
4157c478bd9Sstevel@tonic-gate 		case AC_ARG_SETAUDIT:
4167c478bd9Sstevel@tonic-gate 			++argv;
4177c478bd9Sstevel@tonic-gate 			if (!*argv)
4187c478bd9Sstevel@tonic-gate 				exit_usage(1);
4197c478bd9Sstevel@tonic-gate 
4207c478bd9Sstevel@tonic-gate 			while (*argv)
4217c478bd9Sstevel@tonic-gate 				++argv;
4227c478bd9Sstevel@tonic-gate 			--argv;
4237c478bd9Sstevel@tonic-gate 
4247c478bd9Sstevel@tonic-gate 			break;
4257c478bd9Sstevel@tonic-gate 
4267c478bd9Sstevel@tonic-gate 		case AC_ARG_SETKAUDIT:
4277c478bd9Sstevel@tonic-gate 			++argv;
4287c478bd9Sstevel@tonic-gate 			if (!*argv)
4297c478bd9Sstevel@tonic-gate 				exit_usage(1);
4307c478bd9Sstevel@tonic-gate 			if (str2type (*argv, &type))
4317c478bd9Sstevel@tonic-gate 				exit_error(gettext(
4328523fda3SJan Friedel 				    "Invalid IP address type specified."));
4337c478bd9Sstevel@tonic-gate 			++argv;
4347c478bd9Sstevel@tonic-gate 			if (!*argv)
4357c478bd9Sstevel@tonic-gate 				exit_usage(1);
4367c478bd9Sstevel@tonic-gate 
4377c478bd9Sstevel@tonic-gate 			if (str2ipaddr(*argv, addr, type))
4388523fda3SJan Friedel 				exit_error(
4398523fda3SJan Friedel 				    gettext("Invalid IP address specified."));
4407c478bd9Sstevel@tonic-gate 			break;
4417c478bd9Sstevel@tonic-gate 
4427c478bd9Sstevel@tonic-gate 		case AC_ARG_SETCLASS:
4437c478bd9Sstevel@tonic-gate 			++argv;
4447c478bd9Sstevel@tonic-gate 			if (!*argv)
4457c478bd9Sstevel@tonic-gate 				exit_usage(1);
4467c478bd9Sstevel@tonic-gate 			if (strisnum(*argv))
4477c478bd9Sstevel@tonic-gate 				chk_event_num(AC_KERN_EVENT,
4488523fda3SJan Friedel 				    (au_event_t)atol(*argv));
4497c478bd9Sstevel@tonic-gate 			else
4507c478bd9Sstevel@tonic-gate 				chk_event_str(AC_KERN_EVENT, *argv);
4517c478bd9Sstevel@tonic-gate 			++argv;
4527c478bd9Sstevel@tonic-gate 			if (!*argv)
4537c478bd9Sstevel@tonic-gate 				exit_usage(1);
454f8994074SJan Friedel 			echkflags(*argv, mask);
455f8994074SJan Friedel 			break;
456f8994074SJan Friedel 
457f8994074SJan Friedel 		case AC_ARG_SETFLAGS:
458f8994074SJan Friedel 			++argv;
459f8994074SJan Friedel 			if (!*argv)
460f8994074SJan Friedel 				exit_usage(1);
461f8994074SJan Friedel 			chk_arg_len(*argv, PRESELECTION_MAXBUF);
462f8994074SJan Friedel 			echkflags(*argv, mask);
4637c478bd9Sstevel@tonic-gate 			break;
4647c478bd9Sstevel@tonic-gate 
4657c478bd9Sstevel@tonic-gate 		case AC_ARG_SETKMASK:
4667c478bd9Sstevel@tonic-gate 			++argv;
4677c478bd9Sstevel@tonic-gate 			if (!*argv)
4687c478bd9Sstevel@tonic-gate 				exit_usage(1);
469f8994074SJan Friedel 			echkflags(*argv, mask);
470f8994074SJan Friedel 			break;
471f8994074SJan Friedel 
472f8994074SJan Friedel 		case AC_ARG_SETNAFLAGS:
473f8994074SJan Friedel 			++argv;
474f8994074SJan Friedel 			if (!*argv)
475f8994074SJan Friedel 				exit_usage(1);
476f8994074SJan Friedel 			chk_arg_len(*argv, PRESELECTION_MAXBUF);
477f8994074SJan Friedel 			echkflags(*argv, mask);
478f8994074SJan Friedel 			break;
479f8994074SJan Friedel 
480f8994074SJan Friedel 		case AC_ARG_SETPLUGIN:
481f8994074SJan Friedel 			if (*++argv == NULL || get_arg_ent(*argv) != NULL) {
482f8994074SJan Friedel 				exit_usage(1);
483f8994074SJan Friedel 			}
484f8994074SJan Friedel 			chk_known_plugin(*argv);
485f8994074SJan Friedel 			chk_arg_len(*argv, PLUGIN_MAXBUF);
486f8994074SJan Friedel 			if (*++argv == NULL || strcmp(*argv, "active") != 0 &&
487f8994074SJan Friedel 			    strcmp(*argv, "inactive") != 0) {
488f8994074SJan Friedel 				exit_usage(1);
489f8994074SJan Friedel 			}
490f8994074SJan Friedel 			if (*++argv == NULL || get_arg_ent(*argv) != NULL) {
491f8994074SJan Friedel 				--argv;
492f8994074SJan Friedel 				break;
493f8994074SJan Friedel 			}
494f8994074SJan Friedel 			chk_arg_len(*argv, PLUGIN_MAXATT);
495f8994074SJan Friedel 			if (*++argv == NULL || get_arg_ent(*argv) != NULL) {
496f8994074SJan Friedel 				--argv;
497f8994074SJan Friedel 				break;
498f8994074SJan Friedel 			}
499f8994074SJan Friedel 			if (atoi(*argv) < 0) {
500f8994074SJan Friedel 				exit_error(gettext("Incorrect qsize specified "
501f8994074SJan Friedel 				    "(%s)."), *argv);
502f8994074SJan Friedel 			}
5037c478bd9Sstevel@tonic-gate 			break;
5047c478bd9Sstevel@tonic-gate 
5057c478bd9Sstevel@tonic-gate 		case AC_ARG_SETPOLICY:
5067c478bd9Sstevel@tonic-gate 			++argv;
5077c478bd9Sstevel@tonic-gate 			if (!*argv)
5087c478bd9Sstevel@tonic-gate 				exit_usage(1);
5097c478bd9Sstevel@tonic-gate 			break;
5107c478bd9Sstevel@tonic-gate 
5117c478bd9Sstevel@tonic-gate 		case AC_ARG_SETSTAT:
5127c478bd9Sstevel@tonic-gate 			break;
5137c478bd9Sstevel@tonic-gate 
5147c478bd9Sstevel@tonic-gate 		case AC_ARG_GETPINFO:
5157c478bd9Sstevel@tonic-gate 			++argv;
5167c478bd9Sstevel@tonic-gate 			if (!*argv)
5177c478bd9Sstevel@tonic-gate 				exit_usage(1);
5187c478bd9Sstevel@tonic-gate 			break;
5197c478bd9Sstevel@tonic-gate 
5207c478bd9Sstevel@tonic-gate 		case AC_ARG_SETPMASK:
5217c478bd9Sstevel@tonic-gate 			++argv;
5227c478bd9Sstevel@tonic-gate 			if (!*argv)
5237c478bd9Sstevel@tonic-gate 				exit_usage(1);
5247c478bd9Sstevel@tonic-gate 			++argv;
5257c478bd9Sstevel@tonic-gate 			if (!*argv)
5267c478bd9Sstevel@tonic-gate 				exit_usage(1);
527f8994074SJan Friedel 			echkflags(*argv, mask);
5287c478bd9Sstevel@tonic-gate 			break;
5297c478bd9Sstevel@tonic-gate 
5307c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQBUFSZ:
5317c478bd9Sstevel@tonic-gate 			++argv;
5327c478bd9Sstevel@tonic-gate 			if (!*argv)
5337c478bd9Sstevel@tonic-gate 				exit_usage(1);
5347c478bd9Sstevel@tonic-gate 			if (!strisnum(*argv))
5357c478bd9Sstevel@tonic-gate 				exit_error(gettext("Invalid bufsz specified."));
5367c478bd9Sstevel@tonic-gate 			break;
5377c478bd9Sstevel@tonic-gate 
5387c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQCTRL:
5397c478bd9Sstevel@tonic-gate 			++argv;
5407c478bd9Sstevel@tonic-gate 			if (!*argv)
5417c478bd9Sstevel@tonic-gate 				exit_usage(1);
5427c478bd9Sstevel@tonic-gate 			if (!strisnum(*argv))
5438523fda3SJan Friedel 				exit_error(
5448523fda3SJan Friedel 				    gettext("Invalid hiwater specified."));
5457c478bd9Sstevel@tonic-gate 			++argv;
5467c478bd9Sstevel@tonic-gate 			if (!*argv)
5477c478bd9Sstevel@tonic-gate 				exit_usage(1);
5487c478bd9Sstevel@tonic-gate 			if (!strisnum(*argv))
5498523fda3SJan Friedel 				exit_error(
5508523fda3SJan Friedel 				    gettext("Invalid lowater specified."));
5517c478bd9Sstevel@tonic-gate 			++argv;
5527c478bd9Sstevel@tonic-gate 			if (!*argv)
5537c478bd9Sstevel@tonic-gate 				exit_usage(1);
5547c478bd9Sstevel@tonic-gate 			if (!strisnum(*argv))
5557c478bd9Sstevel@tonic-gate 				exit_error(gettext("Invalid bufsz specified."));
5567c478bd9Sstevel@tonic-gate 			++argv;
5577c478bd9Sstevel@tonic-gate 			if (!*argv)
5587c478bd9Sstevel@tonic-gate 				exit_usage(1);
5597c478bd9Sstevel@tonic-gate 			if (!strisnum(*argv))
5607c478bd9Sstevel@tonic-gate 				exit_error(gettext("Invalid delay specified."));
5617c478bd9Sstevel@tonic-gate 			break;
5627c478bd9Sstevel@tonic-gate 
5637c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQDELAY:
5647c478bd9Sstevel@tonic-gate 			++argv;
5657c478bd9Sstevel@tonic-gate 			if (!*argv)
5667c478bd9Sstevel@tonic-gate 				exit_usage(1);
5677c478bd9Sstevel@tonic-gate 			if (!strisnum(*argv))
5687c478bd9Sstevel@tonic-gate 				exit_error(gettext("Invalid delay specified."));
5697c478bd9Sstevel@tonic-gate 			break;
5707c478bd9Sstevel@tonic-gate 
5717c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQHIWATER:
5727c478bd9Sstevel@tonic-gate 			++argv;
5737c478bd9Sstevel@tonic-gate 			if (!*argv)
5747c478bd9Sstevel@tonic-gate 				exit_usage(1);
5759e3700dfSgww 			if (!strisnum(*argv)) {
5768523fda3SJan Friedel 				exit_error(
5778523fda3SJan Friedel 				    gettext("Invalid hiwater specified."));
5789e3700dfSgww 			}
5797c478bd9Sstevel@tonic-gate 			break;
5807c478bd9Sstevel@tonic-gate 
5817c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQLOWATER:
5827c478bd9Sstevel@tonic-gate 			++argv;
5837c478bd9Sstevel@tonic-gate 			if (!*argv)
5847c478bd9Sstevel@tonic-gate 				exit_usage(1);
5859e3700dfSgww 			if (!strisnum(*argv)) {
5868523fda3SJan Friedel 				exit_error(
5878523fda3SJan Friedel 				    gettext("Invalid lowater specified."));
5889e3700dfSgww 			}
5897c478bd9Sstevel@tonic-gate 			break;
5907c478bd9Sstevel@tonic-gate 
5917c478bd9Sstevel@tonic-gate 		case AC_ARG_SETSMASK:
5927c478bd9Sstevel@tonic-gate 		case AC_ARG_SETUMASK:
5937c478bd9Sstevel@tonic-gate 			++argv;
5947c478bd9Sstevel@tonic-gate 			if (!*argv)
5957c478bd9Sstevel@tonic-gate 				exit_usage(1);
5967c478bd9Sstevel@tonic-gate 			++argv;
5977c478bd9Sstevel@tonic-gate 			if (!*argv)
5987c478bd9Sstevel@tonic-gate 				exit_usage(1);
599f8994074SJan Friedel 			echkflags(*argv, mask);
6007c478bd9Sstevel@tonic-gate 			break;
6017c478bd9Sstevel@tonic-gate 
6028523fda3SJan Friedel 		case AC_ARG_SET_TEMPORARY:
6038523fda3SJan Friedel 			/* Do not accept single -t option. */
6048523fda3SJan Friedel 			if (argc == 2) {
6058523fda3SJan Friedel 				exit_error(
6068523fda3SJan Friedel 				    gettext("Only the -t option specified "
6078523fda3SJan Friedel 				    "(it is not a standalone option)."));
6088523fda3SJan Friedel 			}
6098523fda3SJan Friedel 			temporary_set = B_TRUE;
6108523fda3SJan Friedel 			break;
6118523fda3SJan Friedel 
6127c478bd9Sstevel@tonic-gate 		default:
6137c478bd9Sstevel@tonic-gate 			exit_error(gettext("Internal error #1."));
6147c478bd9Sstevel@tonic-gate 			break;
6157c478bd9Sstevel@tonic-gate 		}
6167c478bd9Sstevel@tonic-gate 	}
6177c478bd9Sstevel@tonic-gate }
6187c478bd9Sstevel@tonic-gate 
6197c478bd9Sstevel@tonic-gate 
6207c478bd9Sstevel@tonic-gate /*
6218523fda3SJan Friedel  * do_args() - do command line arguments in the order in which they appear.
6228523fda3SJan Friedel  * Function return values returned by the underlying functions; the semantics
6238523fda3SJan Friedel  * they should follow is to return B_TRUE on successful execution, B_FALSE
6248523fda3SJan Friedel  * otherwise.
6257c478bd9Sstevel@tonic-gate  */
6267c478bd9Sstevel@tonic-gate static void
627f8994074SJan Friedel do_args(char **argv, au_mask_t *mask)
6287c478bd9Sstevel@tonic-gate {
6298523fda3SJan Friedel 	arg_entry_t	*ae;
6307c478bd9Sstevel@tonic-gate 
6317c478bd9Sstevel@tonic-gate 	for (++argv; *argv; argv++) {
6327c478bd9Sstevel@tonic-gate 		ae = get_arg_ent(*argv);
6337c478bd9Sstevel@tonic-gate 
6347c478bd9Sstevel@tonic-gate 		switch (ae->auditconfig_cmd) {
6357c478bd9Sstevel@tonic-gate 
6367c478bd9Sstevel@tonic-gate 		case AC_ARG_AUDIT:
6377c478bd9Sstevel@tonic-gate 			{
6387c478bd9Sstevel@tonic-gate 				char sorf;
6397c478bd9Sstevel@tonic-gate 				int  retval;
6407c478bd9Sstevel@tonic-gate 				char *event_name;
6417c478bd9Sstevel@tonic-gate 				char *audit_str;
6427c478bd9Sstevel@tonic-gate 
6437c478bd9Sstevel@tonic-gate 				++argv;
6447c478bd9Sstevel@tonic-gate 				event_name = *argv;
6457c478bd9Sstevel@tonic-gate 				++argv;
6467c478bd9Sstevel@tonic-gate 				sorf = (char)atoi(*argv);
6477c478bd9Sstevel@tonic-gate 				++argv;
6487c478bd9Sstevel@tonic-gate 				retval = atoi(*argv);
6497c478bd9Sstevel@tonic-gate 				++argv;
6507c478bd9Sstevel@tonic-gate 				audit_str = *argv;
6517c478bd9Sstevel@tonic-gate 				do_audit(event_name, sorf, retval, audit_str);
6527c478bd9Sstevel@tonic-gate 			}
6537c478bd9Sstevel@tonic-gate 			break;
6547c478bd9Sstevel@tonic-gate 
6557c478bd9Sstevel@tonic-gate 		case AC_ARG_CHKCONF:
6567c478bd9Sstevel@tonic-gate 			do_chkconf();
6577c478bd9Sstevel@tonic-gate 			break;
6587c478bd9Sstevel@tonic-gate 
6597c478bd9Sstevel@tonic-gate 		case AC_ARG_CONF:
6607c478bd9Sstevel@tonic-gate 			do_conf();
6617c478bd9Sstevel@tonic-gate 			break;
6627c478bd9Sstevel@tonic-gate 
6637c478bd9Sstevel@tonic-gate 		case AC_ARG_CHKACONF:
6647c478bd9Sstevel@tonic-gate 			do_chkaconf();
6657c478bd9Sstevel@tonic-gate 			break;
6667c478bd9Sstevel@tonic-gate 
6677c478bd9Sstevel@tonic-gate 		case AC_ARG_ACONF:
6687c478bd9Sstevel@tonic-gate 			do_aconf();
6697c478bd9Sstevel@tonic-gate 			break;
6707c478bd9Sstevel@tonic-gate 
6717c478bd9Sstevel@tonic-gate 		case AC_ARG_GETASID:
6727c478bd9Sstevel@tonic-gate 			do_getasid();
6737c478bd9Sstevel@tonic-gate 			break;
6747c478bd9Sstevel@tonic-gate 
6757c478bd9Sstevel@tonic-gate 		case AC_ARG_GETAUID:
6767c478bd9Sstevel@tonic-gate 			do_getauid();
6777c478bd9Sstevel@tonic-gate 			break;
6787c478bd9Sstevel@tonic-gate 
6797c478bd9Sstevel@tonic-gate 		case AC_ARG_GETAUDIT:
6807c478bd9Sstevel@tonic-gate 			do_getaudit();
6817c478bd9Sstevel@tonic-gate 			break;
6827c478bd9Sstevel@tonic-gate 
6837c478bd9Sstevel@tonic-gate 		case AC_ARG_GETKAUDIT:
6847c478bd9Sstevel@tonic-gate 			do_getkaudit();
6857c478bd9Sstevel@tonic-gate 			break;
6867c478bd9Sstevel@tonic-gate 
6877c478bd9Sstevel@tonic-gate 		case AC_ARG_GETCLASS:
6887c478bd9Sstevel@tonic-gate 		case AC_ARG_GETESTATE:
6897c478bd9Sstevel@tonic-gate 			++argv;
6907c478bd9Sstevel@tonic-gate 			do_getclass(*argv);
6917c478bd9Sstevel@tonic-gate 			break;
6927c478bd9Sstevel@tonic-gate 
6937c478bd9Sstevel@tonic-gate 		case AC_ARG_GETCAR:
6947c478bd9Sstevel@tonic-gate 			do_getcar();
6957c478bd9Sstevel@tonic-gate 			break;
6967c478bd9Sstevel@tonic-gate 
6977c478bd9Sstevel@tonic-gate 		case AC_ARG_GETCOND:
6987c478bd9Sstevel@tonic-gate 			do_getcond();
6997c478bd9Sstevel@tonic-gate 			break;
7007c478bd9Sstevel@tonic-gate 
7017c478bd9Sstevel@tonic-gate 		case AC_ARG_GETCWD:
7027c478bd9Sstevel@tonic-gate 			do_getcwd();
7037c478bd9Sstevel@tonic-gate 			break;
7047c478bd9Sstevel@tonic-gate 
705f8994074SJan Friedel 		case AC_ARG_GETFLAGS:
706f8994074SJan Friedel 			do_getflags();
707f8994074SJan Friedel 			break;
708f8994074SJan Friedel 
7097c478bd9Sstevel@tonic-gate 		case AC_ARG_GETKMASK:
7107c478bd9Sstevel@tonic-gate 			do_getkmask();
7117c478bd9Sstevel@tonic-gate 			break;
7127c478bd9Sstevel@tonic-gate 
713f8994074SJan Friedel 		case AC_ARG_GETNAFLAGS:
714f8994074SJan Friedel 			do_getnaflags();
715f8994074SJan Friedel 			break;
716f8994074SJan Friedel 
717f8994074SJan Friedel 		case AC_ARG_GETPLUGIN:
718f8994074SJan Friedel 			{
719f8994074SJan Friedel 				char	*plugin_str = NULL;
720f8994074SJan Friedel 
721f8994074SJan Friedel 				++argv;
722f8994074SJan Friedel 				if (*argv != NULL) {
723f8994074SJan Friedel 					if (get_arg_ent(*argv) != NULL) {
724f8994074SJan Friedel 						--argv;
725f8994074SJan Friedel 					} else {
726f8994074SJan Friedel 						plugin_str = *argv;
727f8994074SJan Friedel 					}
728f8994074SJan Friedel 				} else {
729f8994074SJan Friedel 					--argv;
730f8994074SJan Friedel 				}
731f8994074SJan Friedel 
732f8994074SJan Friedel 				do_getplugin(plugin_str);
733f8994074SJan Friedel 			}
734f8994074SJan Friedel 			break;
735f8994074SJan Friedel 
7367c478bd9Sstevel@tonic-gate 		case AC_ARG_GETPOLICY:
7377c478bd9Sstevel@tonic-gate 			do_getpolicy();
7387c478bd9Sstevel@tonic-gate 			break;
7397c478bd9Sstevel@tonic-gate 
7407c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQBUFSZ:
7417c478bd9Sstevel@tonic-gate 			do_getqbufsz();
7427c478bd9Sstevel@tonic-gate 			break;
7437c478bd9Sstevel@tonic-gate 
7447c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQCTRL:
7457c478bd9Sstevel@tonic-gate 			do_getqctrl();
7467c478bd9Sstevel@tonic-gate 			break;
7477c478bd9Sstevel@tonic-gate 
7487c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQDELAY:
7497c478bd9Sstevel@tonic-gate 			do_getqdelay();
7507c478bd9Sstevel@tonic-gate 			break;
7517c478bd9Sstevel@tonic-gate 
7527c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQHIWATER:
7537c478bd9Sstevel@tonic-gate 			do_getqhiwater();
7547c478bd9Sstevel@tonic-gate 			break;
7557c478bd9Sstevel@tonic-gate 
7567c478bd9Sstevel@tonic-gate 		case AC_ARG_GETQLOWATER:
7577c478bd9Sstevel@tonic-gate 			do_getqlowater();
7587c478bd9Sstevel@tonic-gate 			break;
7597c478bd9Sstevel@tonic-gate 
7607c478bd9Sstevel@tonic-gate 		case AC_ARG_GETSTAT:
7617c478bd9Sstevel@tonic-gate 			do_getstat();
7627c478bd9Sstevel@tonic-gate 			break;
7637c478bd9Sstevel@tonic-gate 
7647c478bd9Sstevel@tonic-gate 		case AC_ARG_GETTERMID:
7657c478bd9Sstevel@tonic-gate 			do_gettermid();
7667c478bd9Sstevel@tonic-gate 			break;
7677c478bd9Sstevel@tonic-gate 
7687c478bd9Sstevel@tonic-gate 		case AC_ARG_LSEVENT:
7697c478bd9Sstevel@tonic-gate 			do_lsevent();
7707c478bd9Sstevel@tonic-gate 			break;
7717c478bd9Sstevel@tonic-gate 
7727c478bd9Sstevel@tonic-gate 		case AC_ARG_LSPOLICY:
7737c478bd9Sstevel@tonic-gate 			do_lspolicy();
7747c478bd9Sstevel@tonic-gate 			break;
7757c478bd9Sstevel@tonic-gate 
7767c478bd9Sstevel@tonic-gate 		case AC_ARG_SETASID:
7777c478bd9Sstevel@tonic-gate 			{
7787c478bd9Sstevel@tonic-gate 				char *sid_str;
7797c478bd9Sstevel@tonic-gate 
7807c478bd9Sstevel@tonic-gate 				++argv;
7817c478bd9Sstevel@tonic-gate 				sid_str = *argv;
7827c478bd9Sstevel@tonic-gate 				++argv;
7837c478bd9Sstevel@tonic-gate 				do_setasid(sid_str, argv);
7847c478bd9Sstevel@tonic-gate 			}
7857c478bd9Sstevel@tonic-gate 			break;
7867c478bd9Sstevel@tonic-gate 
7877c478bd9Sstevel@tonic-gate 		case AC_ARG_SETAUID:
7887c478bd9Sstevel@tonic-gate 			{
7897c478bd9Sstevel@tonic-gate 				char *user;
7907c478bd9Sstevel@tonic-gate 
7917c478bd9Sstevel@tonic-gate 				++argv;
7927c478bd9Sstevel@tonic-gate 				user = *argv;
7937c478bd9Sstevel@tonic-gate 				++argv;
7947c478bd9Sstevel@tonic-gate 				do_setauid(user, argv);
7957c478bd9Sstevel@tonic-gate 			}
7967c478bd9Sstevel@tonic-gate 			break;
7977c478bd9Sstevel@tonic-gate 
7987c478bd9Sstevel@tonic-gate 		case AC_ARG_SETAUDIT:
7997c478bd9Sstevel@tonic-gate 			{
8007c478bd9Sstevel@tonic-gate 				char *user_str;
8017c478bd9Sstevel@tonic-gate 				char *mask_str;
8027c478bd9Sstevel@tonic-gate 				char *tid_str;
8037c478bd9Sstevel@tonic-gate 				char *sid_str;
8047c478bd9Sstevel@tonic-gate 
8057c478bd9Sstevel@tonic-gate 				++argv;
8067c478bd9Sstevel@tonic-gate 				user_str = *argv;
8077c478bd9Sstevel@tonic-gate 				++argv;
8087c478bd9Sstevel@tonic-gate 				mask_str = *argv;
8097c478bd9Sstevel@tonic-gate 				++argv;
8107c478bd9Sstevel@tonic-gate 				tid_str = *argv;
8117c478bd9Sstevel@tonic-gate 				++argv;
8127c478bd9Sstevel@tonic-gate 				sid_str = *argv;
8137c478bd9Sstevel@tonic-gate 				++argv;
8148523fda3SJan Friedel 				do_setaudit(user_str, mask_str, tid_str,
8158523fda3SJan Friedel 				    sid_str, argv);
8167c478bd9Sstevel@tonic-gate 			}
8177c478bd9Sstevel@tonic-gate 			break;
8187c478bd9Sstevel@tonic-gate 
8197c478bd9Sstevel@tonic-gate 		case AC_ARG_SETKAUDIT:
8207c478bd9Sstevel@tonic-gate 			{
8217c478bd9Sstevel@tonic-gate 				char *address_type, *address;
8227c478bd9Sstevel@tonic-gate 
8237c478bd9Sstevel@tonic-gate 				++argv; address_type = *argv;
8247c478bd9Sstevel@tonic-gate 				++argv; address = *argv;
8257c478bd9Sstevel@tonic-gate 				do_setkaudit(address_type, address);
8267c478bd9Sstevel@tonic-gate 			}
8277c478bd9Sstevel@tonic-gate 			break;
8287c478bd9Sstevel@tonic-gate 
8297c478bd9Sstevel@tonic-gate 		case AC_ARG_SETCLASS:
8307c478bd9Sstevel@tonic-gate 			{
831f8994074SJan Friedel 				char *event_str;
8327c478bd9Sstevel@tonic-gate 
833f8994074SJan Friedel 				++argv;
834f8994074SJan Friedel 				event_str = *argv;
835f8994074SJan Friedel 				do_setclass(event_str, mask);
836f8994074SJan Friedel 
837f8994074SJan Friedel 				++argv;
8387c478bd9Sstevel@tonic-gate 			}
8397c478bd9Sstevel@tonic-gate 			break;
8407c478bd9Sstevel@tonic-gate 
841f8994074SJan Friedel 		case AC_ARG_SETFLAGS:
842f8994074SJan Friedel 			++argv;
843f8994074SJan Friedel 			do_setflags(*argv, mask);
844f8994074SJan Friedel 			break;
845f8994074SJan Friedel 
8467c478bd9Sstevel@tonic-gate 		case AC_ARG_SETKMASK:
8477c478bd9Sstevel@tonic-gate 			++argv;
848f8994074SJan Friedel 			do_setkmask(mask);
849f8994074SJan Friedel 			break;
850f8994074SJan Friedel 
851f8994074SJan Friedel 		case AC_ARG_SETNAFLAGS:
852f8994074SJan Friedel 			++argv;
853f8994074SJan Friedel 			do_setnaflags(*argv, mask);
854f8994074SJan Friedel 			break;
855f8994074SJan Friedel 
856f8994074SJan Friedel 		case AC_ARG_SETPLUGIN:
857f8994074SJan Friedel 			{
858f8994074SJan Friedel 				char		*plugin_str = NULL;
859f8994074SJan Friedel 				boolean_t	plugin_state = B_FALSE;
860*de4cec48SToomas Soome 				char		*plugin_att = NULL;
861*de4cec48SToomas Soome 				int		plugin_qsize = -1;
862f8994074SJan Friedel 
863f8994074SJan Friedel 				plugin_str = *++argv;
864f8994074SJan Friedel 				if (strcmp(*++argv, "active") == 0) {
865f8994074SJan Friedel 					plugin_state = B_TRUE;
866f8994074SJan Friedel 				}
867f8994074SJan Friedel 				if (*++argv != NULL &&
868f8994074SJan Friedel 				    get_arg_ent(*argv) == NULL) {
869f8994074SJan Friedel 					plugin_att = *argv;
870f8994074SJan Friedel 					if (*++argv != NULL &&
871f8994074SJan Friedel 					    get_arg_ent(*argv) == NULL) {
872f8994074SJan Friedel 						plugin_qsize = atoi(*argv);
873f8994074SJan Friedel 					} else {
874f8994074SJan Friedel 						--argv;
875f8994074SJan Friedel 					}
876f8994074SJan Friedel 				} else {
877f8994074SJan Friedel 					--argv;
878f8994074SJan Friedel 				}
879f8994074SJan Friedel 
880f8994074SJan Friedel 				do_setplugin(plugin_str, plugin_state,
881f8994074SJan Friedel 				    plugin_att, plugin_qsize);
882f8994074SJan Friedel 			}
8837c478bd9Sstevel@tonic-gate 			break;
8847c478bd9Sstevel@tonic-gate 
8857c478bd9Sstevel@tonic-gate 		case AC_ARG_SETPOLICY:
8867c478bd9Sstevel@tonic-gate 			++argv;
8877c478bd9Sstevel@tonic-gate 			do_setpolicy(*argv);
8887c478bd9Sstevel@tonic-gate 			break;
8897c478bd9Sstevel@tonic-gate 
8907c478bd9Sstevel@tonic-gate 		case AC_ARG_GETPINFO:
8917c478bd9Sstevel@tonic-gate 			{
8927c478bd9Sstevel@tonic-gate 				char *pid_str;
8937c478bd9Sstevel@tonic-gate 
8947c478bd9Sstevel@tonic-gate 				++argv;
8957c478bd9Sstevel@tonic-gate 				pid_str = *argv;
8967c478bd9Sstevel@tonic-gate 				do_getpinfo(pid_str);
8977c478bd9Sstevel@tonic-gate 			}
8987c478bd9Sstevel@tonic-gate 			break;
8997c478bd9Sstevel@tonic-gate 
9007c478bd9Sstevel@tonic-gate 		case AC_ARG_SETPMASK:
9017c478bd9Sstevel@tonic-gate 			{
9027c478bd9Sstevel@tonic-gate 				char *pid_str;
9037c478bd9Sstevel@tonic-gate 
9047c478bd9Sstevel@tonic-gate 				++argv;
9057c478bd9Sstevel@tonic-gate 				pid_str = *argv;
906f8994074SJan Friedel 				do_setpmask(pid_str, mask);
907f8994074SJan Friedel 
9087c478bd9Sstevel@tonic-gate 				++argv;
9097c478bd9Sstevel@tonic-gate 			}
9107c478bd9Sstevel@tonic-gate 			break;
9117c478bd9Sstevel@tonic-gate 
9127c478bd9Sstevel@tonic-gate 		case AC_ARG_SETSTAT:
9137c478bd9Sstevel@tonic-gate 			do_setstat();
9147c478bd9Sstevel@tonic-gate 			break;
9157c478bd9Sstevel@tonic-gate 
9167c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQBUFSZ:
9177c478bd9Sstevel@tonic-gate 			++argv;
9187c478bd9Sstevel@tonic-gate 			do_setqbufsz(*argv);
9197c478bd9Sstevel@tonic-gate 			break;
9207c478bd9Sstevel@tonic-gate 
9217c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQCTRL:
9227c478bd9Sstevel@tonic-gate 			{
9237c478bd9Sstevel@tonic-gate 				char *hiwater, *lowater, *bufsz, *delay;
9247c478bd9Sstevel@tonic-gate 
9257c478bd9Sstevel@tonic-gate 				++argv; hiwater = *argv;
9267c478bd9Sstevel@tonic-gate 				++argv; lowater = *argv;
9277c478bd9Sstevel@tonic-gate 				++argv; bufsz = *argv;
9287c478bd9Sstevel@tonic-gate 				++argv; delay = *argv;
9297c478bd9Sstevel@tonic-gate 				do_setqctrl(hiwater, lowater, bufsz, delay);
9307c478bd9Sstevel@tonic-gate 			}
9317c478bd9Sstevel@tonic-gate 			break;
9327c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQDELAY:
9337c478bd9Sstevel@tonic-gate 			++argv;
9347c478bd9Sstevel@tonic-gate 			do_setqdelay(*argv);
9357c478bd9Sstevel@tonic-gate 			break;
9367c478bd9Sstevel@tonic-gate 
9377c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQHIWATER:
9387c478bd9Sstevel@tonic-gate 			++argv;
9397c478bd9Sstevel@tonic-gate 			do_setqhiwater(*argv);
9407c478bd9Sstevel@tonic-gate 			break;
9417c478bd9Sstevel@tonic-gate 
9427c478bd9Sstevel@tonic-gate 		case AC_ARG_SETQLOWATER:
9437c478bd9Sstevel@tonic-gate 			++argv;
9447c478bd9Sstevel@tonic-gate 			do_setqlowater(*argv);
9457c478bd9Sstevel@tonic-gate 			break;
9467c478bd9Sstevel@tonic-gate 
9477c478bd9Sstevel@tonic-gate 		case AC_ARG_SETSMASK:
9487c478bd9Sstevel@tonic-gate 			{
9497c478bd9Sstevel@tonic-gate 				char *asid_str;
9507c478bd9Sstevel@tonic-gate 
9517c478bd9Sstevel@tonic-gate 				++argv;
9527c478bd9Sstevel@tonic-gate 				asid_str = *argv;
953f8994074SJan Friedel 				do_setsmask(asid_str, mask);
954f8994074SJan Friedel 
9557c478bd9Sstevel@tonic-gate 				++argv;
9567c478bd9Sstevel@tonic-gate 			}
9577c478bd9Sstevel@tonic-gate 			break;
9587c478bd9Sstevel@tonic-gate 		case AC_ARG_SETUMASK:
9597c478bd9Sstevel@tonic-gate 			{
9607c478bd9Sstevel@tonic-gate 				char *auid_str;
9617c478bd9Sstevel@tonic-gate 
9627c478bd9Sstevel@tonic-gate 				++argv;
9637c478bd9Sstevel@tonic-gate 				auid_str = *argv;
964f8994074SJan Friedel 				do_setumask(auid_str, mask);
965f8994074SJan Friedel 
9667c478bd9Sstevel@tonic-gate 				++argv;
9677c478bd9Sstevel@tonic-gate 			}
9687c478bd9Sstevel@tonic-gate 			break;
9698523fda3SJan Friedel 		case AC_ARG_SET_TEMPORARY:
9708523fda3SJan Friedel 			break;
9717c478bd9Sstevel@tonic-gate 
9727c478bd9Sstevel@tonic-gate 		default:
9737c478bd9Sstevel@tonic-gate 			exit_error(gettext("Internal error #2."));
9747c478bd9Sstevel@tonic-gate 			break;
9757c478bd9Sstevel@tonic-gate 		}
9767c478bd9Sstevel@tonic-gate 	}
9777c478bd9Sstevel@tonic-gate }
9787c478bd9Sstevel@tonic-gate 
9797c478bd9Sstevel@tonic-gate /*
9808523fda3SJan Friedel  * do_chkconf() - the returned value is for the global zone unless AUDIT_PERZONE
9818523fda3SJan Friedel  * is set.
9827c478bd9Sstevel@tonic-gate  */
9837c478bd9Sstevel@tonic-gate static void
9849e3700dfSgww do_chkconf(void)
9857c478bd9Sstevel@tonic-gate {
9867c478bd9Sstevel@tonic-gate 	register au_event_ent_t *evp;
9877c478bd9Sstevel@tonic-gate 	au_mask_t pmask;
9887c478bd9Sstevel@tonic-gate 	char conf_aflags[256];
9897c478bd9Sstevel@tonic-gate 	char run_aflags[256];
9907c478bd9Sstevel@tonic-gate 	au_stat_t as;
9917c478bd9Sstevel@tonic-gate 	int class;
9927c478bd9Sstevel@tonic-gate 	int			len;
9937c478bd9Sstevel@tonic-gate 	struct au_evclass_map	cmap;
9947c478bd9Sstevel@tonic-gate 
9957c478bd9Sstevel@tonic-gate 	pmask.am_success = pmask.am_failure = 0;
9967c478bd9Sstevel@tonic-gate 	eauditon(A_GETSTAT, (caddr_t)&as, 0);
9977c478bd9Sstevel@tonic-gate 
9987c478bd9Sstevel@tonic-gate 	setauevent();
9999e3700dfSgww 	if (getauevent() == NULL) {
10008523fda3SJan Friedel 		exit_error(gettext("NO AUDIT EVENTS: Could not read %s\n."),
10018523fda3SJan Friedel 		    AUDITEVENTFILE);
10027c478bd9Sstevel@tonic-gate 	}
10037c478bd9Sstevel@tonic-gate 
10047c478bd9Sstevel@tonic-gate 	setauevent();
10059e3700dfSgww 	while ((evp = getauevent()) != NULL) {
10067c478bd9Sstevel@tonic-gate 		cmap.ec_number = evp->ae_number;
10077c478bd9Sstevel@tonic-gate 		len = sizeof (struct au_evclass_map);
10089e3700dfSgww 		if (evp->ae_number <= as.as_numevent) {
10097c478bd9Sstevel@tonic-gate 			if (auditon(A_GETCLASS, (caddr_t)&cmap, len) == -1) {
1010d0fa49b7STony Nguyen 				(void) printf("%s(%hu):%s",
10119e3700dfSgww 				    evp->ae_name, evp->ae_number,
10129e3700dfSgww 				    gettext("UNKNOWN EVENT: Could not get "
10139e3700dfSgww 				    "class for event. Configuration may "
10149e3700dfSgww 				    "be bad.\n"));
10157c478bd9Sstevel@tonic-gate 			} else {
10167c478bd9Sstevel@tonic-gate 				class = cmap.ec_class;
10177c478bd9Sstevel@tonic-gate 				if (class != evp->ae_class) {
10187c478bd9Sstevel@tonic-gate 					conf_aflags[0] = run_aflags[0] = '\0';
10197c478bd9Sstevel@tonic-gate 					pmask.am_success = class;
10207c478bd9Sstevel@tonic-gate 					pmask.am_failure = class;
10217c478bd9Sstevel@tonic-gate 					(void) getauditflagschar(run_aflags,
10228523fda3SJan Friedel 					    &pmask, 0);
10237c478bd9Sstevel@tonic-gate 					pmask.am_success = evp->ae_class;
10247c478bd9Sstevel@tonic-gate 					pmask.am_failure = evp->ae_class;
10257c478bd9Sstevel@tonic-gate 					(void) getauditflagschar(conf_aflags,
10268523fda3SJan Friedel 					    &pmask, 0);
10277c478bd9Sstevel@tonic-gate 
10287c478bd9Sstevel@tonic-gate 					(void) printf(gettext(
1029d0fa49b7STony Nguyen 					    "%s(%hu): CLASS MISMATCH: "
10309e3700dfSgww 					    "runtime class (%s) != "
10319e3700dfSgww 					    "configured class (%s)\n"),
10329e3700dfSgww 					    evp->ae_name, evp->ae_number,
10339e3700dfSgww 					    NONE(run_aflags),
10349e3700dfSgww 					    NONE(conf_aflags));
10357c478bd9Sstevel@tonic-gate 				}
10367c478bd9Sstevel@tonic-gate 			}
10379e3700dfSgww 		}
10387c478bd9Sstevel@tonic-gate 	}
10397c478bd9Sstevel@tonic-gate 	endauevent();
10407c478bd9Sstevel@tonic-gate }
10417c478bd9Sstevel@tonic-gate 
10427c478bd9Sstevel@tonic-gate /*
10438523fda3SJan Friedel  * do_conf() - configure the kernel events. The value returned to the user is
10448523fda3SJan Friedel  * for the global zone unless AUDIT_PERZONE is set.
10457c478bd9Sstevel@tonic-gate  */
10467c478bd9Sstevel@tonic-gate static void
10479e3700dfSgww do_conf(void)
10487c478bd9Sstevel@tonic-gate {
10497c478bd9Sstevel@tonic-gate 	register au_event_ent_t *evp;
10507c478bd9Sstevel@tonic-gate 	register int i;
10517c478bd9Sstevel@tonic-gate 	au_evclass_map_t ec;
10527c478bd9Sstevel@tonic-gate 	au_stat_t as;
10537c478bd9Sstevel@tonic-gate 
10547c478bd9Sstevel@tonic-gate 	eauditon(A_GETSTAT, (caddr_t)&as, 0);
10557c478bd9Sstevel@tonic-gate 
10567c478bd9Sstevel@tonic-gate 	i = 0;
10577c478bd9Sstevel@tonic-gate 	setauevent();
10589e3700dfSgww 	while ((evp = getauevent()) != NULL) {
10597c478bd9Sstevel@tonic-gate 		if (evp->ae_number <= as.as_numevent) {
10607c478bd9Sstevel@tonic-gate 			++i;
10617c478bd9Sstevel@tonic-gate 			ec.ec_number = evp->ae_number;
10627c478bd9Sstevel@tonic-gate 			ec.ec_class = evp->ae_class;
1063f8994074SJan Friedel 			eauditon(A_SETCLASS, (caddr_t)&ec, sizeof (ec));
10647c478bd9Sstevel@tonic-gate 		}
10657c478bd9Sstevel@tonic-gate 	}
10667c478bd9Sstevel@tonic-gate 	endauevent();
10677c478bd9Sstevel@tonic-gate 	(void) printf(gettext("Configured %d kernel events.\n"), i);
10687c478bd9Sstevel@tonic-gate 
10697c478bd9Sstevel@tonic-gate }
10707c478bd9Sstevel@tonic-gate 
10717c478bd9Sstevel@tonic-gate /*
10728523fda3SJan Friedel  * do_chkaconf() - report a mismatch if the runtime class mask of a kernel audit
10738523fda3SJan Friedel  * event does not match the configured class mask. The value returned to the
10748523fda3SJan Friedel  * user is for the global zone unless AUDIT_PERZONE is set.
10757c478bd9Sstevel@tonic-gate  */
10767c478bd9Sstevel@tonic-gate static void
10779e3700dfSgww do_chkaconf(void)
10787c478bd9Sstevel@tonic-gate {
1079f8994074SJan Friedel 	char		*namask_cfg;
1080*de4cec48SToomas Soome 	au_mask_t	pmask, kmask;
10817c478bd9Sstevel@tonic-gate 
1082f8994074SJan Friedel 	if (!do_getnaflags_scf(&namask_cfg) || namask_cfg == NULL) {
1083f8994074SJan Friedel 		exit_error(gettext("Could not get configured value."));
10847c478bd9Sstevel@tonic-gate 	}
1085f8994074SJan Friedel 	egetauditflagsbin(namask_cfg, &pmask);
10867c478bd9Sstevel@tonic-gate 
1087f8994074SJan Friedel 	eauditon(A_GETKMASK, (caddr_t)&kmask, sizeof (kmask));
10887c478bd9Sstevel@tonic-gate 
10897c478bd9Sstevel@tonic-gate 	if ((pmask.am_success != kmask.am_success) ||
10907c478bd9Sstevel@tonic-gate 	    (pmask.am_failure != kmask.am_failure)) {
10917c478bd9Sstevel@tonic-gate 		char kbuf[2048];
10927c478bd9Sstevel@tonic-gate 		if (getauditflagschar(kbuf, &kmask, 0) < 0) {
1093f8994074SJan Friedel 			free(namask_cfg);
10947c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr,
10957c478bd9Sstevel@tonic-gate 			    gettext("bad kernel non-attributable mask\n"));
10967c478bd9Sstevel@tonic-gate 			exit(1);
10977c478bd9Sstevel@tonic-gate 		}
1098f8994074SJan Friedel 		(void) printf(
1099f8994074SJan Friedel 		    gettext("non-attributable event flags mismatch:\n"));
1100f8994074SJan Friedel 		(void) printf(gettext("active non-attributable audit flags "
1101f8994074SJan Friedel 		    "= %s\n"), kbuf);
1102f8994074SJan Friedel 		(void) printf(gettext("configured non-attributable audit flags "
1103f8994074SJan Friedel 		    "= %s\n"), namask_cfg);
11047c478bd9Sstevel@tonic-gate 	}
1105f8994074SJan Friedel 	free(namask_cfg);
11067c478bd9Sstevel@tonic-gate }
11077c478bd9Sstevel@tonic-gate 
11087c478bd9Sstevel@tonic-gate /*
11098523fda3SJan Friedel  * do_aconf - configures the non-attributable events. The value returned to the
11108523fda3SJan Friedel  * user is for the global zone unless AUDIT_PERZONE is set.
11117c478bd9Sstevel@tonic-gate  */
11127c478bd9Sstevel@tonic-gate static void
11139e3700dfSgww do_aconf(void)
11147c478bd9Sstevel@tonic-gate {
1115*de4cec48SToomas Soome 	au_mask_t	namask;
1116f8994074SJan Friedel 	char		*namask_cfg;
11177c478bd9Sstevel@tonic-gate 
1118f8994074SJan Friedel 	if (!do_getnaflags_scf(&namask_cfg) || namask_cfg == NULL) {
1119f8994074SJan Friedel 		exit_error(gettext("Could not get configured value."));
11207c478bd9Sstevel@tonic-gate 	}
1121f8994074SJan Friedel 	egetauditflagsbin(namask_cfg, &namask);
1122f8994074SJan Friedel 	free(namask_cfg);
11237c478bd9Sstevel@tonic-gate 
1124f8994074SJan Friedel 	eauditon(A_SETKMASK, (caddr_t)&namask, sizeof (namask));
1125f8994074SJan Friedel 	(void) printf(gettext("Configured non-attributable event mask.\n"));
11267c478bd9Sstevel@tonic-gate }
11277c478bd9Sstevel@tonic-gate 
11288523fda3SJan Friedel /*
11298523fda3SJan Friedel  * do_audit() - construct an audit record for audit event event using the
11308523fda3SJan Friedel  * process's audit characteristics containing a text token string audit_str. The
11318523fda3SJan Friedel  * return token is constructed from the success/failure flag sort. Returned
11328523fda3SJan Friedel  * value retval is an errno value.
11338523fda3SJan Friedel  */
11347c478bd9Sstevel@tonic-gate static void
11359e3700dfSgww do_audit(char *event, char sorf, int retval, char *audit_str)
11367c478bd9Sstevel@tonic-gate {
11377c478bd9Sstevel@tonic-gate 	int rtn;
11387c478bd9Sstevel@tonic-gate 	int rd;
11397c478bd9Sstevel@tonic-gate 	au_event_t event_num;
11407c478bd9Sstevel@tonic-gate 	au_event_ent_t *evp;
11417c478bd9Sstevel@tonic-gate 	auditinfo_addr_t ai;
11427c478bd9Sstevel@tonic-gate 	token_t *tokp;
11437c478bd9Sstevel@tonic-gate 
11447c478bd9Sstevel@tonic-gate 	egetaudit(&ai, sizeof (ai));
11457c478bd9Sstevel@tonic-gate 
11467c478bd9Sstevel@tonic-gate 	if (strisnum(event)) {
11477c478bd9Sstevel@tonic-gate 		event_num = (au_event_t)atoi(event);
11487c478bd9Sstevel@tonic-gate 		evp = egetauevnum(event_num);
11499e3700dfSgww 	} else {
11507c478bd9Sstevel@tonic-gate 		evp = egetauevnam(event);
11519e3700dfSgww 	}
11527c478bd9Sstevel@tonic-gate 
11537c478bd9Sstevel@tonic-gate 	rtn = au_preselect(evp->ae_number, &ai.ai_mask, (int)sorf,
11549e3700dfSgww 	    AU_PRS_USECACHE);
11557c478bd9Sstevel@tonic-gate 
11569e3700dfSgww 	if (rtn == -1) {
1157d0fa49b7STony Nguyen 		exit_error("%s\n%s %hu\n",
11589e3700dfSgww 		    gettext("Check audit event configuration."),
11599e3700dfSgww 		    gettext("Could not get audit class for event number"),
11609e3700dfSgww 		    evp->ae_number);
11619e3700dfSgww 	}
11627c478bd9Sstevel@tonic-gate 
11637c478bd9Sstevel@tonic-gate 	/* record is preselected */
11647c478bd9Sstevel@tonic-gate 	if (rtn == 1) {
11659e3700dfSgww 		if ((rd = au_open()) == -1) {
11668523fda3SJan Friedel 			exit_error(gettext(
11678523fda3SJan Friedel 			    "Could not get and audit record descriptor\n"));
11689e3700dfSgww 		}
11699e3700dfSgww 		if ((tokp = au_to_me()) == NULL) {
11708523fda3SJan Friedel 			exit_error(
11718523fda3SJan Friedel 			    gettext("Could not allocate subject token\n"));
11729e3700dfSgww 		}
11739e3700dfSgww 		if (au_write(rd, tokp) == -1) {
11748523fda3SJan Friedel 			exit_error(gettext("Could not construct subject token "
11758523fda3SJan Friedel 			    "of audit record\n"));
11769e3700dfSgww 		}
11779e3700dfSgww 		if (is_system_labeled()) {
11789e3700dfSgww 			if ((tokp = au_to_mylabel()) == NULL) {
11798523fda3SJan Friedel 				exit_error(gettext(
11808523fda3SJan Friedel 				    "Could not allocate label token\n"));
11819e3700dfSgww 			}
11829e3700dfSgww 			if (au_write(rd, tokp) == -1) {
11838523fda3SJan Friedel 				exit_error(gettext("Could not "
11848523fda3SJan Friedel 				    "construct label token of audit record\n"));
11859e3700dfSgww 			}
118645916cd2Sjpk 		}
118745916cd2Sjpk 
11889e3700dfSgww 		if ((tokp = au_to_text(audit_str)) == NULL)
11897c478bd9Sstevel@tonic-gate 			exit_error(gettext("Could not allocate text token\n"));
11907c478bd9Sstevel@tonic-gate 		if (au_write(rd, tokp) == -1)
11919e3700dfSgww 			exit_error(gettext("Could not construct text token of "
11929e3700dfSgww 			    "audit record\n"));
11937c478bd9Sstevel@tonic-gate #ifdef _LP64
11949e3700dfSgww 		if ((tokp = au_to_return64(sorf, retval)) == NULL)
11957c478bd9Sstevel@tonic-gate #else
11969e3700dfSgww 		if ((tokp = au_to_return32(sorf, retval)) == NULL)
11977c478bd9Sstevel@tonic-gate #endif
11988523fda3SJan Friedel 			exit_error(
11998523fda3SJan Friedel 			    gettext("Could not allocate return token\n"));
12009e3700dfSgww 		if (au_write(rd, tokp) == -1) {
12019e3700dfSgww 			exit_error(gettext("Could not construct return token "
12029e3700dfSgww 			    "of audit record\n"));
12039e3700dfSgww 		}
12049e3700dfSgww 		if (au_close(rd, 1, evp->ae_number) == -1) {
12058523fda3SJan Friedel 			exit_error(
12068523fda3SJan Friedel 			    gettext("Could not write audit record: %s\n"),
12078523fda3SJan Friedel 			    strerror(errno));
12089e3700dfSgww 		}
12097c478bd9Sstevel@tonic-gate 	}
12107c478bd9Sstevel@tonic-gate }
12117c478bd9Sstevel@tonic-gate 
12128523fda3SJan Friedel /*
12138523fda3SJan Friedel  * do_getauid() - print the audit id of the current process.
12148523fda3SJan Friedel  */
12157c478bd9Sstevel@tonic-gate static void
12169e3700dfSgww do_getauid(void)
12177c478bd9Sstevel@tonic-gate {
12187c478bd9Sstevel@tonic-gate 	au_id_t auid;
12197c478bd9Sstevel@tonic-gate 
12207c478bd9Sstevel@tonic-gate 	egetauid(&auid);
12217c478bd9Sstevel@tonic-gate 	print_auid(auid);
12227c478bd9Sstevel@tonic-gate }
12237c478bd9Sstevel@tonic-gate 
12248523fda3SJan Friedel /*
12258523fda3SJan Friedel  * do_getaudit() - print the audit characteristics of the current process.
12268523fda3SJan Friedel  */
12277c478bd9Sstevel@tonic-gate static void
12289e3700dfSgww do_getaudit(void)
12297c478bd9Sstevel@tonic-gate {
12307c478bd9Sstevel@tonic-gate 	auditinfo_addr_t ai;
12317c478bd9Sstevel@tonic-gate 
12327c478bd9Sstevel@tonic-gate 	egetaudit(&ai, sizeof (ai));
12337c478bd9Sstevel@tonic-gate 	print_auid(ai.ai_auid);
12347c478bd9Sstevel@tonic-gate 	print_mask(gettext("process preselection mask"), &ai.ai_mask);
12357c478bd9Sstevel@tonic-gate 	print_tid_ex(&ai.ai_termid);
12367c478bd9Sstevel@tonic-gate 	print_asid(ai.ai_asid);
12377c478bd9Sstevel@tonic-gate }
12387c478bd9Sstevel@tonic-gate 
12398523fda3SJan Friedel /*
12408523fda3SJan Friedel  * do_getkaudit() - print the audit characteristics of the current zone.
12418523fda3SJan Friedel  */
12427c478bd9Sstevel@tonic-gate static void
12439e3700dfSgww do_getkaudit(void)
12447c478bd9Sstevel@tonic-gate {
12457c478bd9Sstevel@tonic-gate 	auditinfo_addr_t ai;
12467c478bd9Sstevel@tonic-gate 
12477c478bd9Sstevel@tonic-gate 	egetkaudit(&ai, sizeof (ai));
12487c478bd9Sstevel@tonic-gate 	print_auid(ai.ai_auid);
12497c478bd9Sstevel@tonic-gate 	print_mask(gettext("process preselection mask"), &ai.ai_mask);
12507c478bd9Sstevel@tonic-gate 	print_tid_ex(&ai.ai_termid);
12517c478bd9Sstevel@tonic-gate 	print_asid(ai.ai_asid);
12527c478bd9Sstevel@tonic-gate }
12537c478bd9Sstevel@tonic-gate 
12547c478bd9Sstevel@tonic-gate /*
12558523fda3SJan Friedel  * do_setkaudit() - set IP address_type/address of machine to specified values;
12568523fda3SJan Friedel  * valid per zone if AUDIT_PERZONE is set, else only in global zone.
12577c478bd9Sstevel@tonic-gate  */
12587c478bd9Sstevel@tonic-gate static void
12599e3700dfSgww do_setkaudit(char *t, char *s)
12607c478bd9Sstevel@tonic-gate {
12617c478bd9Sstevel@tonic-gate 	uint_t type;
12627c478bd9Sstevel@tonic-gate 	auditinfo_addr_t ai;
12637c478bd9Sstevel@tonic-gate 
12647c478bd9Sstevel@tonic-gate 	egetkaudit(&ai, sizeof (ai));
12657c478bd9Sstevel@tonic-gate 	(void) str2type(t, &type);
12667c478bd9Sstevel@tonic-gate 	(void) str2ipaddr(s, &ai.ai_termid.at_addr[0], type);
12677c478bd9Sstevel@tonic-gate 	ai.ai_termid.at_type = type;
12687c478bd9Sstevel@tonic-gate 	esetkaudit(&ai, sizeof (ai));
12697c478bd9Sstevel@tonic-gate }
12707c478bd9Sstevel@tonic-gate 
12717c478bd9Sstevel@tonic-gate /*
12728523fda3SJan Friedel  * do_getcar() - print the zone-relative root
12737c478bd9Sstevel@tonic-gate  */
12747c478bd9Sstevel@tonic-gate static void
12759e3700dfSgww do_getcar(void)
12767c478bd9Sstevel@tonic-gate {
12777c478bd9Sstevel@tonic-gate 	char path[MAXPATHLEN];
12787c478bd9Sstevel@tonic-gate 
1279f8994074SJan Friedel 	eauditon(A_GETCAR, (caddr_t)path, sizeof (path));
12807c478bd9Sstevel@tonic-gate 	(void) printf(gettext("current active root = %s\n"), path);
12817c478bd9Sstevel@tonic-gate }
12827c478bd9Sstevel@tonic-gate 
12837c478bd9Sstevel@tonic-gate /*
12848523fda3SJan Friedel  * do_getclass() - print the preselection mask associated with the specified
12858523fda3SJan Friedel  * kernel audit event. The displayed value is for the global zone unless
12868523fda3SJan Friedel  * AUDIT_PERZONE is set.
12877c478bd9Sstevel@tonic-gate  */
12887c478bd9Sstevel@tonic-gate static void
12899e3700dfSgww do_getclass(char *event_str)
12907c478bd9Sstevel@tonic-gate {
12917c478bd9Sstevel@tonic-gate 	au_evclass_map_t ec;
12927c478bd9Sstevel@tonic-gate 	au_event_ent_t *evp;
12937c478bd9Sstevel@tonic-gate 	au_event_t event_number;
12947c478bd9Sstevel@tonic-gate 	char *event_name;
12957c478bd9Sstevel@tonic-gate 
12967c478bd9Sstevel@tonic-gate 	if (strisnum(event_str)) {
12977c478bd9Sstevel@tonic-gate 		event_number = atol(event_str);
12989e3700dfSgww 		if ((evp = egetauevnum(event_number)) != NULL) {
12997c478bd9Sstevel@tonic-gate 			event_number = evp->ae_number;
13007c478bd9Sstevel@tonic-gate 			event_name = evp->ae_name;
13019e3700dfSgww 		} else {
13027c478bd9Sstevel@tonic-gate 			event_name = gettext("unknown");
13039e3700dfSgww 		}
13047c478bd9Sstevel@tonic-gate 	} else {
13057c478bd9Sstevel@tonic-gate 		event_name = event_str;
13069e3700dfSgww 		if ((evp = egetauevnam(event_str)) != NULL) {
13077c478bd9Sstevel@tonic-gate 			event_number = evp->ae_number;
13089e3700dfSgww 		}
13097c478bd9Sstevel@tonic-gate 	}
13107c478bd9Sstevel@tonic-gate 
13117c478bd9Sstevel@tonic-gate 	ec.ec_number = event_number;
13127c478bd9Sstevel@tonic-gate 	eauditon(A_GETCLASS, (caddr_t)&ec, 0);
13137c478bd9Sstevel@tonic-gate 
1314d0fa49b7STony Nguyen 	(void) printf(gettext("audit class mask for event %s(%hu) = 0x%x\n"),
13159e3700dfSgww 	    event_name, event_number, ec.ec_class);
13167c478bd9Sstevel@tonic-gate }
13177c478bd9Sstevel@tonic-gate 
13187c478bd9Sstevel@tonic-gate /*
13198523fda3SJan Friedel  * do_getcond() - the printed value is for the global zone unless
13208523fda3SJan Friedel  * AUDIT_PERZONE is set. (AUC_DISABLED is always global, the other states are
13218523fda3SJan Friedel  * per zone if AUDIT_PERZONE is set)
13227c478bd9Sstevel@tonic-gate  */
13237c478bd9Sstevel@tonic-gate static void
13249e3700dfSgww do_getcond(void)
13257c478bd9Sstevel@tonic-gate {
13269e3700dfSgww 	(void) printf(gettext("audit condition = %s\n"), cond2str());
13277c478bd9Sstevel@tonic-gate }
13287c478bd9Sstevel@tonic-gate 
13297c478bd9Sstevel@tonic-gate /*
13308523fda3SJan Friedel  * do_getcwd() - the printed path is relative to the current zone root
13317c478bd9Sstevel@tonic-gate  */
13327c478bd9Sstevel@tonic-gate static void
13339e3700dfSgww do_getcwd(void)
13347c478bd9Sstevel@tonic-gate {
13357c478bd9Sstevel@tonic-gate 	char path[MAXPATHLEN];
13367c478bd9Sstevel@tonic-gate 
1337f8994074SJan Friedel 	eauditon(A_GETCWD, (caddr_t)path, sizeof (path));
13387c478bd9Sstevel@tonic-gate 	(void) printf(gettext("current working directory = %s\n"), path);
13397c478bd9Sstevel@tonic-gate }
13407c478bd9Sstevel@tonic-gate 
1341f8994074SJan Friedel /*
1342f8994074SJan Friedel  * do_getflags() - the printed value is for the global zone unless AUDIT_PERZONE
1343f8994074SJan Friedel  * is set.
1344f8994074SJan Friedel  */
1345f8994074SJan Friedel static void
1346f8994074SJan Friedel do_getflags(void)
1347f8994074SJan Friedel {
1348f8994074SJan Friedel 	au_mask_t	amask;
1349f8994074SJan Friedel 	char		*amask_cfg;
1350f8994074SJan Friedel 
1351f8994074SJan Friedel 	eauditon(A_GETAMASK, (caddr_t)&amask, sizeof (amask));
1352f8994074SJan Friedel 	print_mask(gettext("active user default audit flags"), &amask);
1353f8994074SJan Friedel 
1354f8994074SJan Friedel 	if (!do_getflags_scf(&amask_cfg) || amask_cfg == NULL) {
1355f8994074SJan Friedel 		exit_error(gettext("Could not get configured value."));
1356f8994074SJan Friedel 	}
1357f8994074SJan Friedel 	egetauditflagsbin(amask_cfg, &amask);
1358f8994074SJan Friedel 	print_mask(gettext("configured user default audit flags"), &amask);
1359f8994074SJan Friedel 	free(amask_cfg);
1360f8994074SJan Friedel }
1361f8994074SJan Friedel 
13627c478bd9Sstevel@tonic-gate /*
13638523fda3SJan Friedel  * do_getkmask() - the printed value is for the global zone unless AUDIT_PERZONE
13648523fda3SJan Friedel  * is set.
13657c478bd9Sstevel@tonic-gate  */
13667c478bd9Sstevel@tonic-gate static void
13679e3700dfSgww do_getkmask(void)
13687c478bd9Sstevel@tonic-gate {
13697c478bd9Sstevel@tonic-gate 	au_mask_t pmask;
13707c478bd9Sstevel@tonic-gate 
1371f8994074SJan Friedel 	eauditon(A_GETKMASK, (caddr_t)&pmask, sizeof (pmask));
1372f8994074SJan Friedel 	print_mask(gettext("active non-attributable audit flags"), &pmask);
1373f8994074SJan Friedel }
1374f8994074SJan Friedel 
1375f8994074SJan Friedel /*
1376f8994074SJan Friedel  * do_getnaflags() - the printed value is for the global zone unless
1377f8994074SJan Friedel  * AUDIT_PERZONE is set.
1378f8994074SJan Friedel  */
1379f8994074SJan Friedel static void
1380f8994074SJan Friedel do_getnaflags(void)
1381f8994074SJan Friedel {
1382f8994074SJan Friedel 	au_mask_t	namask;
1383f8994074SJan Friedel 	char		*namask_cfg;
1384f8994074SJan Friedel 
1385f8994074SJan Friedel 	eauditon(A_GETKMASK, (caddr_t)&namask, sizeof (namask));
1386f8994074SJan Friedel 	print_mask(gettext("active non-attributable audit flags"), &namask);
1387f8994074SJan Friedel 
1388f8994074SJan Friedel 	if (!do_getnaflags_scf(&namask_cfg) || namask_cfg == NULL) {
1389f8994074SJan Friedel 		exit_error(gettext("Could not get configured value."));
1390f8994074SJan Friedel 	}
1391f8994074SJan Friedel 	egetauditflagsbin(namask_cfg, &namask);
1392f8994074SJan Friedel 	print_mask(gettext("configured non-attributable audit flags"), &namask);
1393f8994074SJan Friedel 	free(namask_cfg);
13947c478bd9Sstevel@tonic-gate }
13957c478bd9Sstevel@tonic-gate 
13967c478bd9Sstevel@tonic-gate /*
13978523fda3SJan Friedel  * do_getpolicy() - print active and configured kernel audit policy relative to
13988523fda3SJan Friedel  * the current zone.
13997c478bd9Sstevel@tonic-gate  */
14007c478bd9Sstevel@tonic-gate static void
14019e3700dfSgww do_getpolicy(void)
14027c478bd9Sstevel@tonic-gate {
1403*de4cec48SToomas Soome 	char			policy_str[1024];
14048523fda3SJan Friedel 	uint32_t		policy;
14058523fda3SJan Friedel 
14068523fda3SJan Friedel 	if (!temporary_set) {
14078523fda3SJan Friedel 		if (!do_getpolicy_scf(&policy)) {
14088523fda3SJan Friedel 			exit_error(gettext("Could not get configured values."));
14098523fda3SJan Friedel 		}
14108523fda3SJan Friedel 		(void) policy2str(policy, policy_str, sizeof (policy_str));
14118523fda3SJan Friedel 		(void) printf(gettext("configured audit policies = %s\n"),
14128523fda3SJan Friedel 		    policy_str);
14138523fda3SJan Friedel 	}
14147c478bd9Sstevel@tonic-gate 
14157c478bd9Sstevel@tonic-gate 	eauditon(A_GETPOLICY, (caddr_t)&policy, 0);
14167c478bd9Sstevel@tonic-gate 	(void) policy2str(policy, policy_str, sizeof (policy_str));
14178523fda3SJan Friedel 	(void) printf(gettext("active audit policies = %s\n"), policy_str);
14187c478bd9Sstevel@tonic-gate }
14197c478bd9Sstevel@tonic-gate 
14208523fda3SJan Friedel 
14218523fda3SJan Friedel /*
14228523fda3SJan Friedel  * do_getpinfo() - print the audit ID, preselection mask, terminal ID, and
14238523fda3SJan Friedel  * audit session ID for the specified process.
14248523fda3SJan Friedel  */
14257c478bd9Sstevel@tonic-gate static void
14269e3700dfSgww do_getpinfo(char *pid_str)
14277c478bd9Sstevel@tonic-gate {
14287c478bd9Sstevel@tonic-gate 	struct auditpinfo_addr ap;
14297c478bd9Sstevel@tonic-gate 
14307c478bd9Sstevel@tonic-gate 	if (strisnum(pid_str))
14317c478bd9Sstevel@tonic-gate 		ap.ap_pid = (pid_t)atoi(pid_str);
14327c478bd9Sstevel@tonic-gate 	else
14337c478bd9Sstevel@tonic-gate 		exit_usage(1);
14347c478bd9Sstevel@tonic-gate 
14357c478bd9Sstevel@tonic-gate 	eauditon(A_GETPINFO_ADDR, (caddr_t)&ap, sizeof (ap));
14367c478bd9Sstevel@tonic-gate 
14377c478bd9Sstevel@tonic-gate 	print_auid(ap.ap_auid);
14387c478bd9Sstevel@tonic-gate 	print_mask(gettext("process preselection mask"), &(ap.ap_mask));
14397c478bd9Sstevel@tonic-gate 	print_tid_ex(&(ap.ap_termid));
14407c478bd9Sstevel@tonic-gate 	print_asid(ap.ap_asid);
14417c478bd9Sstevel@tonic-gate }
14427c478bd9Sstevel@tonic-gate 
1443f8994074SJan Friedel /*
1444f8994074SJan Friedel  * do_getplugin() - print plugin configuration.
1445f8994074SJan Friedel  */
1446f8994074SJan Friedel static void
1447f8994074SJan Friedel do_getplugin(char *plugin_str)
1448f8994074SJan Friedel {
1449f8994074SJan Friedel 	scf_plugin_kva_node_t	*plugin_kva_ll;
1450f8994074SJan Friedel 	scf_plugin_kva_node_t	*plugin_kva_ll_head;
1451f8994074SJan Friedel 
1452f8994074SJan Friedel 	if (!do_getpluginconfig_scf(plugin_str, &plugin_kva_ll)) {
1453f8994074SJan Friedel 		exit_error(gettext("Could not get plugin configuration."));
1454f8994074SJan Friedel 	}
1455f8994074SJan Friedel 
1456f8994074SJan Friedel 	plugin_kva_ll_head = plugin_kva_ll;
1457f8994074SJan Friedel 
1458f8994074SJan Friedel 	while (plugin_kva_ll != NULL) {
1459f8994074SJan Friedel 		print_plugin(plugin_kva_ll->plugin_name,
1460f8994074SJan Friedel 		    plugin_kva_ll->plugin_kva);
1461f8994074SJan Friedel 		plugin_kva_ll = plugin_kva_ll->next;
1462f8994074SJan Friedel 		if (plugin_kva_ll != NULL) {
1463f8994074SJan Friedel 			(void) printf("\n");
1464f8994074SJan Friedel 		}
1465f8994074SJan Friedel 	}
1466f8994074SJan Friedel 	plugin_kva_ll_free(plugin_kva_ll_head);
1467f8994074SJan Friedel }
1468f8994074SJan Friedel 
14697c478bd9Sstevel@tonic-gate /*
14708523fda3SJan Friedel  * do_getqbufsz() - print the active and configured audit queue write buffer
14718523fda3SJan Friedel  * size relative to the current zone.
14727c478bd9Sstevel@tonic-gate  */
14737c478bd9Sstevel@tonic-gate static void
14749e3700dfSgww do_getqbufsz(void)
14757c478bd9Sstevel@tonic-gate {
14767c478bd9Sstevel@tonic-gate 	struct au_qctrl qctrl;
14777c478bd9Sstevel@tonic-gate 
14788523fda3SJan Friedel 	if (!temporary_set) {
14798523fda3SJan Friedel 		if (!do_getqbufsz_scf(&qctrl.aq_bufsz)) {
14808523fda3SJan Friedel 			exit_error(gettext("Could not get configured value."));
14818523fda3SJan Friedel 		}
14828523fda3SJan Friedel 
14838523fda3SJan Friedel 		if (qctrl.aq_bufsz == 0) {
14848523fda3SJan Friedel 			(void) printf(gettext(
14858523fda3SJan Friedel 			    "no configured audit queue buffer size\n"));
14868523fda3SJan Friedel 		} else {
14878523fda3SJan Friedel 			(void) printf(gettext("configured audit queue "
14888523fda3SJan Friedel 			    "buffer size (bytes) = %d\n"), qctrl.aq_bufsz);
14898523fda3SJan Friedel 		}
14908523fda3SJan Friedel 	}
14918523fda3SJan Friedel 
14927c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
14938523fda3SJan Friedel 	(void) printf(gettext("active audit queue buffer size (bytes) = %d\n"),
14948523fda3SJan Friedel 	    qctrl.aq_bufsz);
14957c478bd9Sstevel@tonic-gate }
14967c478bd9Sstevel@tonic-gate 
14977c478bd9Sstevel@tonic-gate /*
14988523fda3SJan Friedel  * do_getqctrl() - print the configured and active audit queue write buffer
14998523fda3SJan Friedel  * size, audit queue hiwater mark, audit queue lowater mark, audit queue prod
15008523fda3SJan Friedel  * interval (ticks) relative to the current zone.
15017c478bd9Sstevel@tonic-gate  */
15027c478bd9Sstevel@tonic-gate static void
15039e3700dfSgww do_getqctrl(void)
15047c478bd9Sstevel@tonic-gate {
15058523fda3SJan Friedel 	struct au_qctrl	qctrl;
15068523fda3SJan Friedel 
15078523fda3SJan Friedel 	if (!temporary_set) {
15088523fda3SJan Friedel 		if (!do_getqctrl_scf(&qctrl)) {
15098523fda3SJan Friedel 			exit_error(gettext("Could not get configured values."));
15108523fda3SJan Friedel 		}
15118523fda3SJan Friedel 
15128523fda3SJan Friedel 		if (qctrl.aq_hiwater == 0) {
15138523fda3SJan Friedel 			(void) printf(gettext(
15148523fda3SJan Friedel 			    "no configured audit queue hiwater mark\n"));
15158523fda3SJan Friedel 		} else {
15168523fda3SJan Friedel 			(void) printf(gettext("configured audit queue "
15178523fda3SJan Friedel 			    "hiwater mark (records) = %d\n"), qctrl.aq_hiwater);
15188523fda3SJan Friedel 		}
15198523fda3SJan Friedel 		if (qctrl.aq_lowater == 0) {
15208523fda3SJan Friedel 			(void) printf(gettext(
15218523fda3SJan Friedel 			    "no configured audit queue lowater mark\n"));
15228523fda3SJan Friedel 		} else {
15238523fda3SJan Friedel 			(void) printf(gettext("configured audit queue "
15248523fda3SJan Friedel 			    "lowater mark (records) = %d\n"), qctrl.aq_lowater);
15258523fda3SJan Friedel 		}
15268523fda3SJan Friedel 		if (qctrl.aq_bufsz == 0) {
15278523fda3SJan Friedel 			(void) printf(gettext(
15288523fda3SJan Friedel 			    "no configured audit queue buffer size\n"));
15298523fda3SJan Friedel 		} else {
15308523fda3SJan Friedel 			(void) printf(gettext("configured audit queue "
15318523fda3SJan Friedel 			    "buffer size (bytes) = %d\n"), qctrl.aq_bufsz);
15328523fda3SJan Friedel 		}
15338523fda3SJan Friedel 		if (qctrl.aq_delay == 0) {
15348523fda3SJan Friedel 			(void) printf(gettext(
15358523fda3SJan Friedel 			    "no configured audit queue delay\n"));
15368523fda3SJan Friedel 		} else {
15378523fda3SJan Friedel 			(void) printf(gettext("configured audit queue "
15388523fda3SJan Friedel 			    "delay (ticks) = %ld\n"), qctrl.aq_delay);
15398523fda3SJan Friedel 		}
15408523fda3SJan Friedel 	}
15417c478bd9Sstevel@tonic-gate 
15427c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
15438523fda3SJan Friedel 	(void) printf(gettext("active audit queue hiwater mark "
15448523fda3SJan Friedel 	    "(records) = %d\n"), qctrl.aq_hiwater);
15458523fda3SJan Friedel 	(void) printf(gettext("active audit queue lowater mark "
15468523fda3SJan Friedel 	    "(records) = %d\n"), qctrl.aq_lowater);
15478523fda3SJan Friedel 	(void) printf(gettext("active audit queue buffer size (bytes) = %d\n"),
15489e3700dfSgww 	    qctrl.aq_bufsz);
15498523fda3SJan Friedel 	(void) printf(gettext("active audit queue delay (ticks) = %ld\n"),
15509e3700dfSgww 	    qctrl.aq_delay);
15517c478bd9Sstevel@tonic-gate }
15527c478bd9Sstevel@tonic-gate 
15537c478bd9Sstevel@tonic-gate /*
15548523fda3SJan Friedel  * do_getqdelay() - print, relative to the current zone, the configured and
15558523fda3SJan Friedel  * active interval at which audit queue is prodded to start output.
15567c478bd9Sstevel@tonic-gate  */
15577c478bd9Sstevel@tonic-gate static void
15589e3700dfSgww do_getqdelay(void)
15597c478bd9Sstevel@tonic-gate {
15607c478bd9Sstevel@tonic-gate 	struct au_qctrl qctrl;
15617c478bd9Sstevel@tonic-gate 
15628523fda3SJan Friedel 	if (!temporary_set) {
15638523fda3SJan Friedel 		if (!do_getqdelay_scf(&qctrl.aq_delay)) {
15648523fda3SJan Friedel 			exit_error(gettext("Could not get configured value."));
15658523fda3SJan Friedel 		}
15668523fda3SJan Friedel 
15678523fda3SJan Friedel 		if (qctrl.aq_delay == 0) {
15688523fda3SJan Friedel 			(void) printf(gettext(
15698523fda3SJan Friedel 			    "no configured audit queue delay\n"));
15708523fda3SJan Friedel 		} else {
15718523fda3SJan Friedel 			(void) printf(gettext("configured audit queue "
15728523fda3SJan Friedel 			    "delay (ticks) = %ld\n"), qctrl.aq_delay);
15738523fda3SJan Friedel 		}
15748523fda3SJan Friedel 	}
15758523fda3SJan Friedel 
15767c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
15778523fda3SJan Friedel 	(void) printf(gettext("active audit queue delay (ticks) = %ld\n"),
15789e3700dfSgww 	    qctrl.aq_delay);
15797c478bd9Sstevel@tonic-gate }
15807c478bd9Sstevel@tonic-gate 
15817c478bd9Sstevel@tonic-gate /*
15828523fda3SJan Friedel  * do_getqhiwater() - print, relative to the current zone, the high water
15838523fda3SJan Friedel  * point in undelivered audit records when audit generation will block.
15847c478bd9Sstevel@tonic-gate  */
15857c478bd9Sstevel@tonic-gate static void
15869e3700dfSgww do_getqhiwater(void)
15877c478bd9Sstevel@tonic-gate {
15887c478bd9Sstevel@tonic-gate 	struct au_qctrl qctrl;
15897c478bd9Sstevel@tonic-gate 
15908523fda3SJan Friedel 	if (!temporary_set) {
15918523fda3SJan Friedel 		if (!do_getqhiwater_scf(&qctrl.aq_hiwater)) {
15928523fda3SJan Friedel 			exit_error(gettext("Could not get configured value."));
15938523fda3SJan Friedel 		}
15948523fda3SJan Friedel 
15958523fda3SJan Friedel 		if (qctrl.aq_hiwater == 0) {
15968523fda3SJan Friedel 			(void) printf(gettext(
15978523fda3SJan Friedel 			    "no configured audit queue hiwater mark\n"));
15988523fda3SJan Friedel 		} else {
15998523fda3SJan Friedel 			(void) printf(gettext("configured audit queue "
16008523fda3SJan Friedel 			    "hiwater mark (records) = %d\n"), qctrl.aq_hiwater);
16018523fda3SJan Friedel 		}
16028523fda3SJan Friedel 	}
16038523fda3SJan Friedel 
16047c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
16058523fda3SJan Friedel 	(void) printf(gettext("active audit queue hiwater mark "
16068523fda3SJan Friedel 	    "(records) = %d\n"), qctrl.aq_hiwater);
16077c478bd9Sstevel@tonic-gate }
16087c478bd9Sstevel@tonic-gate 
16097c478bd9Sstevel@tonic-gate /*
16108523fda3SJan Friedel  * do_getqlowater() - print, relative to the current zone, the low water point
16118523fda3SJan Friedel  * in undelivered audit records where blocked processes will resume.
16127c478bd9Sstevel@tonic-gate  */
16137c478bd9Sstevel@tonic-gate static void
16149e3700dfSgww do_getqlowater(void)
16157c478bd9Sstevel@tonic-gate {
16167c478bd9Sstevel@tonic-gate 	struct au_qctrl qctrl;
16177c478bd9Sstevel@tonic-gate 
16188523fda3SJan Friedel 	if (!temporary_set) {
16198523fda3SJan Friedel 		if (!do_getqlowater_scf(&qctrl.aq_lowater)) {
16208523fda3SJan Friedel 			exit_error(gettext("Could not get configured value."));
16218523fda3SJan Friedel 		}
16228523fda3SJan Friedel 
16238523fda3SJan Friedel 		if (qctrl.aq_lowater == 0) {
16248523fda3SJan Friedel 			(void) printf(gettext(
16258523fda3SJan Friedel 			    "no configured audit queue lowater mark\n"));
16268523fda3SJan Friedel 		} else {
16278523fda3SJan Friedel 			(void) printf(gettext("configured audit queue "
16288523fda3SJan Friedel 			    "lowater mark (records) = %d\n"), qctrl.aq_lowater);
16298523fda3SJan Friedel 		}
16308523fda3SJan Friedel 	}
16318523fda3SJan Friedel 
16327c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
16338523fda3SJan Friedel 	(void) printf(gettext("active audit queue lowater mark "
16348523fda3SJan Friedel 	    "(records) = %d\n"), qctrl.aq_lowater);
16357c478bd9Sstevel@tonic-gate }
16367c478bd9Sstevel@tonic-gate 
16378523fda3SJan Friedel /*
16388523fda3SJan Friedel  * do_getasid() - print out the audit session-ID.
16398523fda3SJan Friedel  */
16407c478bd9Sstevel@tonic-gate static void
16419e3700dfSgww do_getasid(void)
16427c478bd9Sstevel@tonic-gate {
16437c478bd9Sstevel@tonic-gate 	auditinfo_addr_t ai;
16447c478bd9Sstevel@tonic-gate 
16457c478bd9Sstevel@tonic-gate 	if (getaudit_addr(&ai, sizeof (ai))) {
16467c478bd9Sstevel@tonic-gate 		exit_error(gettext("getaudit_addr(2) failed"));
16477c478bd9Sstevel@tonic-gate 	}
16487c478bd9Sstevel@tonic-gate 	print_asid(ai.ai_asid);
16497c478bd9Sstevel@tonic-gate }
16507c478bd9Sstevel@tonic-gate 
16517c478bd9Sstevel@tonic-gate /*
16528523fda3SJan Friedel  * do_getstat() - the printed statistics are for the entire system unless
16538523fda3SJan Friedel  * AUDIT_PERZONE is set.
16547c478bd9Sstevel@tonic-gate  */
16557c478bd9Sstevel@tonic-gate static void
16569e3700dfSgww do_getstat(void)
16577c478bd9Sstevel@tonic-gate {
16587c478bd9Sstevel@tonic-gate 	au_stat_t as;
16599e3700dfSgww 	int offset[12];   /* used to line the header up correctly */
16609e3700dfSgww 	char buf[512];
16617c478bd9Sstevel@tonic-gate 
16627c478bd9Sstevel@tonic-gate 	eauditon(A_GETSTAT, (caddr_t)&as, 0);
16639e3700dfSgww 	(void) sprintf(buf, "%4lu %n%4lu %n%4lu %n%4lu %n%4lu %n%4lu %n%4lu "
16649e3700dfSgww 	    "%n%4lu %n%4lu %n%4lu %n%4lu %n%4lu%n",
16659e3700dfSgww 	    (ulong_t)as.as_generated,	&(offset[0]),
16669e3700dfSgww 	    (ulong_t)as.as_nonattrib,	&(offset[1]),
16679e3700dfSgww 	    (ulong_t)as.as_kernel,	&(offset[2]),
16689e3700dfSgww 	    (ulong_t)as.as_audit,	&(offset[3]),
16699e3700dfSgww 	    (ulong_t)as.as_auditctl,	&(offset[4]),
16709e3700dfSgww 	    (ulong_t)as.as_enqueue,	&(offset[5]),
16719e3700dfSgww 	    (ulong_t)as.as_written,	&(offset[6]),
16729e3700dfSgww 	    (ulong_t)as.as_wblocked,	&(offset[7]),
16739e3700dfSgww 	    (ulong_t)as.as_rblocked,	&(offset[8]),
16749e3700dfSgww 	    (ulong_t)as.as_dropped,	&(offset[9]),
16759e3700dfSgww 	    (ulong_t)as.as_totalsize / ONEK, &(offset[10]),
16769e3700dfSgww 	    (ulong_t)as.as_memused / ONEK, &(offset[11]));
16779e3700dfSgww 
16789e3700dfSgww 	/*
16799e3700dfSgww 	 * TRANSLATION_NOTE
16809e3700dfSgww 	 *	Print a properly aligned header.
16819e3700dfSgww 	 */
16829e3700dfSgww 	(void) printf("%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s\n",
16838523fda3SJan Friedel 	    offset[0] - 1,		gettext("gen"),
16848523fda3SJan Friedel 	    offset[1] - offset[0] -1,	gettext("nona"),
16858523fda3SJan Friedel 	    offset[2] - offset[1] -1,	gettext("kern"),
16868523fda3SJan Friedel 	    offset[3] - offset[2] -1,	gettext("aud"),
16878523fda3SJan Friedel 	    offset[4] - offset[3] -1,	gettext("ctl"),
16888523fda3SJan Friedel 	    offset[5] - offset[4] -1,	gettext("enq"),
16898523fda3SJan Friedel 	    offset[6] - offset[5] -1,	gettext("wrtn"),
16908523fda3SJan Friedel 	    offset[7] - offset[6] -1,	gettext("wblk"),
16918523fda3SJan Friedel 	    offset[8] - offset[7] -1,	gettext("rblk"),
16928523fda3SJan Friedel 	    offset[9] - offset[8] -1,	gettext("drop"),
16938523fda3SJan Friedel 	    offset[10] - offset[9] -1,	gettext("tot"),
16948523fda3SJan Friedel 	    offset[11] - offset[10],	gettext("mem"));
16959e3700dfSgww 
16969e3700dfSgww 	(void) printf("%s\n", buf);
16977c478bd9Sstevel@tonic-gate }
16987c478bd9Sstevel@tonic-gate 
16998523fda3SJan Friedel /*
17008523fda3SJan Friedel  * do_gettermid() - print audit terminal ID for current process.
17018523fda3SJan Friedel  */
17027c478bd9Sstevel@tonic-gate static void
17039e3700dfSgww do_gettermid(void)
17047c478bd9Sstevel@tonic-gate {
17057c478bd9Sstevel@tonic-gate 	auditinfo_addr_t ai;
17067c478bd9Sstevel@tonic-gate 
17077c478bd9Sstevel@tonic-gate 	if (getaudit_addr(&ai, sizeof (ai))) {
17087c478bd9Sstevel@tonic-gate 		exit_error(gettext("getaudit_addr(2) failed"));
17097c478bd9Sstevel@tonic-gate 	}
17107c478bd9Sstevel@tonic-gate 	print_tid_ex(&ai.ai_termid);
17117c478bd9Sstevel@tonic-gate }
17127c478bd9Sstevel@tonic-gate 
17137c478bd9Sstevel@tonic-gate /*
17148523fda3SJan Friedel  * do_lsevent() - display the active kernel and user level audit event
17158523fda3SJan Friedel  * information. The printed events are for the global zone unless AUDIT_PERZONE
17168523fda3SJan Friedel  * is set.
17177c478bd9Sstevel@tonic-gate  */
17187c478bd9Sstevel@tonic-gate static void
17199e3700dfSgww do_lsevent(void)
17207c478bd9Sstevel@tonic-gate {
17217c478bd9Sstevel@tonic-gate 	register au_event_ent_t *evp;
17227c478bd9Sstevel@tonic-gate 	au_mask_t pmask;
17237c478bd9Sstevel@tonic-gate 	char auflags[256];
17247c478bd9Sstevel@tonic-gate 
17257c478bd9Sstevel@tonic-gate 	setauevent();
17269e3700dfSgww 	if (getauevent() == NULL) {
17278523fda3SJan Friedel 		exit_error(gettext("NO AUDIT EVENTS: Could not read %s\n."),
17288523fda3SJan Friedel 		    AUDITEVENTFILE);
17297c478bd9Sstevel@tonic-gate 	}
17307c478bd9Sstevel@tonic-gate 
17317c478bd9Sstevel@tonic-gate 	setauevent();
17329e3700dfSgww 	while ((evp = getauevent()) != NULL) {
17337c478bd9Sstevel@tonic-gate 		pmask.am_success = pmask.am_failure = evp->ae_class;
17347c478bd9Sstevel@tonic-gate 		if (getauditflagschar(auflags, &pmask, 0) == -1)
17357c478bd9Sstevel@tonic-gate 			(void) strcpy(auflags, "unknown");
1736d0fa49b7STony Nguyen 		(void) printf("%-30s %5hu %s %s\n",
17379e3700dfSgww 		    evp->ae_name, evp->ae_number, auflags, evp->ae_desc);
17387c478bd9Sstevel@tonic-gate 	}
17397c478bd9Sstevel@tonic-gate 	endauevent();
17407c478bd9Sstevel@tonic-gate }
17417c478bd9Sstevel@tonic-gate 
17427c478bd9Sstevel@tonic-gate /*
17438523fda3SJan Friedel  * do_lspolicy() - display the kernel audit policies with a description  of each
17448523fda3SJan Friedel  * policy. The printed value is for the global zone unless AUDIT_PERZONE is set.
17457c478bd9Sstevel@tonic-gate  */
17467c478bd9Sstevel@tonic-gate static void
17479e3700dfSgww do_lspolicy(void)
17487c478bd9Sstevel@tonic-gate {
17497c478bd9Sstevel@tonic-gate 	int i;
17507c478bd9Sstevel@tonic-gate 
17517c478bd9Sstevel@tonic-gate 	/*
17527c478bd9Sstevel@tonic-gate 	 * TRANSLATION_NOTE
17537c478bd9Sstevel@tonic-gate 	 *	Print a properly aligned header.
17547c478bd9Sstevel@tonic-gate 	 */
17557c478bd9Sstevel@tonic-gate 	(void) printf(gettext("policy string    description:\n"));
175645916cd2Sjpk 	for (i = 0; i < POLICY_TBL_SZ; i++) {
175745916cd2Sjpk 		(void) printf("%-17s%s\n", policy_table[i].policy_str,
175845916cd2Sjpk 		    gettext(policy_table[i].policy_desc));
175945916cd2Sjpk 	}
17607c478bd9Sstevel@tonic-gate }
17617c478bd9Sstevel@tonic-gate 
17628523fda3SJan Friedel /*
17638523fda3SJan Friedel  * do_setasid() - execute shell or cmd with specified session-ID.
17648523fda3SJan Friedel  */
17657c478bd9Sstevel@tonic-gate static void
17669e3700dfSgww do_setasid(char *sid_str, char **argv)
17677c478bd9Sstevel@tonic-gate {
17687c478bd9Sstevel@tonic-gate 	struct auditinfo_addr ai;
17697c478bd9Sstevel@tonic-gate 
17707c478bd9Sstevel@tonic-gate 	if (getaudit_addr(&ai, sizeof (ai))) {
17717c478bd9Sstevel@tonic-gate 		exit_error(gettext("getaudit_addr(2) failed"));
17727c478bd9Sstevel@tonic-gate 	}
17737c478bd9Sstevel@tonic-gate 	ai.ai_asid = (au_asid_t)atol(sid_str);
17747c478bd9Sstevel@tonic-gate 	if (setaudit_addr(&ai, sizeof (ai))) {
17757c478bd9Sstevel@tonic-gate 		exit_error(gettext("setaudit_addr(2) failed"));
17767c478bd9Sstevel@tonic-gate 	}
17777c478bd9Sstevel@tonic-gate 	execit(argv);
17787c478bd9Sstevel@tonic-gate }
17797c478bd9Sstevel@tonic-gate 
17808523fda3SJan Friedel /*
17818523fda3SJan Friedel  * do_setaudit() - execute shell or cmd with specified audit characteristics.
17828523fda3SJan Friedel  */
17837c478bd9Sstevel@tonic-gate static void
17849e3700dfSgww do_setaudit(char *user_str, char *mask_str, char *tid_str, char *sid_str,
17859e3700dfSgww     char **argv)
17867c478bd9Sstevel@tonic-gate {
17877c478bd9Sstevel@tonic-gate 	auditinfo_addr_t ai;
17887c478bd9Sstevel@tonic-gate 
17897c478bd9Sstevel@tonic-gate 	ai.ai_auid = (au_id_t)get_user_id(user_str);
1790f8994074SJan Friedel 	egetauditflagsbin(mask_str, &ai.ai_mask),
17918523fda3SJan Friedel 	    str2tid(tid_str, &ai.ai_termid);
17927c478bd9Sstevel@tonic-gate 	ai.ai_asid = (au_asid_t)atol(sid_str);
17937c478bd9Sstevel@tonic-gate 
17947c478bd9Sstevel@tonic-gate 	esetaudit(&ai, sizeof (ai));
17957c478bd9Sstevel@tonic-gate 	execit(argv);
17967c478bd9Sstevel@tonic-gate }
17977c478bd9Sstevel@tonic-gate 
17988523fda3SJan Friedel /*
17998523fda3SJan Friedel  * do_setauid() - execute shell or cmd with specified audit-ID.
18008523fda3SJan Friedel  */
18017c478bd9Sstevel@tonic-gate static void
18029e3700dfSgww do_setauid(char *user, char **argv)
18037c478bd9Sstevel@tonic-gate {
18047c478bd9Sstevel@tonic-gate 	au_id_t auid;
18057c478bd9Sstevel@tonic-gate 
18067c478bd9Sstevel@tonic-gate 	auid = get_user_id(user);
18077c478bd9Sstevel@tonic-gate 	esetauid(&auid);
18087c478bd9Sstevel@tonic-gate 	execit(argv);
18097c478bd9Sstevel@tonic-gate }
18107c478bd9Sstevel@tonic-gate 
18118523fda3SJan Friedel /*
18128523fda3SJan Friedel  * do_setpmask() - set the preselection mask of the specified process; valid
18138523fda3SJan Friedel  * per zone if AUDIT_PERZONE is set, else only in global zone.
18148523fda3SJan Friedel  */
18157c478bd9Sstevel@tonic-gate static void
1816f8994074SJan Friedel do_setpmask(char *pid_str, au_mask_t *mask)
18177c478bd9Sstevel@tonic-gate {
18187c478bd9Sstevel@tonic-gate 	struct auditpinfo ap;
18197c478bd9Sstevel@tonic-gate 
1820f8994074SJan Friedel 	if (strisnum(pid_str)) {
18217c478bd9Sstevel@tonic-gate 		ap.ap_pid = (pid_t)atoi(pid_str);
1822f8994074SJan Friedel 	} else {
18237c478bd9Sstevel@tonic-gate 		exit_usage(1);
1824f8994074SJan Friedel 	}
18257c478bd9Sstevel@tonic-gate 
1826f8994074SJan Friedel 	ap.ap_mask.am_success = mask->am_success;
1827f8994074SJan Friedel 	ap.ap_mask.am_failure = mask->am_failure;
18287c478bd9Sstevel@tonic-gate 
1829f8994074SJan Friedel 	eauditon(A_SETPMASK, (caddr_t)&ap, sizeof (ap));
18307c478bd9Sstevel@tonic-gate }
18317c478bd9Sstevel@tonic-gate 
18328523fda3SJan Friedel /*
18338523fda3SJan Friedel  * do_setsmask() - set the preselection mask of all processes with the specified
18348523fda3SJan Friedel  * audit session-ID; valid per zone if AUDIT_PERZONE is set, else only in global
18358523fda3SJan Friedel  * zone.
18368523fda3SJan Friedel  */
18377c478bd9Sstevel@tonic-gate static void
1838f8994074SJan Friedel do_setsmask(char *asid_str, au_mask_t *mask)
18397c478bd9Sstevel@tonic-gate {
18407c478bd9Sstevel@tonic-gate 	struct auditinfo ainfo;
18417c478bd9Sstevel@tonic-gate 
1842f8994074SJan Friedel 	if (strisnum(asid_str)) {
1843d0fa49b7STony Nguyen 		ainfo.ai_asid = (au_asid_t)atoi(asid_str);
1844f8994074SJan Friedel 	} else {
18457c478bd9Sstevel@tonic-gate 		exit_usage(1);
1846f8994074SJan Friedel 	}
18477c478bd9Sstevel@tonic-gate 
1848f8994074SJan Friedel 	ainfo.ai_mask.am_success = mask->am_success;
1849f8994074SJan Friedel 	ainfo.ai_mask.am_failure = mask->am_failure;
18507c478bd9Sstevel@tonic-gate 
1851f8994074SJan Friedel 	eauditon(A_SETSMASK, (caddr_t)&ainfo, sizeof (ainfo));
18527c478bd9Sstevel@tonic-gate }
18537c478bd9Sstevel@tonic-gate 
18548523fda3SJan Friedel /*
18558523fda3SJan Friedel  * do_setumask() -  set the preselection mask of all processes with the
18568523fda3SJan Friedel  * specified audit-ID; valid per zone if AUDIT_PERZONE is set, else only in
18578523fda3SJan Friedel  * global zone.
18588523fda3SJan Friedel  */
18597c478bd9Sstevel@tonic-gate static void
1860f8994074SJan Friedel do_setumask(char *auid_str, au_mask_t *mask)
18617c478bd9Sstevel@tonic-gate {
18627c478bd9Sstevel@tonic-gate 	struct auditinfo ainfo;
18637c478bd9Sstevel@tonic-gate 
1864f8994074SJan Friedel 	if (strisnum(auid_str)) {
1865d0fa49b7STony Nguyen 		ainfo.ai_auid = (au_id_t)atoi(auid_str);
1866f8994074SJan Friedel 	} else {
18677c478bd9Sstevel@tonic-gate 		exit_usage(1);
1868f8994074SJan Friedel 	}
18697c478bd9Sstevel@tonic-gate 
1870f8994074SJan Friedel 	ainfo.ai_mask.am_success = mask->am_success;
1871f8994074SJan Friedel 	ainfo.ai_mask.am_failure = mask->am_failure;
18727c478bd9Sstevel@tonic-gate 
1873f8994074SJan Friedel 	eauditon(A_SETUMASK, (caddr_t)&ainfo, sizeof (ainfo));
18747c478bd9Sstevel@tonic-gate }
18757c478bd9Sstevel@tonic-gate 
18767c478bd9Sstevel@tonic-gate /*
18778523fda3SJan Friedel  * do_setstat() - reset audit statistics counters; local zone use is valid if
18788523fda3SJan Friedel  * AUDIT_PERZONE is set, otherwise the syscall returns EPERM.
18797c478bd9Sstevel@tonic-gate  */
18807c478bd9Sstevel@tonic-gate static void
18819e3700dfSgww do_setstat(void)
18827c478bd9Sstevel@tonic-gate {
18837c478bd9Sstevel@tonic-gate 	au_stat_t as;
18847c478bd9Sstevel@tonic-gate 
18857c478bd9Sstevel@tonic-gate 	as.as_audit	= (uint_t)-1;
18867c478bd9Sstevel@tonic-gate 	as.as_auditctl	= (uint_t)-1;
18877c478bd9Sstevel@tonic-gate 	as.as_dropped	= (uint_t)-1;
18887c478bd9Sstevel@tonic-gate 	as.as_enqueue	= (uint_t)-1;
18897c478bd9Sstevel@tonic-gate 	as.as_generated	= (uint_t)-1;
18907c478bd9Sstevel@tonic-gate 	as.as_kernel	= (uint_t)-1;
18917c478bd9Sstevel@tonic-gate 	as.as_nonattrib	= (uint_t)-1;
18927c478bd9Sstevel@tonic-gate 	as.as_rblocked	= (uint_t)-1;
18937c478bd9Sstevel@tonic-gate 	as.as_totalsize	= (uint_t)-1;
18947c478bd9Sstevel@tonic-gate 	as.as_wblocked	= (uint_t)-1;
18957c478bd9Sstevel@tonic-gate 	as.as_written	= (uint_t)-1;
18967c478bd9Sstevel@tonic-gate 
1897f8994074SJan Friedel 	eauditon(A_SETSTAT, (caddr_t)&as, sizeof (as));
18989e3700dfSgww 	(void) printf("%s\n", gettext("audit stats reset"));
18997c478bd9Sstevel@tonic-gate }
19007c478bd9Sstevel@tonic-gate 
19017c478bd9Sstevel@tonic-gate /*
19028523fda3SJan Friedel  * do_setclass() - map the kernel event event_str to the classes specified by
1903f8994074SJan Friedel  * audit flags (mask); valid per zone if AUDIT_PERZONE is set, else only in
19048523fda3SJan Friedel  * global zone.
19057c478bd9Sstevel@tonic-gate  */
19067c478bd9Sstevel@tonic-gate static void
1907f8994074SJan Friedel do_setclass(char *event_str, au_mask_t *mask)
19087c478bd9Sstevel@tonic-gate {
19097c478bd9Sstevel@tonic-gate 	au_event_t event;
19107c478bd9Sstevel@tonic-gate 	au_evclass_map_t ec;
19117c478bd9Sstevel@tonic-gate 	au_event_ent_t *evp;
19127c478bd9Sstevel@tonic-gate 
1913f8994074SJan Friedel 	if (strisnum(event_str)) {
19147c478bd9Sstevel@tonic-gate 		event = (uint_t)atol(event_str);
1915f8994074SJan Friedel 	} else {
1916f8994074SJan Friedel 		if ((evp = egetauevnam(event_str)) != NULL) {
19177c478bd9Sstevel@tonic-gate 			event = evp->ae_number;
1918f8994074SJan Friedel 		}
19197c478bd9Sstevel@tonic-gate 	}
19207c478bd9Sstevel@tonic-gate 
19217c478bd9Sstevel@tonic-gate 	ec.ec_number = event;
1922f8994074SJan Friedel 	ec.ec_class = (mask->am_success | mask->am_failure);
1923f8994074SJan Friedel 
1924f8994074SJan Friedel 	eauditon(A_SETCLASS, (caddr_t)&ec, sizeof (ec));
19257c478bd9Sstevel@tonic-gate }
19267c478bd9Sstevel@tonic-gate 
19277c478bd9Sstevel@tonic-gate /*
1928f8994074SJan Friedel  * do_setflags() - set configured and active default user preselection masks;
1929f8994074SJan Friedel  * valid per zone if AUDIT_PERZONE is set, else only in global zone.
1930f8994074SJan Friedel  */
1931f8994074SJan Friedel static void
1932f8994074SJan Friedel do_setflags(char *audit_flags, au_mask_t *amask)
1933f8994074SJan Friedel {
1934f8994074SJan Friedel 	eauditon(A_SETAMASK, (caddr_t)amask, sizeof (*amask));
1935f8994074SJan Friedel 
1936f8994074SJan Friedel 	if (!do_setflags_scf(audit_flags)) {
1937f8994074SJan Friedel 		print_mask(gettext("active user default audit flags"), amask);
1938f8994074SJan Friedel 		exit_error(gettext("Could not store configuration value."));
1939f8994074SJan Friedel 	}
1940f8994074SJan Friedel 	print_mask(gettext("user default audit flags"), amask);
1941f8994074SJan Friedel }
1942f8994074SJan Friedel 
1943f8994074SJan Friedel /*
1944f8994074SJan Friedel  * do_setkmask() - set non-attributable audit flags of machine; valid per zone
19458523fda3SJan Friedel  * if AUDIT_PERZONE is set, else only in global zone.
19467c478bd9Sstevel@tonic-gate  */
19477c478bd9Sstevel@tonic-gate static void
1948f8994074SJan Friedel do_setkmask(au_mask_t *pmask)
19497c478bd9Sstevel@tonic-gate {
1950f8994074SJan Friedel 	eauditon(A_SETKMASK, (caddr_t)pmask, sizeof (*pmask));
1951f8994074SJan Friedel 	print_mask(gettext("active non-attributable audit flags"), pmask);
1952f8994074SJan Friedel }
19537c478bd9Sstevel@tonic-gate 
1954f8994074SJan Friedel /*
1955f8994074SJan Friedel  * do_setnaflags() - set configured and active non-attributable selection flags
1956f8994074SJan Friedel  * of machine; valid per zone if AUDIT_PERZONE is set, else only in global zone.
1957f8994074SJan Friedel  */
1958f8994074SJan Friedel static void
1959f8994074SJan Friedel do_setnaflags(char *audit_naflags, au_mask_t *namask)
1960f8994074SJan Friedel {
1961f8994074SJan Friedel 	eauditon(A_SETKMASK, (caddr_t)namask, sizeof (*namask));
1962f8994074SJan Friedel 
1963f8994074SJan Friedel 	if (!do_setnaflags_scf(audit_naflags)) {
1964f8994074SJan Friedel 		print_mask(
1965f8994074SJan Friedel 		    gettext("active non-attributable audit flags"), namask);
1966f8994074SJan Friedel 		exit_error(gettext("Could not store configuration value."));
1967f8994074SJan Friedel 	}
1968f8994074SJan Friedel 	print_mask(gettext("non-attributable audit flags"), namask);
1969f8994074SJan Friedel }
1970f8994074SJan Friedel 
1971f8994074SJan Friedel /*
1972f8994074SJan Friedel  * do_setplugin() - set the given plugin plugin_str configuration values.
1973f8994074SJan Friedel  */
1974f8994074SJan Friedel static void
1975f8994074SJan Friedel do_setplugin(char *plugin_str, boolean_t plugin_state, char *plugin_attr,
1976f8994074SJan Friedel     int plugin_qsize)
1977f8994074SJan Friedel {
1978f8994074SJan Friedel 	if (!do_setpluginconfig_scf(plugin_str, plugin_state, plugin_attr,
1979f8994074SJan Friedel 	    plugin_qsize)) {
1980f8994074SJan Friedel 		exit_error(gettext("Could not set plugin configuration."));
1981f8994074SJan Friedel 	}
19827c478bd9Sstevel@tonic-gate }
19837c478bd9Sstevel@tonic-gate 
19847c478bd9Sstevel@tonic-gate /*
19858523fda3SJan Friedel  * do_setpolicy() - set the active and configured kernel audit policy; active
19868523fda3SJan Friedel  * values can be changed per zone if AUDIT_PERZONE is set, else only in global
19878523fda3SJan Friedel  * zone.
19888523fda3SJan Friedel  *
19898523fda3SJan Friedel  * ahlt and perzone are global zone only. The kernel ensures that a local zone
19908523fda3SJan Friedel  * can't change ahlt and perzone (EINVAL).
19917c478bd9Sstevel@tonic-gate  */
19927c478bd9Sstevel@tonic-gate static void
19939e3700dfSgww do_setpolicy(char *policy_str)
19947c478bd9Sstevel@tonic-gate {
19958523fda3SJan Friedel 	uint32_t	policy = 0;
19967c478bd9Sstevel@tonic-gate 
19977c478bd9Sstevel@tonic-gate 	switch (str2policy(policy_str, &policy)) {
19988523fda3SJan Friedel 	case 0:
19998523fda3SJan Friedel 		if (!temporary_set) {
20008523fda3SJan Friedel 			if (!do_getpolicy_scf(&policy)) {
20018523fda3SJan Friedel 				exit_error(gettext("Unable to get current "
20028523fda3SJan Friedel 				    "policy values from the SMF repository"));
20038523fda3SJan Friedel 			}
20048523fda3SJan Friedel 			(void) str2policy(policy_str, &policy);
20058523fda3SJan Friedel 
20068523fda3SJan Friedel 			if (!do_setpolicy_scf(policy)) {
20078523fda3SJan Friedel 				exit_error(gettext("Could not store "
20088523fda3SJan Friedel 				    "configuration values."));
20098523fda3SJan Friedel 			}
20108523fda3SJan Friedel 		}
20118523fda3SJan Friedel 		eauditon(A_SETPOLICY, (caddr_t)&policy, 0);
20128523fda3SJan Friedel 		break;
20137c478bd9Sstevel@tonic-gate 	case 2:
20148523fda3SJan Friedel 		exit_error(gettext("policy (%s) invalid in a local zone."),
20158523fda3SJan Friedel 		    policy_str);
20167c478bd9Sstevel@tonic-gate 		break;
20177c478bd9Sstevel@tonic-gate 	default:
20188523fda3SJan Friedel 		exit_error(gettext("Invalid policy (%s) specified."),
20197c478bd9Sstevel@tonic-gate 		    policy_str);
20207c478bd9Sstevel@tonic-gate 		break;
20217c478bd9Sstevel@tonic-gate 	}
20227c478bd9Sstevel@tonic-gate }
20237c478bd9Sstevel@tonic-gate 
20247c478bd9Sstevel@tonic-gate /*
20258523fda3SJan Friedel  * do_setqbufsz() - set the active and configured audit queue write buffer size
20268523fda3SJan Friedel  * (bytes); active values can be changed per zone if AUDIT_PERZONE is set, else
20278523fda3SJan Friedel  * only in global zone.
20287c478bd9Sstevel@tonic-gate  */
20297c478bd9Sstevel@tonic-gate static void
20309e3700dfSgww do_setqbufsz(char *bufsz)
20317c478bd9Sstevel@tonic-gate {
20327c478bd9Sstevel@tonic-gate 	struct au_qctrl qctrl;
20337c478bd9Sstevel@tonic-gate 
20348523fda3SJan Friedel 	if (!temporary_set) {
20358523fda3SJan Friedel 		qctrl.aq_bufsz = (size_t)atol(bufsz);
20368523fda3SJan Friedel 		if (!do_setqbufsz_scf(&qctrl.aq_bufsz)) {
20378523fda3SJan Friedel 			exit_error(gettext(
20388523fda3SJan Friedel 			    "Could not store configuration value."));
20398523fda3SJan Friedel 		}
2040be61b9faSJan Friedel 		if (qctrl.aq_bufsz == 0) {
2041be61b9faSJan Friedel 			return;
2042be61b9faSJan Friedel 		}
20438523fda3SJan Friedel 	}
20448523fda3SJan Friedel 
20457c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
20468523fda3SJan Friedel 	qctrl.aq_bufsz = (size_t)atol(bufsz);
20477c478bd9Sstevel@tonic-gate 	eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0);
20487c478bd9Sstevel@tonic-gate }
20497c478bd9Sstevel@tonic-gate 
20507c478bd9Sstevel@tonic-gate /*
20518523fda3SJan Friedel  * do_setqctrl() - set the active and configured audit queue write buffer size
20528523fda3SJan Friedel  * (bytes), hiwater audit record count, lowater audit record count, and wakeup
20538523fda3SJan Friedel  * interval (ticks); active values can be changed per zone if AUDIT_PERZONE is
20548523fda3SJan Friedel  * set, else only in global zone.
20557c478bd9Sstevel@tonic-gate  */
20567c478bd9Sstevel@tonic-gate static void
20579e3700dfSgww do_setqctrl(char *hiwater, char *lowater, char *bufsz, char *delay)
20587c478bd9Sstevel@tonic-gate {
20598523fda3SJan Friedel 	struct au_qctrl	qctrl;
20608523fda3SJan Friedel 
20618523fda3SJan Friedel 	qctrl.aq_hiwater = (size_t)atol(hiwater);
20628523fda3SJan Friedel 	qctrl.aq_lowater = (size_t)atol(lowater);
20638523fda3SJan Friedel 	qctrl.aq_bufsz = (size_t)atol(bufsz);
20648523fda3SJan Friedel 	qctrl.aq_delay = (clock_t)atol(delay);
20658523fda3SJan Friedel 
20668523fda3SJan Friedel 	if (!temporary_set) {
2067be61b9faSJan Friedel 		struct au_qctrl qctrl_act;
2068be61b9faSJan Friedel 
20698523fda3SJan Friedel 		if (!do_setqctrl_scf(&qctrl)) {
20708523fda3SJan Friedel 			exit_error(gettext(
20718523fda3SJan Friedel 			    "Could not store configuration values."));
20728523fda3SJan Friedel 		}
2073be61b9faSJan Friedel 
2074be61b9faSJan Friedel 		eauditon(A_GETQCTRL, (caddr_t)&qctrl_act, 0);
2075be61b9faSJan Friedel 		if (qctrl.aq_hiwater == 0) {
2076be61b9faSJan Friedel 			qctrl.aq_hiwater = qctrl_act.aq_hiwater;
2077be61b9faSJan Friedel 		}
2078be61b9faSJan Friedel 		if (qctrl.aq_lowater == 0) {
2079be61b9faSJan Friedel 			qctrl.aq_lowater = qctrl_act.aq_lowater;
2080be61b9faSJan Friedel 		}
2081be61b9faSJan Friedel 		if (qctrl.aq_bufsz == 0) {
2082be61b9faSJan Friedel 			qctrl.aq_bufsz = qctrl_act.aq_bufsz;
2083be61b9faSJan Friedel 		}
2084be61b9faSJan Friedel 		if (qctrl.aq_delay == 0) {
2085be61b9faSJan Friedel 			qctrl.aq_delay = qctrl_act.aq_delay;
2086be61b9faSJan Friedel 		}
20878523fda3SJan Friedel 	}
20887c478bd9Sstevel@tonic-gate 
20897c478bd9Sstevel@tonic-gate 	eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0);
20907c478bd9Sstevel@tonic-gate }
20917c478bd9Sstevel@tonic-gate 
20927c478bd9Sstevel@tonic-gate /*
20938523fda3SJan Friedel  * do_setqdelay() - set the active and configured audit queue wakeup interval
20948523fda3SJan Friedel  * (ticks); active values can be changed per zone if AUDIT_PERZONE is set, else
20958523fda3SJan Friedel  * only in global zone.
20967c478bd9Sstevel@tonic-gate  */
20977c478bd9Sstevel@tonic-gate static void
20989e3700dfSgww do_setqdelay(char *delay)
20997c478bd9Sstevel@tonic-gate {
21007c478bd9Sstevel@tonic-gate 	struct au_qctrl qctrl;
21017c478bd9Sstevel@tonic-gate 
21028523fda3SJan Friedel 	if (!temporary_set) {
21038523fda3SJan Friedel 		qctrl.aq_delay = (clock_t)atol(delay);
21048523fda3SJan Friedel 		if (!do_setqdelay_scf(&qctrl.aq_delay)) {
21058523fda3SJan Friedel 			exit_error(gettext(
21068523fda3SJan Friedel 			    "Could not store configuration value."));
21078523fda3SJan Friedel 		}
2108be61b9faSJan Friedel 		if (qctrl.aq_delay == 0) {
2109be61b9faSJan Friedel 			return;
2110be61b9faSJan Friedel 		}
21118523fda3SJan Friedel 	}
21128523fda3SJan Friedel 
21137c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
21148523fda3SJan Friedel 	qctrl.aq_delay = (clock_t)atol(delay);
21157c478bd9Sstevel@tonic-gate 	eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0);
21167c478bd9Sstevel@tonic-gate }
21177c478bd9Sstevel@tonic-gate 
21187c478bd9Sstevel@tonic-gate /*
21198523fda3SJan Friedel  * do_setqhiwater() - sets the active and configured number of undelivered audit
21208523fda3SJan Friedel  * records in the audit queue at which audit record generation blocks; active
21218523fda3SJan Friedel  * values can be changed per zone if AUDIT_PERZONE is set, else only in global
21228523fda3SJan Friedel  * zone.
21237c478bd9Sstevel@tonic-gate  */
21247c478bd9Sstevel@tonic-gate static void
21259e3700dfSgww do_setqhiwater(char *hiwater)
21267c478bd9Sstevel@tonic-gate {
21277c478bd9Sstevel@tonic-gate 	struct au_qctrl qctrl;
21287c478bd9Sstevel@tonic-gate 
21298523fda3SJan Friedel 	if (!temporary_set) {
21308523fda3SJan Friedel 		qctrl.aq_hiwater = (size_t)atol(hiwater);
21318523fda3SJan Friedel 		if (!do_setqhiwater_scf(&qctrl.aq_hiwater)) {
21328523fda3SJan Friedel 			exit_error(gettext(
21338523fda3SJan Friedel 			    "Could not store configuration value."));
21348523fda3SJan Friedel 		}
2135be61b9faSJan Friedel 		if (qctrl.aq_hiwater == 0) {
2136be61b9faSJan Friedel 			return;
2137be61b9faSJan Friedel 		}
21388523fda3SJan Friedel 	}
21398523fda3SJan Friedel 
21407c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
21418523fda3SJan Friedel 	qctrl.aq_hiwater = (size_t)atol(hiwater);
21427c478bd9Sstevel@tonic-gate 	eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0);
21437c478bd9Sstevel@tonic-gate }
21447c478bd9Sstevel@tonic-gate 
21457c478bd9Sstevel@tonic-gate /*
21468523fda3SJan Friedel  * do_setqlowater() - set the active and configured number of undelivered audit
21478523fda3SJan Friedel  * records in the audit queue at which blocked auditing processes unblock;
21488523fda3SJan Friedel  * active values can be changed per zone if AUDIT_PERZONE is set, else only in
21498523fda3SJan Friedel  * global zone.
21507c478bd9Sstevel@tonic-gate  */
21517c478bd9Sstevel@tonic-gate static void
21529e3700dfSgww do_setqlowater(char *lowater)
21537c478bd9Sstevel@tonic-gate {
21547c478bd9Sstevel@tonic-gate 	struct au_qctrl qctrl;
21557c478bd9Sstevel@tonic-gate 
21568523fda3SJan Friedel 	if (!temporary_set) {
21578523fda3SJan Friedel 		qctrl.aq_lowater = (size_t)atol(lowater);
21588523fda3SJan Friedel 		if (!do_setqlowater_scf(&qctrl.aq_lowater)) {
21598523fda3SJan Friedel 			exit_error(gettext(
21608523fda3SJan Friedel 			    "Could not store configuration value."));
21618523fda3SJan Friedel 		}
2162be61b9faSJan Friedel 		if (qctrl.aq_lowater == 0) {
2163be61b9faSJan Friedel 			return;
2164be61b9faSJan Friedel 		}
21658523fda3SJan Friedel 	}
21668523fda3SJan Friedel 
21677c478bd9Sstevel@tonic-gate 	eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0);
21688523fda3SJan Friedel 	qctrl.aq_lowater = (size_t)atol(lowater);
21697c478bd9Sstevel@tonic-gate 	eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0);
21707c478bd9Sstevel@tonic-gate }
21717c478bd9Sstevel@tonic-gate 
21727c478bd9Sstevel@tonic-gate static void
21739e3700dfSgww eauditon(int cmd, caddr_t data, int length)
21747c478bd9Sstevel@tonic-gate {
21757c478bd9Sstevel@tonic-gate 	if (auditon(cmd, data, length) == -1)
21767c478bd9Sstevel@tonic-gate 		exit_error(gettext("auditon(2) failed."));
21777c478bd9Sstevel@tonic-gate }
21787c478bd9Sstevel@tonic-gate 
21797c478bd9Sstevel@tonic-gate static void
21809e3700dfSgww egetauid(au_id_t *auid)
21817c478bd9Sstevel@tonic-gate {
21827c478bd9Sstevel@tonic-gate 	if (getauid(auid) == -1)
21837c478bd9Sstevel@tonic-gate 		exit_error(gettext("getauid(2) failed."));
21847c478bd9Sstevel@tonic-gate }
21857c478bd9Sstevel@tonic-gate 
21867c478bd9Sstevel@tonic-gate static void
21879e3700dfSgww egetaudit(auditinfo_addr_t *ai, int size)
21887c478bd9Sstevel@tonic-gate {
21897c478bd9Sstevel@tonic-gate 	if (getaudit_addr(ai, size) == -1)
21907c478bd9Sstevel@tonic-gate 		exit_error(gettext("getaudit_addr(2) failed."));
21917c478bd9Sstevel@tonic-gate }
21927c478bd9Sstevel@tonic-gate 
21937c478bd9Sstevel@tonic-gate static void
21949e3700dfSgww egetkaudit(auditinfo_addr_t *ai, int size)
21957c478bd9Sstevel@tonic-gate {
21967c478bd9Sstevel@tonic-gate 	if (auditon(A_GETKAUDIT, (char *)ai, size) < 0)
21977c478bd9Sstevel@tonic-gate 		exit_error(gettext("auditon: A_GETKAUDIT failed."));
21987c478bd9Sstevel@tonic-gate }
21997c478bd9Sstevel@tonic-gate 
22007c478bd9Sstevel@tonic-gate static void
22019e3700dfSgww esetkaudit(auditinfo_addr_t *ai, int size)
22027c478bd9Sstevel@tonic-gate {
22037c478bd9Sstevel@tonic-gate 	if (auditon(A_SETKAUDIT, (char *)ai, size) < 0)
22047c478bd9Sstevel@tonic-gate 		exit_error(gettext("auditon: A_SETKAUDIT failed."));
22057c478bd9Sstevel@tonic-gate }
22067c478bd9Sstevel@tonic-gate 
22077c478bd9Sstevel@tonic-gate static void
22089e3700dfSgww egetauditflagsbin(char *auditflags, au_mask_t *pmask)
22097c478bd9Sstevel@tonic-gate {
2210f8994074SJan Friedel 	if (strcmp(auditflags, "none") == 0) {
2211f8994074SJan Friedel 		pmask->am_success = pmask->am_failure = 0;
22127c478bd9Sstevel@tonic-gate 		return;
2213f8994074SJan Friedel 	}
22147c478bd9Sstevel@tonic-gate 
22157c478bd9Sstevel@tonic-gate 	if (getauditflagsbin(auditflags, pmask) < 0) {
22167c478bd9Sstevel@tonic-gate 		exit_error(gettext("Could not get audit flags (%s)"),
22179e3700dfSgww 		    auditflags);
22187c478bd9Sstevel@tonic-gate 	}
22197c478bd9Sstevel@tonic-gate }
22207c478bd9Sstevel@tonic-gate 
2221f8994074SJan Friedel static void
2222f8994074SJan Friedel echkflags(char *auditflags, au_mask_t *mask)
2223f8994074SJan Friedel {
2224f8994074SJan Friedel 	char		*err = "";
2225f8994074SJan Friedel 	char		*err_ptr;
2226f8994074SJan Friedel 
2227f8994074SJan Friedel 	if (!__chkflags(auditflags, mask, B_FALSE, &err)) {
2228f8994074SJan Friedel 		err_ptr = err;
2229f8994074SJan Friedel 		while (*err_ptr != ',' && *err_ptr != '\0') {
2230f8994074SJan Friedel 			err_ptr++;
2231f8994074SJan Friedel 		}
2232f8994074SJan Friedel 		*err_ptr = '\0';
2233f8994074SJan Friedel 		exit_error(gettext("Unknown audit flags and/or prefixes "
2234f8994074SJan Friedel 		    "encountered: %s"), err);
2235f8994074SJan Friedel 	}
2236f8994074SJan Friedel }
2237f8994074SJan Friedel 
22387c478bd9Sstevel@tonic-gate static au_event_ent_t *
22399e3700dfSgww egetauevnum(au_event_t event_number)
22407c478bd9Sstevel@tonic-gate {
22417c478bd9Sstevel@tonic-gate 	au_event_ent_t *evp;
22427c478bd9Sstevel@tonic-gate 
22439e3700dfSgww 	if ((evp = getauevnum(event_number)) == NULL) {
2244d0fa49b7STony Nguyen 		exit_error(gettext("Could not get audit event %hu"),
22459e3700dfSgww 		    event_number);
22469e3700dfSgww 	}
22477c478bd9Sstevel@tonic-gate 
22487c478bd9Sstevel@tonic-gate 	return (evp);
22497c478bd9Sstevel@tonic-gate }
22507c478bd9Sstevel@tonic-gate 
22517c478bd9Sstevel@tonic-gate static au_event_ent_t *
22529e3700dfSgww egetauevnam(char *event_name)
22537c478bd9Sstevel@tonic-gate {
22547c478bd9Sstevel@tonic-gate 	register au_event_ent_t *evp;
22557c478bd9Sstevel@tonic-gate 
22569e3700dfSgww 	if ((evp = getauevnam(event_name)) == NULL)
22577c478bd9Sstevel@tonic-gate 		exit_error(gettext("Could not get audit event %s"), event_name);
22587c478bd9Sstevel@tonic-gate 
22597c478bd9Sstevel@tonic-gate 	return (evp);
22607c478bd9Sstevel@tonic-gate }
22617c478bd9Sstevel@tonic-gate 
22627c478bd9Sstevel@tonic-gate static void
22639e3700dfSgww esetauid(au_id_t *auid)
22647c478bd9Sstevel@tonic-gate {
22657c478bd9Sstevel@tonic-gate 	if (setauid(auid) == -1)
22667c478bd9Sstevel@tonic-gate 		exit_error(gettext("setauid(2) failed."));
22677c478bd9Sstevel@tonic-gate }
22687c478bd9Sstevel@tonic-gate 
22697c478bd9Sstevel@tonic-gate static void
22709e3700dfSgww esetaudit(auditinfo_addr_t *ai, int size)
22717c478bd9Sstevel@tonic-gate {
22727c478bd9Sstevel@tonic-gate 	if (setaudit_addr(ai, size) == -1)
22737c478bd9Sstevel@tonic-gate 		exit_error(gettext("setaudit_addr(2) failed."));
22747c478bd9Sstevel@tonic-gate }
22757c478bd9Sstevel@tonic-gate 
22767c478bd9Sstevel@tonic-gate static uid_t
22779e3700dfSgww get_user_id(char *user)
22787c478bd9Sstevel@tonic-gate {
22797c478bd9Sstevel@tonic-gate 	struct passwd *pwd;
22807c478bd9Sstevel@tonic-gate 	uid_t uid;
22817c478bd9Sstevel@tonic-gate 
22827c478bd9Sstevel@tonic-gate 	if (isdigit(*user)) {
22837c478bd9Sstevel@tonic-gate 		uid = atoi(user);
22849e3700dfSgww 		if ((pwd = getpwuid(uid)) == NULL) {
22857c478bd9Sstevel@tonic-gate 			exit_error(gettext("Invalid user: %s"), user);
22867c478bd9Sstevel@tonic-gate 		}
22877c478bd9Sstevel@tonic-gate 	} else {
22889e3700dfSgww 		if ((pwd = getpwnam(user)) == NULL) {
22897c478bd9Sstevel@tonic-gate 			exit_error(gettext("Invalid user: %s"), user);
22907c478bd9Sstevel@tonic-gate 		}
22917c478bd9Sstevel@tonic-gate 	}
22927c478bd9Sstevel@tonic-gate 
22937c478bd9Sstevel@tonic-gate 	return (pwd->pw_uid);
22947c478bd9Sstevel@tonic-gate }
22957c478bd9Sstevel@tonic-gate 
22967c478bd9Sstevel@tonic-gate /*
22977c478bd9Sstevel@tonic-gate  * get_arg_ent()
22987c478bd9Sstevel@tonic-gate  *     Inputs: command line argument string
22998523fda3SJan Friedel  *     Returns ptr to struct arg_entry if found; null, if not found
23007c478bd9Sstevel@tonic-gate  */
23018523fda3SJan Friedel static arg_entry_t *
23029e3700dfSgww get_arg_ent(char *arg_str)
23037c478bd9Sstevel@tonic-gate {
23048523fda3SJan Friedel 	arg_entry_t key;
23057c478bd9Sstevel@tonic-gate 
23067c478bd9Sstevel@tonic-gate 	key.arg_str = arg_str;
23077c478bd9Sstevel@tonic-gate 
23088523fda3SJan Friedel 	return ((arg_entry_t *)bsearch((char *)&key, (char *)arg_table,
23098523fda3SJan Friedel 	    ARG_TBL_SZ, sizeof (arg_entry_t), arg_ent_compare));
23107c478bd9Sstevel@tonic-gate }
23117c478bd9Sstevel@tonic-gate 
23127c478bd9Sstevel@tonic-gate /*
23137c478bd9Sstevel@tonic-gate  * arg_ent_compare()
23147c478bd9Sstevel@tonic-gate  *     Compares two command line arguments to determine which is
23157c478bd9Sstevel@tonic-gate  *       lexicographically greater.
23167c478bd9Sstevel@tonic-gate  *     Inputs: two argument map table entry pointers
23177c478bd9Sstevel@tonic-gate  *     Returns: > 1: aep1->arg_str > aep2->arg_str
23187c478bd9Sstevel@tonic-gate  *              < 1: aep1->arg_str < aep2->arg_str
23197c478bd9Sstevel@tonic-gate  *                0: aep1->arg_str = aep->arg_str2
23207c478bd9Sstevel@tonic-gate  */
23217c478bd9Sstevel@tonic-gate static int
23229e3700dfSgww arg_ent_compare(const void *aep1, const void *aep2)
23237c478bd9Sstevel@tonic-gate {
23248523fda3SJan Friedel 	return (strcmp(((arg_entry_t *)aep1)->arg_str,
23258523fda3SJan Friedel 	    ((arg_entry_t *)aep2)->arg_str));
23267c478bd9Sstevel@tonic-gate }
23277c478bd9Sstevel@tonic-gate 
23287c478bd9Sstevel@tonic-gate /*
23297c478bd9Sstevel@tonic-gate  * tid_str is major,minor,host  -- host is a name or an ip address
23307c478bd9Sstevel@tonic-gate  */
23317c478bd9Sstevel@tonic-gate static void
23327c478bd9Sstevel@tonic-gate str2tid(char *tid_str, au_tid_addr_t *tp)
23337c478bd9Sstevel@tonic-gate {
23349e3700dfSgww 	char *major_str;
23359e3700dfSgww 	char *minor_str;
23369e3700dfSgww 	char *host_str = NULL;
23377c478bd9Sstevel@tonic-gate 	major_t major = 0;
23387c478bd9Sstevel@tonic-gate 	major_t minor = 0;
23397c478bd9Sstevel@tonic-gate 	dev_t dev = 0;
23407c478bd9Sstevel@tonic-gate 	struct hostent *phe;
23417c478bd9Sstevel@tonic-gate 	int err;
23427c478bd9Sstevel@tonic-gate 	uint32_t ibuf;
23437c478bd9Sstevel@tonic-gate 	uint32_t ibuf6[4];
23447c478bd9Sstevel@tonic-gate 
23457c478bd9Sstevel@tonic-gate 	tp->at_port = 0;
23467c478bd9Sstevel@tonic-gate 	tp->at_type = 0;
23477c478bd9Sstevel@tonic-gate 	bzero(tp->at_addr, 16);
23487c478bd9Sstevel@tonic-gate 
23497c478bd9Sstevel@tonic-gate 	major_str = tid_str;
23507c478bd9Sstevel@tonic-gate 	if ((minor_str = strchr(tid_str, ',')) != NULL) {
23517c478bd9Sstevel@tonic-gate 		*minor_str = '\0';
23527c478bd9Sstevel@tonic-gate 		minor_str++;
23537c478bd9Sstevel@tonic-gate 	}
23547c478bd9Sstevel@tonic-gate 
23559e3700dfSgww 	if (minor_str) {
23567c478bd9Sstevel@tonic-gate 		if ((host_str = strchr(minor_str, ',')) != NULL) {
23577c478bd9Sstevel@tonic-gate 			*host_str = '\0';
23587c478bd9Sstevel@tonic-gate 			host_str++;
23597c478bd9Sstevel@tonic-gate 		}
23609e3700dfSgww 	}
23617c478bd9Sstevel@tonic-gate 
23627c478bd9Sstevel@tonic-gate 	if (major_str)
23637c478bd9Sstevel@tonic-gate 		major = (major_t)atoi(major_str);
23647c478bd9Sstevel@tonic-gate 
23657c478bd9Sstevel@tonic-gate 	if (minor_str)
23667c478bd9Sstevel@tonic-gate 		minor = (minor_t)atoi(minor_str);
23677c478bd9Sstevel@tonic-gate 
23687c478bd9Sstevel@tonic-gate 	if ((dev = makedev(major, minor)) != NODEV)
23697c478bd9Sstevel@tonic-gate 		tp->at_port = dev;
23707c478bd9Sstevel@tonic-gate 
23717c478bd9Sstevel@tonic-gate 	if (host_str) {
23727c478bd9Sstevel@tonic-gate 		if (strisipaddr(host_str)) {
23739e3700dfSgww 			if (inet_pton(AF_INET, host_str, &ibuf)) {
23749e3700dfSgww 				tp->at_addr[0] = ibuf;
23759e3700dfSgww 				tp->at_type = AU_IPv4;
23769e3700dfSgww 			} else if (inet_pton(AF_INET6, host_str, ibuf6)) {
23779e3700dfSgww 				tp->at_addr[0] = ibuf6[0];
23789e3700dfSgww 				tp->at_addr[1] = ibuf6[1];
23799e3700dfSgww 				tp->at_addr[2] = ibuf6[2];
23809e3700dfSgww 				tp->at_addr[3] = ibuf6[3];
23819e3700dfSgww 				tp->at_type = AU_IPv6;
23829e3700dfSgww 			}
23837c478bd9Sstevel@tonic-gate 		} else {
23847c478bd9Sstevel@tonic-gate 			phe = getipnodebyname((const void *)host_str,
23859e3700dfSgww 			    AF_INET, 0, &err);
23867c478bd9Sstevel@tonic-gate 			if (phe == 0) {
23877c478bd9Sstevel@tonic-gate 				phe = getipnodebyname((const void *)host_str,
23889e3700dfSgww 				    AF_INET6, 0, &err);
23897c478bd9Sstevel@tonic-gate 			}
23907c478bd9Sstevel@tonic-gate 
23917c478bd9Sstevel@tonic-gate 			if (phe != NULL) {
23927c478bd9Sstevel@tonic-gate 				if (phe->h_addrtype == AF_INET6) {
23937c478bd9Sstevel@tonic-gate 					/* address is IPv6 (128 bits) */
23947c478bd9Sstevel@tonic-gate 					(void) memcpy(&tp->at_addr[0],
23959e3700dfSgww 					    phe->h_addr_list[0], 16);
23967c478bd9Sstevel@tonic-gate 					tp->at_type = AU_IPv6;
23977c478bd9Sstevel@tonic-gate 				} else {
23987c478bd9Sstevel@tonic-gate 					/* address is IPv4 (32 bits) */
23997c478bd9Sstevel@tonic-gate 					(void) memcpy(&tp->at_addr[0],
24009e3700dfSgww 					    phe->h_addr_list[0], 4);
24017c478bd9Sstevel@tonic-gate 					tp->at_type = AU_IPv4;
24027c478bd9Sstevel@tonic-gate 				}
24037c478bd9Sstevel@tonic-gate 				freehostent(phe);
24047c478bd9Sstevel@tonic-gate 			}
24057c478bd9Sstevel@tonic-gate 		}
24067c478bd9Sstevel@tonic-gate 	}
24077c478bd9Sstevel@tonic-gate }
24087c478bd9Sstevel@tonic-gate 
24099e3700dfSgww static char *
24109e3700dfSgww cond2str(void)
24117c478bd9Sstevel@tonic-gate {
24129e3700dfSgww 	uint_t cond;
24137c478bd9Sstevel@tonic-gate 
2414f8994074SJan Friedel 	eauditon(A_GETCOND, (caddr_t)&cond, sizeof (cond));
24157c478bd9Sstevel@tonic-gate 
24169e3700dfSgww 	switch (cond) {
24177c478bd9Sstevel@tonic-gate 
24189e3700dfSgww 	case AUC_AUDITING:
24199e3700dfSgww 		return ("auditing");
24207c478bd9Sstevel@tonic-gate 
24219e3700dfSgww 	case AUC_NOAUDIT:
24229e3700dfSgww 	case AUC_INIT_AUDIT:
24239e3700dfSgww 		return ("noaudit");
24247c478bd9Sstevel@tonic-gate 
24259e3700dfSgww 	case AUC_UNSET:
24269e3700dfSgww 		return ("unset");
24279e3700dfSgww 
24289e3700dfSgww 	case AUC_NOSPACE:
24299e3700dfSgww 		return ("nospace");
24309e3700dfSgww 
24319e3700dfSgww 	default:
24329e3700dfSgww 		return ("");
24339e3700dfSgww 	}
24347c478bd9Sstevel@tonic-gate }
24357c478bd9Sstevel@tonic-gate 
24369e3700dfSgww /*
2437*de4cec48SToomas Soome  *	exit = 0, success
24389e3700dfSgww  *	       1, error
24399e3700dfSgww  *	       2, bad zone
24409e3700dfSgww  */
24417c478bd9Sstevel@tonic-gate static int
24428523fda3SJan Friedel str2policy(char *policy_str, uint32_t *policy_mask)
24437c478bd9Sstevel@tonic-gate {
24447c478bd9Sstevel@tonic-gate 	char		*buf;
24457c478bd9Sstevel@tonic-gate 	char		*tok;
24467c478bd9Sstevel@tonic-gate 	char		pfix;
24478523fda3SJan Friedel 	boolean_t	is_all = B_FALSE;
24488523fda3SJan Friedel 	uint32_t	pm = 0;
24498523fda3SJan Friedel 	uint32_t	curp;
24507c478bd9Sstevel@tonic-gate 
24517c478bd9Sstevel@tonic-gate 	pfix = *policy_str;
24527c478bd9Sstevel@tonic-gate 
24537c478bd9Sstevel@tonic-gate 	if (pfix == '-' || pfix == '+' || pfix == '=')
24547c478bd9Sstevel@tonic-gate 		++policy_str;
24557c478bd9Sstevel@tonic-gate 
24567c478bd9Sstevel@tonic-gate 	if ((buf = strdup(policy_str)) == NULL)
24577c478bd9Sstevel@tonic-gate 		return (1);
24587c478bd9Sstevel@tonic-gate 
24599e3700dfSgww 	for (tok = strtok(buf, ","); tok != NULL; tok = strtok(NULL, ",")) {
24608523fda3SJan Friedel 		uint32_t tok_pm;
24618523fda3SJan Friedel 		if (((tok_pm = get_policy(tok)) == 0) &&
24628523fda3SJan Friedel 		    ((strcasecmp(tok, "none") != 0))) {
24638523fda3SJan Friedel 			free(buf);
24647c478bd9Sstevel@tonic-gate 			return (1);
24657c478bd9Sstevel@tonic-gate 		} else {
24668523fda3SJan Friedel 			pm |= tok_pm;
24678523fda3SJan Friedel 			if (tok_pm == ALL_POLICIES) {
24688523fda3SJan Friedel 				is_all = B_TRUE;
24699e3700dfSgww 			}
24707c478bd9Sstevel@tonic-gate 		}
24717c478bd9Sstevel@tonic-gate 	}
24727c478bd9Sstevel@tonic-gate 	free(buf);
24737c478bd9Sstevel@tonic-gate 
24748523fda3SJan Friedel 	/* reuse policy mask if already set to some value */
24758523fda3SJan Friedel 	if (*policy_mask != 0) {
24768523fda3SJan Friedel 		curp = *policy_mask;
24778523fda3SJan Friedel 	} else {
24788523fda3SJan Friedel 		(void) auditon(A_GETPOLICY, (caddr_t)&curp, 0);
24798523fda3SJan Friedel 	}
24808523fda3SJan Friedel 
24817c478bd9Sstevel@tonic-gate 	if (pfix == '-') {
24829e3700dfSgww 		if (!is_all &&
24839e3700dfSgww 		    (getzoneid() != GLOBAL_ZONEID) &&
24849e3700dfSgww 		    (pm & ~AUDIT_LOCAL)) {
24857c478bd9Sstevel@tonic-gate 			return (2);
24869e3700dfSgww 		}
24878523fda3SJan Friedel 
24887c478bd9Sstevel@tonic-gate 		if (getzoneid() != GLOBAL_ZONEID)
24897c478bd9Sstevel@tonic-gate 			curp &= AUDIT_LOCAL;
24907c478bd9Sstevel@tonic-gate 		*policy_mask = curp & ~pm;
24918523fda3SJan Friedel 
24927c478bd9Sstevel@tonic-gate 	} else if (pfix == '+') {
24937c478bd9Sstevel@tonic-gate 		/*
24949e3700dfSgww 		 * In a local zone, accept specifying "all", but not
24959e3700dfSgww 		 * individually specifying global-zone only policies.
24969e3700dfSgww 		 * Limit to all locally allowed, so system call doesn't
24979e3700dfSgww 		 * fail.
24987c478bd9Sstevel@tonic-gate 		 */
24999e3700dfSgww 		if (!is_all &&
25009e3700dfSgww 		    (getzoneid() != GLOBAL_ZONEID) &&
25019e3700dfSgww 		    (pm & ~AUDIT_LOCAL)) {
25027c478bd9Sstevel@tonic-gate 			return (2);
25039e3700dfSgww 		}
25048523fda3SJan Friedel 
25057c478bd9Sstevel@tonic-gate 		if (getzoneid() != GLOBAL_ZONEID) {
25067c478bd9Sstevel@tonic-gate 			curp &= AUDIT_LOCAL;
25079e3700dfSgww 			if (is_all) {
25087c478bd9Sstevel@tonic-gate 				pm &= AUDIT_LOCAL;
25099e3700dfSgww 			}
25107c478bd9Sstevel@tonic-gate 		}
25117c478bd9Sstevel@tonic-gate 		*policy_mask = curp | pm;
25128523fda3SJan Friedel 
25137c478bd9Sstevel@tonic-gate 	} else {
25148523fda3SJan Friedel 		/*
25158523fda3SJan Friedel 		 * In a local zone, accept specifying "all", but not
25168523fda3SJan Friedel 		 * individually specifying global-zone only policies.
25178523fda3SJan Friedel 		 * Limit to all locally allowed, so system call doesn't
25188523fda3SJan Friedel 		 * fail.
25198523fda3SJan Friedel 		 */
25208523fda3SJan Friedel 		if (!is_all &&
25218523fda3SJan Friedel 		    (getzoneid() != GLOBAL_ZONEID) &&
25228523fda3SJan Friedel 		    (pm & ~AUDIT_LOCAL)) {
25238523fda3SJan Friedel 			return (2);
25248523fda3SJan Friedel 		}
25258523fda3SJan Friedel 
25269e3700dfSgww 		if (is_all && (getzoneid() != GLOBAL_ZONEID)) {
25277c478bd9Sstevel@tonic-gate 			pm &= AUDIT_LOCAL;
25289e3700dfSgww 		}
25297c478bd9Sstevel@tonic-gate 		*policy_mask = pm;
25307c478bd9Sstevel@tonic-gate 	}
25317c478bd9Sstevel@tonic-gate 	return (0);
25327c478bd9Sstevel@tonic-gate }
25337c478bd9Sstevel@tonic-gate 
25347c478bd9Sstevel@tonic-gate static int
25358523fda3SJan Friedel policy2str(uint32_t policy, char *policy_str, size_t len)
25367c478bd9Sstevel@tonic-gate {
25377c478bd9Sstevel@tonic-gate 	int i, j;
25387c478bd9Sstevel@tonic-gate 
25397c478bd9Sstevel@tonic-gate 	if (policy == ALL_POLICIES) {
25407c478bd9Sstevel@tonic-gate 		(void) strcpy(policy_str, "all");
25417c478bd9Sstevel@tonic-gate 		return (1);
25427c478bd9Sstevel@tonic-gate 	}
25437c478bd9Sstevel@tonic-gate 
25447c478bd9Sstevel@tonic-gate 	if (policy == NO_POLICIES) {
25457c478bd9Sstevel@tonic-gate 		(void) strcpy(policy_str, "none");
25467c478bd9Sstevel@tonic-gate 		return (1);
25477c478bd9Sstevel@tonic-gate 	}
25487c478bd9Sstevel@tonic-gate 
25497c478bd9Sstevel@tonic-gate 	*policy_str = '\0';
25507c478bd9Sstevel@tonic-gate 
255145916cd2Sjpk 	for (i = 0, j = 0; i < POLICY_TBL_SZ; i++) {
25527c478bd9Sstevel@tonic-gate 		if (policy & policy_table[i].policy_mask &&
25537c478bd9Sstevel@tonic-gate 		    policy_table[i].policy_mask != ALL_POLICIES) {
25549e3700dfSgww 			if (j++) {
25557c478bd9Sstevel@tonic-gate 				(void) strcat(policy_str, ",");
25569e3700dfSgww 			}
25579e3700dfSgww 			(void) strlcat(policy_str, policy_table[i].policy_str,
25589e3700dfSgww 			    len);
25597c478bd9Sstevel@tonic-gate 		}
256045916cd2Sjpk 	}
25617c478bd9Sstevel@tonic-gate 
25627c478bd9Sstevel@tonic-gate 	if (*policy_str)
25637c478bd9Sstevel@tonic-gate 		return (0);
25647c478bd9Sstevel@tonic-gate 
25657c478bd9Sstevel@tonic-gate 	return (1);
25667c478bd9Sstevel@tonic-gate }
25677c478bd9Sstevel@tonic-gate 
25687c478bd9Sstevel@tonic-gate 
25697c478bd9Sstevel@tonic-gate static int
25709e3700dfSgww strisnum(char *s)
25717c478bd9Sstevel@tonic-gate {
25729e3700dfSgww 	if (s == NULL || !*s)
25737c478bd9Sstevel@tonic-gate 		return (0);
25747c478bd9Sstevel@tonic-gate 
25757c478bd9Sstevel@tonic-gate 	for (; *s == '-' || *s == '+'; s++)
25767c478bd9Sstevel@tonic-gate 
25777c478bd9Sstevel@tonic-gate 	if (!*s)
25787c478bd9Sstevel@tonic-gate 		return (0);
25797c478bd9Sstevel@tonic-gate 
25807c478bd9Sstevel@tonic-gate 	for (; *s; s++)
25817c478bd9Sstevel@tonic-gate 		if (!isdigit(*s))
25827c478bd9Sstevel@tonic-gate 			return (0);
25837c478bd9Sstevel@tonic-gate 
25847c478bd9Sstevel@tonic-gate 	return (1);
25857c478bd9Sstevel@tonic-gate }
25867c478bd9Sstevel@tonic-gate 
25877c478bd9Sstevel@tonic-gate static int
25889e3700dfSgww strisipaddr(char *s)
25897c478bd9Sstevel@tonic-gate {
25907c478bd9Sstevel@tonic-gate 	int dot = 0;
25917c478bd9Sstevel@tonic-gate 	int colon = 0;
25927c478bd9Sstevel@tonic-gate 
25937c478bd9Sstevel@tonic-gate 	/* no string */
25949e3700dfSgww 	if ((s == NULL) || (!*s))
25957c478bd9Sstevel@tonic-gate 		return (0);
25967c478bd9Sstevel@tonic-gate 
25977c478bd9Sstevel@tonic-gate 	for (; *s; s++) {
25987c478bd9Sstevel@tonic-gate 		if (!(isxdigit(*s) || *s != '.' || *s != ':'))
25997c478bd9Sstevel@tonic-gate 			return (0);
26009e3700dfSgww 		if (*s == '.')
26019e3700dfSgww 			dot++;
26029e3700dfSgww 		if (*s == ':')
26039e3700dfSgww 			colon++;
26047c478bd9Sstevel@tonic-gate 	}
26057c478bd9Sstevel@tonic-gate 
26067c478bd9Sstevel@tonic-gate 	if (dot && colon)
26077c478bd9Sstevel@tonic-gate 		return (0);
26087c478bd9Sstevel@tonic-gate 
26097c478bd9Sstevel@tonic-gate 	if (!dot && !colon)
26107c478bd9Sstevel@tonic-gate 		return (0);
26117c478bd9Sstevel@tonic-gate 
26127c478bd9Sstevel@tonic-gate 	return (1);
26137c478bd9Sstevel@tonic-gate }
26147c478bd9Sstevel@tonic-gate 
26157c478bd9Sstevel@tonic-gate static void
2616f8994074SJan Friedel chk_arg_len(char *argv, uint_t len)
26177c478bd9Sstevel@tonic-gate {
2618f8994074SJan Friedel 	if ((strlen(argv) + 1) > len) {
2619f8994074SJan Friedel 		*(argv + len - 1) = '\0';
2620f8994074SJan Friedel 		exit_error(gettext("Argument too long (%s..)."), argv);
2621f8994074SJan Friedel 	}
26227c478bd9Sstevel@tonic-gate }
26237c478bd9Sstevel@tonic-gate 
26247c478bd9Sstevel@tonic-gate static void
26259e3700dfSgww chk_event_num(int etype, au_event_t event)
26267c478bd9Sstevel@tonic-gate {
26277c478bd9Sstevel@tonic-gate 	au_stat_t as;
26287c478bd9Sstevel@tonic-gate 
26297c478bd9Sstevel@tonic-gate 	eauditon(A_GETSTAT, (caddr_t)&as, 0);
26307c478bd9Sstevel@tonic-gate 
26317c478bd9Sstevel@tonic-gate 	if (etype == AC_KERN_EVENT) {
26327c478bd9Sstevel@tonic-gate 		if (event > as.as_numevent) {
26338523fda3SJan Friedel 			exit_error(gettext(
26348523fda3SJan Friedel 			    "Invalid kernel audit event number specified.\n"
2635d0fa49b7STony Nguyen 			    "\t%hu is outside allowable range 0-%d."),
26367c478bd9Sstevel@tonic-gate 			    event, as.as_numevent);
26377c478bd9Sstevel@tonic-gate 		}
26389e3700dfSgww 	} else  {
26399e3700dfSgww 		/* user event */
26407c478bd9Sstevel@tonic-gate 		if (event <= as.as_numevent) {
26419e3700dfSgww 			exit_error(gettext("Invalid user level audit event "
2642d0fa49b7STony Nguyen 			    "number specified %hu."), event);
26437c478bd9Sstevel@tonic-gate 		}
26447c478bd9Sstevel@tonic-gate 	}
26457c478bd9Sstevel@tonic-gate }
26467c478bd9Sstevel@tonic-gate 
26477c478bd9Sstevel@tonic-gate static void
26489e3700dfSgww chk_event_str(int etype, char *event_str)
26497c478bd9Sstevel@tonic-gate {
26507c478bd9Sstevel@tonic-gate 	au_event_ent_t *evp;
26517c478bd9Sstevel@tonic-gate 	au_stat_t as;
26527c478bd9Sstevel@tonic-gate 
26537c478bd9Sstevel@tonic-gate 	eauditon(A_GETSTAT, (caddr_t)&as, 0);
26547c478bd9Sstevel@tonic-gate 
26557c478bd9Sstevel@tonic-gate 	evp = egetauevnam(event_str);
26567c478bd9Sstevel@tonic-gate 	if (etype == AC_KERN_EVENT && (evp->ae_number > as.as_numevent)) {
26578523fda3SJan Friedel 		exit_error(gettext(
26588523fda3SJan Friedel 		    "Invalid kernel audit event string specified.\n"
26599e3700dfSgww 		    "\t\"%s\" appears to be a user level event. "
26609e3700dfSgww 		    "Check configuration."), event_str);
26617c478bd9Sstevel@tonic-gate 	} else if (etype == AC_USER_EVENT &&
26629e3700dfSgww 	    (evp->ae_number < as.as_numevent)) {
26638523fda3SJan Friedel 		exit_error(gettext(
26648523fda3SJan Friedel 		    "Invalid user audit event string specified.\n"
26659e3700dfSgww 		    "\t\"%s\" appears to be a kernel event. "
26669e3700dfSgww 		    "Check configuration."), event_str);
26677c478bd9Sstevel@tonic-gate 	}
26687c478bd9Sstevel@tonic-gate }
26697c478bd9Sstevel@tonic-gate 
2670f8994074SJan Friedel static void
2671f8994074SJan Friedel chk_known_plugin(char *plugin_str)
2672f8994074SJan Friedel {
2673f8994074SJan Friedel 	if ((strlen(plugin_str) + 1) > PLUGIN_MAXBUF) {
2674f8994074SJan Friedel 		exit_error(gettext("Plugin name too long.\n"));
2675f8994074SJan Friedel 	}
2676f8994074SJan Friedel 
2677f8994074SJan Friedel 	if (!plugin_avail_scf(plugin_str)) {
2678f8994074SJan Friedel 		exit_error(gettext("No such plugin configured: %s"),
2679f8994074SJan Friedel 		    plugin_str);
2680f8994074SJan Friedel 	}
2681f8994074SJan Friedel }
2682f8994074SJan Friedel 
26837c478bd9Sstevel@tonic-gate static void
26849e3700dfSgww chk_sorf(char *sorf_str)
26857c478bd9Sstevel@tonic-gate {
26867c478bd9Sstevel@tonic-gate 	if (!strisnum(sorf_str))
26877c478bd9Sstevel@tonic-gate 		exit_error(gettext("Invalid sorf specified: %s"), sorf_str);
26887c478bd9Sstevel@tonic-gate }
26897c478bd9Sstevel@tonic-gate 
26907c478bd9Sstevel@tonic-gate static void
26919e3700dfSgww chk_retval(char *retval_str)
26927c478bd9Sstevel@tonic-gate {
26937c478bd9Sstevel@tonic-gate 	if (!strisnum(retval_str))
26947c478bd9Sstevel@tonic-gate 		exit_error(gettext("Invalid retval specified: %s"), retval_str);
26957c478bd9Sstevel@tonic-gate }
26967c478bd9Sstevel@tonic-gate 
26977c478bd9Sstevel@tonic-gate static void
26989e3700dfSgww execit(char **argv)
26997c478bd9Sstevel@tonic-gate {
27004e5fbfedStz 	char *args, *args_pos;
27014e5fbfedStz 	size_t len = 0;
27024e5fbfedStz 	size_t n = 0;
27034e5fbfedStz 	char **argv_pos;
27047c478bd9Sstevel@tonic-gate 
27059e3700dfSgww 	if (*argv) {
27064e5fbfedStz 		/* concatenate argument array to be passed to sh -c "..." */
27074e5fbfedStz 		for (argv_pos = argv; *argv_pos; argv_pos++)
27084e5fbfedStz 			len += strlen(*argv_pos) + 1;
27094e5fbfedStz 
27104e5fbfedStz 		if ((args = malloc(len + 1)) == NULL)
27114e5fbfedStz 			exit_error(
27128523fda3SJan Friedel 			    gettext("Allocation for command/arguments failed"));
27134e5fbfedStz 
27144e5fbfedStz 		args_pos = args;
27154e5fbfedStz 		for (argv_pos = argv; *argv_pos; argv_pos++) {
27164e5fbfedStz 			n += snprintf(args_pos, len - n, "%s ", *argv_pos);
27174e5fbfedStz 			args_pos = args + n;
27184e5fbfedStz 		}
27194e5fbfedStz 		/* strip the last space */
27204e5fbfedStz 		args[strlen(args)] = '\0';
27217c478bd9Sstevel@tonic-gate 
27224e5fbfedStz 		(void) execl("/bin/sh", "sh", "-c", args, NULL);
27234e5fbfedStz 	} else {
27244e5fbfedStz 		(void) execl("/bin/sh", "sh", NULL);
27257c478bd9Sstevel@tonic-gate 	}
27267c478bd9Sstevel@tonic-gate 
27277c478bd9Sstevel@tonic-gate 	exit_error(gettext("exec(2) failed"));
27287c478bd9Sstevel@tonic-gate }
27297c478bd9Sstevel@tonic-gate 
27307c478bd9Sstevel@tonic-gate static void
27319e3700dfSgww exit_usage(int status)
27327c478bd9Sstevel@tonic-gate {
27337c478bd9Sstevel@tonic-gate 	FILE *fp;
27347c478bd9Sstevel@tonic-gate 	int i;
27357c478bd9Sstevel@tonic-gate 
27367c478bd9Sstevel@tonic-gate 	fp = (status ? stderr : stdout);
27377c478bd9Sstevel@tonic-gate 	(void) fprintf(fp, gettext("usage: %s option ...\n"), progname);
27387c478bd9Sstevel@tonic-gate 
27398523fda3SJan Friedel 	for (i = 0; i < ARG_TBL_SZ; i++) {
27408523fda3SJan Friedel 		/* skip the -t option; it's not a standalone option */
27418523fda3SJan Friedel 		if (arg_table[i].auditconfig_cmd == AC_ARG_SET_TEMPORARY) {
27428523fda3SJan Friedel 			continue;
27438523fda3SJan Friedel 		}
27448523fda3SJan Friedel 
27458523fda3SJan Friedel 		(void) fprintf(fp, " %s%s%s\n",
27468523fda3SJan Friedel 		    arg_table[i].arg_str, arg_table[i].arg_opts,
27478523fda3SJan Friedel 		    (arg_table[i].temporary_allowed ? " [-t]" : ""));
27488523fda3SJan Friedel 	}
27497c478bd9Sstevel@tonic-gate 
27507c478bd9Sstevel@tonic-gate 	exit(status);
27517c478bd9Sstevel@tonic-gate }
27527c478bd9Sstevel@tonic-gate 
27537c478bd9Sstevel@tonic-gate static void
27549e3700dfSgww print_asid(au_asid_t asid)
27557c478bd9Sstevel@tonic-gate {
27567c478bd9Sstevel@tonic-gate 	(void) printf(gettext("audit session id = %u\n"), asid);
27577c478bd9Sstevel@tonic-gate }
27587c478bd9Sstevel@tonic-gate 
27597c478bd9Sstevel@tonic-gate static void
27609e3700dfSgww print_auid(au_id_t auid)
27617c478bd9Sstevel@tonic-gate {
27627c478bd9Sstevel@tonic-gate 	struct passwd *pwd;
27637c478bd9Sstevel@tonic-gate 	char *username;
27647c478bd9Sstevel@tonic-gate 
27659e3700dfSgww 	if ((pwd = getpwuid((uid_t)auid)) != NULL)
27667c478bd9Sstevel@tonic-gate 		username = pwd->pw_name;
27677c478bd9Sstevel@tonic-gate 	else
27687c478bd9Sstevel@tonic-gate 		username = gettext("unknown");
27697c478bd9Sstevel@tonic-gate 
27707c478bd9Sstevel@tonic-gate 	(void) printf(gettext("audit id = %s(%d)\n"), username, auid);
27717c478bd9Sstevel@tonic-gate }
27727c478bd9Sstevel@tonic-gate 
27737c478bd9Sstevel@tonic-gate static void
27749e3700dfSgww print_mask(char *desc, au_mask_t *pmp)
27757c478bd9Sstevel@tonic-gate {
27767c478bd9Sstevel@tonic-gate 	char auflags[512];
27777c478bd9Sstevel@tonic-gate 
2778*de4cec48SToomas Soome 	if (getauditflagschar(auflags, pmp, 0) < 0)
27797c478bd9Sstevel@tonic-gate 		(void) strlcpy(auflags, gettext("unknown"), sizeof (auflags));
27807c478bd9Sstevel@tonic-gate 
27817c478bd9Sstevel@tonic-gate 	(void) printf("%s = %s(0x%x,0x%x)\n",
27829e3700dfSgww 	    desc, auflags, pmp->am_success, pmp->am_failure);
27837c478bd9Sstevel@tonic-gate }
27847c478bd9Sstevel@tonic-gate 
2785f8994074SJan Friedel static void
2786f8994074SJan Friedel print_plugin(char *plugin_name, kva_t *plugin_kva)
2787f8994074SJan Friedel {
2788f8994074SJan Friedel 	char		att_str[PLUGIN_MAXATT];
2789f8994074SJan Friedel 	boolean_t	plugin_active;
2790f8994074SJan Friedel 	char		*active_str;
2791f8994074SJan Friedel 	char		*qsize_ptr;
2792f8994074SJan Friedel 	int		qsize;
2793f8994074SJan Friedel 
2794f8994074SJan Friedel 	if ((active_str = kva_match(plugin_kva, "active")) == NULL) {
2795f8994074SJan Friedel 		(void) printf(gettext("Audit service configuration error: "
2796f8994074SJan Friedel 		    "\"active\" property not found\n"));
2797f8994074SJan Friedel 		return;
2798f8994074SJan Friedel 	}
2799f8994074SJan Friedel 
2800f8994074SJan Friedel 	plugin_active = (boolean_t)atoi(active_str);
2801f8994074SJan Friedel 	qsize_ptr = kva_match(plugin_kva, "qsize");
2802f8994074SJan Friedel 	qsize = atoi(qsize_ptr == NULL ? "-1" : qsize_ptr);
2803f8994074SJan Friedel 
2804f8994074SJan Friedel 	(void) printf(gettext("Plugin: %s (%s)\n"), plugin_name,
2805f8994074SJan Friedel 	    plugin_active ? "active" : "inactive");
2806f8994074SJan Friedel 
2807f8994074SJan Friedel 	free_static_att_kva(plugin_kva);
2808f8994074SJan Friedel 
2809f8994074SJan Friedel 	switch (_kva2str(plugin_kva, att_str, PLUGIN_MAXATT, "=", ";")) {
2810f8994074SJan Friedel 	case 0:
2811f8994074SJan Friedel 		(void) printf(gettext("\tAttributes: %s\n"), att_str);
2812f8994074SJan Friedel 		break;
2813f8994074SJan Friedel 	case 1:
2814f8994074SJan Friedel 		exit_error(gettext("Internal error - buffer size too small."));
2815f8994074SJan Friedel 		break;
2816f8994074SJan Friedel 	default:
2817f8994074SJan Friedel 		exit_error(gettext("Internal error."));
2818f8994074SJan Friedel 		break;
2819f8994074SJan Friedel 	}
2820f8994074SJan Friedel 
2821f8994074SJan Friedel 	if (qsize != 0) {
2822f8994074SJan Friedel 		(void) printf(gettext("\tQueue size: %d %s\n"), qsize,
2823f8994074SJan Friedel 		    qsize == -1 ? "(internal error: value not available)" : "");
2824f8994074SJan Friedel 	}
2825f8994074SJan Friedel }
2826f8994074SJan Friedel 
28277c478bd9Sstevel@tonic-gate static void
28289e3700dfSgww print_tid_ex(au_tid_addr_t *tidp)
28297c478bd9Sstevel@tonic-gate {
28307c478bd9Sstevel@tonic-gate 	struct hostent *phe;
28317c478bd9Sstevel@tonic-gate 	char *hostname;
28327c478bd9Sstevel@tonic-gate 	struct in_addr ia;
28337c478bd9Sstevel@tonic-gate 	uint32_t *addr;
28347c478bd9Sstevel@tonic-gate 	int err;
28359e3700dfSgww 	char buf[INET6_ADDRSTRLEN];
28367c478bd9Sstevel@tonic-gate 	char *bufp;
28377c478bd9Sstevel@tonic-gate 
28387c478bd9Sstevel@tonic-gate 
28397c478bd9Sstevel@tonic-gate 	/* IPV6 or IPV4 address */
28407c478bd9Sstevel@tonic-gate 	if (tidp->at_type == AU_IPv4) {
28417c478bd9Sstevel@tonic-gate 		if ((phe = gethostbyaddr((char *)&tidp->at_addr[0],
28429e3700dfSgww 		    sizeof (tidp->at_addr[0]), AF_INET)) != NULL) {
28437c478bd9Sstevel@tonic-gate 			hostname = phe->h_name;
28449e3700dfSgww 		} else {
28457c478bd9Sstevel@tonic-gate 			hostname = gettext("unknown");
28469e3700dfSgww 		}
28477c478bd9Sstevel@tonic-gate 
28487c478bd9Sstevel@tonic-gate 		ia.s_addr = tidp->at_addr[0];
28497c478bd9Sstevel@tonic-gate 
28507c478bd9Sstevel@tonic-gate 		(void) printf(gettext(
28518523fda3SJan Friedel 		    "terminal id (maj,min,host) = %lu,%lu,%s(%s)\n"),
28529e3700dfSgww 		    major(tidp->at_port), minor(tidp->at_port),
28539e3700dfSgww 		    hostname, inet_ntoa(ia));
28547c478bd9Sstevel@tonic-gate 	} else {
28557c478bd9Sstevel@tonic-gate 		addr = &tidp->at_addr[0];
28567c478bd9Sstevel@tonic-gate 		phe = getipnodebyaddr((const void *)addr, 16, AF_INET6, &err);
28577c478bd9Sstevel@tonic-gate 
28587c478bd9Sstevel@tonic-gate 		bzero(buf, sizeof (buf));
28597c478bd9Sstevel@tonic-gate 
28609e3700dfSgww 		(void) inet_ntop(AF_INET6, (void *)addr, buf, sizeof (buf));
28619e3700dfSgww 		if (phe == NULL) {
28627c478bd9Sstevel@tonic-gate 			bufp = gettext("unknown");
28639e3700dfSgww 		} else {
28647c478bd9Sstevel@tonic-gate 			bufp = phe->h_name;
28659e3700dfSgww 		}
28667c478bd9Sstevel@tonic-gate 
28677c478bd9Sstevel@tonic-gate 		(void) printf(gettext(
28688523fda3SJan Friedel 		    "terminal id (maj,min,host) = %lu,%lu,%s(%s)\n"),
28699e3700dfSgww 		    major(tidp->at_port), minor(tidp->at_port),
28709e3700dfSgww 		    bufp, buf);
28719e3700dfSgww 		if (phe) {
28727c478bd9Sstevel@tonic-gate 			freehostent(phe);
28739e3700dfSgww 		}
28747c478bd9Sstevel@tonic-gate 	}
28757c478bd9Sstevel@tonic-gate }
28767c478bd9Sstevel@tonic-gate 
28777c478bd9Sstevel@tonic-gate static int
28789e3700dfSgww str2ipaddr(char *s, uint32_t *addr, uint32_t type)
28797c478bd9Sstevel@tonic-gate {
28807c478bd9Sstevel@tonic-gate 	int j, sl;
28817c478bd9Sstevel@tonic-gate 	char *ss;
28827c478bd9Sstevel@tonic-gate 	unsigned int v;
28837c478bd9Sstevel@tonic-gate 
28847c478bd9Sstevel@tonic-gate 	bzero(addr, 16);
28857c478bd9Sstevel@tonic-gate 	if (strisipaddr(s)) {
28867c478bd9Sstevel@tonic-gate 		if (type == AU_IPv4) {
28879e3700dfSgww 			if (inet_pton(AF_INET, s, addr)) {
28887c478bd9Sstevel@tonic-gate 				return (0);
28899e3700dfSgww 			}
28907c478bd9Sstevel@tonic-gate 			return (1);
28919e3700dfSgww 		} else if (type == AU_IPv6) {
28927c478bd9Sstevel@tonic-gate 			if (inet_pton(AF_INET6, s, addr))
28937c478bd9Sstevel@tonic-gate 				return (0);
28947c478bd9Sstevel@tonic-gate 			return (1);
28957c478bd9Sstevel@tonic-gate 		}
28967c478bd9Sstevel@tonic-gate 		return (1);
28977c478bd9Sstevel@tonic-gate 	} else {
28987c478bd9Sstevel@tonic-gate 		if (type == AU_IPv4) {
28997c478bd9Sstevel@tonic-gate 			(void) sscanf(s, "%x", &addr[0]);
29007c478bd9Sstevel@tonic-gate 			return (0);
29019e3700dfSgww 		} else if (type == AU_IPv6) {
29027c478bd9Sstevel@tonic-gate 			sl = strlen(s);
29037c478bd9Sstevel@tonic-gate 			ss = s;
29047c478bd9Sstevel@tonic-gate 			for (j = 3; j >= 0; j--) {
29057c478bd9Sstevel@tonic-gate 				if ((sl - 8) <= 0) {
29067c478bd9Sstevel@tonic-gate 					(void) sscanf(s, "%x", &v);
29077c478bd9Sstevel@tonic-gate 					addr[j] = v;
29087c478bd9Sstevel@tonic-gate 					return (0);
29097c478bd9Sstevel@tonic-gate 				}
29107c478bd9Sstevel@tonic-gate 				ss = &s[sl-8];
29117c478bd9Sstevel@tonic-gate 				(void) sscanf(ss, "%x", &v);
29127c478bd9Sstevel@tonic-gate 				addr[j] = v;
29137c478bd9Sstevel@tonic-gate 				sl -= 8;
29147c478bd9Sstevel@tonic-gate 				*ss = '\0';
29157c478bd9Sstevel@tonic-gate 			}
29167c478bd9Sstevel@tonic-gate 		}
29177c478bd9Sstevel@tonic-gate 		return (0);
29187c478bd9Sstevel@tonic-gate 	}
29197c478bd9Sstevel@tonic-gate }
29207c478bd9Sstevel@tonic-gate 
29217c478bd9Sstevel@tonic-gate static int
29229e3700dfSgww str2type(char *s, uint_t *type)
29237c478bd9Sstevel@tonic-gate {
29247c478bd9Sstevel@tonic-gate 	if (strcmp(s, "ipv6") == 0) {
29257c478bd9Sstevel@tonic-gate 		*type = AU_IPv6;
29267c478bd9Sstevel@tonic-gate 		return (0);
29277c478bd9Sstevel@tonic-gate 	}
29287c478bd9Sstevel@tonic-gate 	if (strcmp(s, "ipv4") == 0) {
29297c478bd9Sstevel@tonic-gate 		*type = AU_IPv4;
29307c478bd9Sstevel@tonic-gate 		return (0);
29317c478bd9Sstevel@tonic-gate 	}
29327c478bd9Sstevel@tonic-gate 
29337c478bd9Sstevel@tonic-gate 	return (1);
29347c478bd9Sstevel@tonic-gate }
29358523fda3SJan Friedel 
29368523fda3SJan Friedel /*
29378523fda3SJan Friedel  * exit_error() - print an error message along with corresponding system error
29388523fda3SJan Friedel  * number and error message, then exit. Inputs - program error format and
29398523fda3SJan Friedel  * message.
29408523fda3SJan Friedel  */
29418523fda3SJan Friedel /*PRINTFLIKE1*/
29428523fda3SJan Friedel static void
29438523fda3SJan Friedel exit_error(char *fmt, ...)
29448523fda3SJan Friedel {
29458523fda3SJan Friedel 	va_list	args;
29468523fda3SJan Friedel 
29478523fda3SJan Friedel 	va_start(args, fmt);
29488523fda3SJan Friedel 	prt_error_va(fmt, args);
29498523fda3SJan Friedel 	va_end(args);
29508523fda3SJan Friedel 
29518523fda3SJan Friedel 	exit(1);
29528523fda3SJan Friedel }
2953