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 /*
22*f8994074SJan 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>
54*f8994074SJan Friedel #include <audit_policy.h>
55*f8994074SJan 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,
71*f8994074SJan Friedel AC_ARG_GETFLAGS,
729e3700dfSgww AC_ARG_GETKAUDIT,
739e3700dfSgww AC_ARG_GETKMASK,
74*f8994074SJan Friedel AC_ARG_GETNAFLAGS,
759e3700dfSgww AC_ARG_GETPINFO,
76*f8994074SJan 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,
91*f8994074SJan Friedel AC_ARG_SETFLAGS,
929e3700dfSgww AC_ARG_SETKAUDIT,
939e3700dfSgww AC_ARG_SETKMASK,
94*f8994074SJan Friedel AC_ARG_SETNAFLAGS,
95*f8994074SJan 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
1097c478bd9Sstevel@tonic-gate #define AC_KERN_EVENT 0
1107c478bd9Sstevel@tonic-gate #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 {
1207c478bd9Sstevel@tonic-gate char *arg_str;
1217c478bd9Sstevel@tonic-gate 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;
1267c478bd9Sstevel@tonic-gate
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},
142*f8994074SJan Friedel { "-getflags", "", AC_ARG_GETFLAGS, B_FALSE},
1438523fda3SJan Friedel { "-getkaudit", "", AC_ARG_GETKAUDIT, B_FALSE},
1448523fda3SJan Friedel { "-getkmask", "", AC_ARG_GETKMASK, B_FALSE},
145*f8994074SJan Friedel { "-getnaflags", "", AC_ARG_GETNAFLAGS, B_FALSE},
1468523fda3SJan Friedel { "-getpinfo", " pid", AC_ARG_GETPINFO, B_FALSE},
147*f8994074SJan 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},
1599e3700dfSgww { "-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},
163*f8994074SJan 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},
166*f8994074SJan Friedel { "-setnaflags", " audit_naflags", AC_ARG_SETNAFLAGS, B_FALSE},
167*f8994074SJan Friedel { "-setplugin", " name active|inactive [attributes [qsize]]",
168*f8994074SJan 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;
1927c478bd9Sstevel@tonic-gate
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);
205*f8994074SJan 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);
208*f8994074SJan 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);
212*f8994074SJan 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);
226*f8994074SJan Friedel static void do_getflags(void);
2279e3700dfSgww static void do_getkmask(void);
228*f8994074SJan Friedel static void do_getnaflags(void);
2299e3700dfSgww static void do_getpinfo(char *pid_str);
230*f8994074SJan 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);
245*f8994074SJan Friedel static void do_setclass(char *event_str, au_mask_t *mask);
246*f8994074SJan Friedel static void do_setflags(char *audit_flags, au_mask_t *amask);
247*f8994074SJan Friedel static void do_setkmask(au_mask_t *pmask);
248*f8994074SJan Friedel static void do_setnaflags(char *audit_naflags, au_mask_t *namask);
249*f8994074SJan Friedel static void do_setpmask(char *pid_str, au_mask_t *mask);
250*f8994074SJan Friedel static void do_setsmask(char *asid_str, au_mask_t *mask);
251*f8994074SJan Friedel static void do_setumask(char *auid_str, au_mask_t *mask);
252*f8994074SJan Friedel static void do_setplugin(char *plugin_str, boolean_t plugin_state,
253*f8994074SJan 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);
26245916cd2Sjpk
2639e3700dfSgww static void eauditon(int cmd, caddr_t data, int length);
264*f8994074SJan 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);
268*f8994074SJan 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);
271*f8994074SJan 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);
275*f8994074SJan 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);
279*f8994074SJan 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
main(int argc,char ** argv)2879e3700dfSgww main(int argc, char **argv)
2887c478bd9Sstevel@tonic-gate {
289*f8994074SJan Friedel au_mask_t mask; /* for options manipulating flags */
290*f8994074SJan 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 &&
2997c478bd9Sstevel@tonic-gate (argv[1][0] == '?' ||
3007c478bd9Sstevel@tonic-gate strcmp(argv[1], "-h") == 0 ||
3018523fda3SJan Friedel strcmp(argv[1], "-?") == 0)) {
3027c478bd9Sstevel@tonic-gate exit_usage(0);
3038523fda3SJan Friedel }
3047c478bd9Sstevel@tonic-gate
305*f8994074SJan Friedel parse_args(argc, argv, &mask);
306*f8994074SJan 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
parse_args(int argc,char ** argv,au_mask_t * mask)320*f8994074SJan 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,
3407c478bd9Sstevel@tonic-gate (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,
3747c478bd9Sstevel@tonic-gate (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:
383*f8994074SJan Friedel case AC_ARG_GETFLAGS:
3847c478bd9Sstevel@tonic-gate case AC_ARG_GETKMASK:
385*f8994074SJan Friedel case AC_ARG_GETNAFLAGS:
386*f8994074SJan Friedel break;
387*f8994074SJan Friedel
388*f8994074SJan Friedel case AC_ARG_GETPLUGIN:
389*f8994074SJan Friedel if (*++argv == NULL) {
390*f8994074SJan Friedel --argv;
391*f8994074SJan Friedel break;
392*f8994074SJan Friedel }
393*f8994074SJan Friedel if (get_arg_ent(*argv) != NULL) {
394*f8994074SJan Friedel --argv;
395*f8994074SJan Friedel } else {
396*f8994074SJan Friedel chk_arg_len(*argv, PLUGIN_MAXBUF);
397*f8994074SJan Friedel chk_known_plugin(*argv);
398*f8994074SJan Friedel }
399*f8994074SJan Friedel break;
400*f8994074SJan 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(
4327c478bd9Sstevel@tonic-gate "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,
4487c478bd9Sstevel@tonic-gate (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);
454*f8994074SJan Friedel echkflags(*argv, mask);
455*f8994074SJan Friedel break;
456*f8994074SJan Friedel
457*f8994074SJan Friedel case AC_ARG_SETFLAGS:
458*f8994074SJan Friedel ++argv;
459*f8994074SJan Friedel if (!*argv)
460*f8994074SJan Friedel exit_usage(1);
461*f8994074SJan Friedel chk_arg_len(*argv, PRESELECTION_MAXBUF);
462*f8994074SJan 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);
469*f8994074SJan Friedel echkflags(*argv, mask);
470*f8994074SJan Friedel break;
471*f8994074SJan Friedel
472*f8994074SJan Friedel case AC_ARG_SETNAFLAGS:
473*f8994074SJan Friedel ++argv;
474*f8994074SJan Friedel if (!*argv)
475*f8994074SJan Friedel exit_usage(1);
476*f8994074SJan Friedel chk_arg_len(*argv, PRESELECTION_MAXBUF);
477*f8994074SJan Friedel echkflags(*argv, mask);
478*f8994074SJan Friedel break;
479*f8994074SJan Friedel
480*f8994074SJan Friedel case AC_ARG_SETPLUGIN:
481*f8994074SJan Friedel if (*++argv == NULL || get_arg_ent(*argv) != NULL) {
482*f8994074SJan Friedel exit_usage(1);
483*f8994074SJan Friedel }
484*f8994074SJan Friedel chk_known_plugin(*argv);
485*f8994074SJan Friedel chk_arg_len(*argv, PLUGIN_MAXBUF);
486*f8994074SJan Friedel if (*++argv == NULL || strcmp(*argv, "active") != 0 &&
487*f8994074SJan Friedel strcmp(*argv, "inactive") != 0) {
488*f8994074SJan Friedel exit_usage(1);
489*f8994074SJan Friedel }
490*f8994074SJan Friedel if (*++argv == NULL || get_arg_ent(*argv) != NULL) {
491*f8994074SJan Friedel --argv;
492*f8994074SJan Friedel break;
493*f8994074SJan Friedel }
494*f8994074SJan Friedel chk_arg_len(*argv, PLUGIN_MAXATT);
495*f8994074SJan Friedel if (*++argv == NULL || get_arg_ent(*argv) != NULL) {
496*f8994074SJan Friedel --argv;
497*f8994074SJan Friedel break;
498*f8994074SJan Friedel }
499*f8994074SJan Friedel if (atoi(*argv) < 0) {
500*f8994074SJan Friedel exit_error(gettext("Incorrect qsize specified "
501*f8994074SJan Friedel "(%s)."), *argv);
502*f8994074SJan 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);
527*f8994074SJan 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);
599*f8994074SJan 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
do_args(char ** argv,au_mask_t * mask)627*f8994074SJan 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
705*f8994074SJan Friedel case AC_ARG_GETFLAGS:
706*f8994074SJan Friedel do_getflags();
707*f8994074SJan Friedel break;
708*f8994074SJan Friedel
7097c478bd9Sstevel@tonic-gate case AC_ARG_GETKMASK:
7107c478bd9Sstevel@tonic-gate do_getkmask();
7117c478bd9Sstevel@tonic-gate break;
7127c478bd9Sstevel@tonic-gate
713*f8994074SJan Friedel case AC_ARG_GETNAFLAGS:
714*f8994074SJan Friedel do_getnaflags();
715*f8994074SJan Friedel break;
716*f8994074SJan Friedel
717*f8994074SJan Friedel case AC_ARG_GETPLUGIN:
718*f8994074SJan Friedel {
719*f8994074SJan Friedel char *plugin_str = NULL;
720*f8994074SJan Friedel
721*f8994074SJan Friedel ++argv;
722*f8994074SJan Friedel if (*argv != NULL) {
723*f8994074SJan Friedel if (get_arg_ent(*argv) != NULL) {
724*f8994074SJan Friedel --argv;
725*f8994074SJan Friedel } else {
726*f8994074SJan Friedel plugin_str = *argv;
727*f8994074SJan Friedel }
728*f8994074SJan Friedel } else {
729*f8994074SJan Friedel --argv;
730*f8994074SJan Friedel }
731*f8994074SJan Friedel
732*f8994074SJan Friedel do_getplugin(plugin_str);
733*f8994074SJan Friedel }
734*f8994074SJan Friedel break;
735*f8994074SJan 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 {
831*f8994074SJan Friedel char *event_str;
8327c478bd9Sstevel@tonic-gate
833*f8994074SJan Friedel ++argv;
834*f8994074SJan Friedel event_str = *argv;
835*f8994074SJan Friedel do_setclass(event_str, mask);
836*f8994074SJan Friedel
837*f8994074SJan Friedel ++argv;
8387c478bd9Sstevel@tonic-gate }
8397c478bd9Sstevel@tonic-gate break;
8407c478bd9Sstevel@tonic-gate
841*f8994074SJan Friedel case AC_ARG_SETFLAGS:
842*f8994074SJan Friedel ++argv;
843*f8994074SJan Friedel do_setflags(*argv, mask);
844*f8994074SJan Friedel break;
845*f8994074SJan Friedel
8467c478bd9Sstevel@tonic-gate case AC_ARG_SETKMASK:
8477c478bd9Sstevel@tonic-gate ++argv;
848*f8994074SJan Friedel do_setkmask(mask);
849*f8994074SJan Friedel break;
850*f8994074SJan Friedel
851*f8994074SJan Friedel case AC_ARG_SETNAFLAGS:
852*f8994074SJan Friedel ++argv;
853*f8994074SJan Friedel do_setnaflags(*argv, mask);
854*f8994074SJan Friedel break;
855*f8994074SJan Friedel
856*f8994074SJan Friedel case AC_ARG_SETPLUGIN:
857*f8994074SJan Friedel {
858*f8994074SJan Friedel char *plugin_str = NULL;
859*f8994074SJan Friedel boolean_t plugin_state = B_FALSE;
860*f8994074SJan Friedel char *plugin_att = NULL;
861*f8994074SJan Friedel int plugin_qsize = -1;
862*f8994074SJan Friedel
863*f8994074SJan Friedel plugin_str = *++argv;
864*f8994074SJan Friedel if (strcmp(*++argv, "active") == 0) {
865*f8994074SJan Friedel plugin_state = B_TRUE;
866*f8994074SJan Friedel }
867*f8994074SJan Friedel if (*++argv != NULL &&
868*f8994074SJan Friedel get_arg_ent(*argv) == NULL) {
869*f8994074SJan Friedel plugin_att = *argv;
870*f8994074SJan Friedel if (*++argv != NULL &&
871*f8994074SJan Friedel get_arg_ent(*argv) == NULL) {
872*f8994074SJan Friedel plugin_qsize = atoi(*argv);
873*f8994074SJan Friedel } else {
874*f8994074SJan Friedel --argv;
875*f8994074SJan Friedel }
876*f8994074SJan Friedel } else {
877*f8994074SJan Friedel --argv;
878*f8994074SJan Friedel }
879*f8994074SJan Friedel
880*f8994074SJan Friedel do_setplugin(plugin_str, plugin_state,
881*f8994074SJan Friedel plugin_att, plugin_qsize);
882*f8994074SJan 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;
906*f8994074SJan Friedel do_setpmask(pid_str, mask);
907*f8994074SJan 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;
953*f8994074SJan Friedel do_setsmask(asid_str, mask);
954*f8994074SJan 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;
964*f8994074SJan Friedel do_setumask(auid_str, mask);
965*f8994074SJan 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
do_chkconf(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,
10227c478bd9Sstevel@tonic-gate &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,
10267c478bd9Sstevel@tonic-gate &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"),
10327c478bd9Sstevel@tonic-gate evp->ae_name, evp->ae_number,
10339e3700dfSgww NONE(run_aflags),
10349e3700dfSgww NONE(conf_aflags));
10359e3700dfSgww }
10367c478bd9Sstevel@tonic-gate }
10377c478bd9Sstevel@tonic-gate }
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
do_conf(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;
1063*f8994074SJan 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
do_chkaconf(void)10779e3700dfSgww do_chkaconf(void)
10787c478bd9Sstevel@tonic-gate {
1079*f8994074SJan Friedel char *namask_cfg;
10807c478bd9Sstevel@tonic-gate au_mask_t pmask, kmask;
10817c478bd9Sstevel@tonic-gate
1082*f8994074SJan Friedel if (!do_getnaflags_scf(&namask_cfg) || namask_cfg == NULL) {
1083*f8994074SJan Friedel exit_error(gettext("Could not get configured value."));
10847c478bd9Sstevel@tonic-gate }
1085*f8994074SJan Friedel egetauditflagsbin(namask_cfg, &pmask);
10867c478bd9Sstevel@tonic-gate
1087*f8994074SJan 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) {
1093*f8994074SJan 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 }
1098*f8994074SJan Friedel (void) printf(
1099*f8994074SJan Friedel gettext("non-attributable event flags mismatch:\n"));
1100*f8994074SJan Friedel (void) printf(gettext("active non-attributable audit flags "
1101*f8994074SJan Friedel "= %s\n"), kbuf);
1102*f8994074SJan Friedel (void) printf(gettext("configured non-attributable audit flags "
1103*f8994074SJan Friedel "= %s\n"), namask_cfg);
11047c478bd9Sstevel@tonic-gate }
1105*f8994074SJan 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
do_aconf(void)11139e3700dfSgww do_aconf(void)
11147c478bd9Sstevel@tonic-gate {
1115*f8994074SJan Friedel au_mask_t namask;
1116*f8994074SJan Friedel char *namask_cfg;
11177c478bd9Sstevel@tonic-gate
1118*f8994074SJan Friedel if (!do_getnaflags_scf(&namask_cfg) || namask_cfg == NULL) {
1119*f8994074SJan Friedel exit_error(gettext("Could not get configured value."));
11207c478bd9Sstevel@tonic-gate }
1121*f8994074SJan Friedel egetauditflagsbin(namask_cfg, &namask);
1122*f8994074SJan Friedel free(namask_cfg);
11237c478bd9Sstevel@tonic-gate
1124*f8994074SJan Friedel eauditon(A_SETKMASK, (caddr_t)&namask, sizeof (namask));
1125*f8994074SJan 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
do_audit(char * event,char sorf,int retval,char * audit_str)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,
11547c478bd9Sstevel@tonic-gate AU_PRS_USECACHE);
11557c478bd9Sstevel@tonic-gate
11569e3700dfSgww if (rtn == -1) {
1157d0fa49b7STony Nguyen exit_error("%s\n%s %hu\n",
11587c478bd9Sstevel@tonic-gate gettext("Check audit event configuration."),
11597c478bd9Sstevel@tonic-gate gettext("Could not get audit class for event number"),
11607c478bd9Sstevel@tonic-gate 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
do_getauid(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
do_getaudit(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
do_getkaudit(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
do_setkaudit(char * t,char * s)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
do_getcar(void)12759e3700dfSgww do_getcar(void)
12767c478bd9Sstevel@tonic-gate {
12777c478bd9Sstevel@tonic-gate char path[MAXPATHLEN];
12787c478bd9Sstevel@tonic-gate
1279*f8994074SJan 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
do_getclass(char * event_str)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;
13087c478bd9Sstevel@tonic-gate }
13099e3700dfSgww }
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
do_getcond(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
do_getcwd(void)13339e3700dfSgww do_getcwd(void)
13347c478bd9Sstevel@tonic-gate {
13357c478bd9Sstevel@tonic-gate char path[MAXPATHLEN];
13367c478bd9Sstevel@tonic-gate
1337*f8994074SJan 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
13417c478bd9Sstevel@tonic-gate /*
1342*f8994074SJan Friedel * do_getflags() - the printed value is for the global zone unless AUDIT_PERZONE
1343*f8994074SJan Friedel * is set.
1344*f8994074SJan Friedel */
1345*f8994074SJan Friedel static void
do_getflags(void)1346*f8994074SJan Friedel do_getflags(void)
1347*f8994074SJan Friedel {
1348*f8994074SJan Friedel au_mask_t amask;
1349*f8994074SJan Friedel char *amask_cfg;
1350*f8994074SJan Friedel
1351*f8994074SJan Friedel eauditon(A_GETAMASK, (caddr_t)&amask, sizeof (amask));
1352*f8994074SJan Friedel print_mask(gettext("active user default audit flags"), &amask);
1353*f8994074SJan Friedel
1354*f8994074SJan Friedel if (!do_getflags_scf(&amask_cfg) || amask_cfg == NULL) {
1355*f8994074SJan Friedel exit_error(gettext("Could not get configured value."));
1356*f8994074SJan Friedel }
1357*f8994074SJan Friedel egetauditflagsbin(amask_cfg, &amask);
1358*f8994074SJan Friedel print_mask(gettext("configured user default audit flags"), &amask);
1359*f8994074SJan Friedel free(amask_cfg);
1360*f8994074SJan Friedel }
1361*f8994074SJan Friedel
1362*f8994074SJan Friedel /*
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
do_getkmask(void)13679e3700dfSgww do_getkmask(void)
13687c478bd9Sstevel@tonic-gate {
13697c478bd9Sstevel@tonic-gate au_mask_t pmask;
13707c478bd9Sstevel@tonic-gate
1371*f8994074SJan Friedel eauditon(A_GETKMASK, (caddr_t)&pmask, sizeof (pmask));
1372*f8994074SJan Friedel print_mask(gettext("active non-attributable audit flags"), &pmask);
1373*f8994074SJan Friedel }
1374*f8994074SJan Friedel
1375*f8994074SJan Friedel /*
1376*f8994074SJan Friedel * do_getnaflags() - the printed value is for the global zone unless
1377*f8994074SJan Friedel * AUDIT_PERZONE is set.
1378*f8994074SJan Friedel */
1379*f8994074SJan Friedel static void
do_getnaflags(void)1380*f8994074SJan Friedel do_getnaflags(void)
1381*f8994074SJan Friedel {
1382*f8994074SJan Friedel au_mask_t namask;
1383*f8994074SJan Friedel char *namask_cfg;
1384*f8994074SJan Friedel
1385*f8994074SJan Friedel eauditon(A_GETKMASK, (caddr_t)&namask, sizeof (namask));
1386*f8994074SJan Friedel print_mask(gettext("active non-attributable audit flags"), &namask);
1387*f8994074SJan Friedel
1388*f8994074SJan Friedel if (!do_getnaflags_scf(&namask_cfg) || namask_cfg == NULL) {
1389*f8994074SJan Friedel exit_error(gettext("Could not get configured value."));
1390*f8994074SJan Friedel }
1391*f8994074SJan Friedel egetauditflagsbin(namask_cfg, &namask);
1392*f8994074SJan Friedel print_mask(gettext("configured non-attributable audit flags"), &namask);
1393*f8994074SJan 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
do_getpolicy(void)14019e3700dfSgww do_getpolicy(void)
14027c478bd9Sstevel@tonic-gate {
14037c478bd9Sstevel@tonic-gate 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
do_getpinfo(char * pid_str)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
14437c478bd9Sstevel@tonic-gate /*
1444*f8994074SJan Friedel * do_getplugin() - print plugin configuration.
1445*f8994074SJan Friedel */
1446*f8994074SJan Friedel static void
do_getplugin(char * plugin_str)1447*f8994074SJan Friedel do_getplugin(char *plugin_str)
1448*f8994074SJan Friedel {
1449*f8994074SJan Friedel scf_plugin_kva_node_t *plugin_kva_ll;
1450*f8994074SJan Friedel scf_plugin_kva_node_t *plugin_kva_ll_head;
1451*f8994074SJan Friedel
1452*f8994074SJan Friedel if (!do_getpluginconfig_scf(plugin_str, &plugin_kva_ll)) {
1453*f8994074SJan Friedel exit_error(gettext("Could not get plugin configuration."));
1454*f8994074SJan Friedel }
1455*f8994074SJan Friedel
1456*f8994074SJan Friedel plugin_kva_ll_head = plugin_kva_ll;
1457*f8994074SJan Friedel
1458*f8994074SJan Friedel while (plugin_kva_ll != NULL) {
1459*f8994074SJan Friedel print_plugin(plugin_kva_ll->plugin_name,
1460*f8994074SJan Friedel plugin_kva_ll->plugin_kva);
1461*f8994074SJan Friedel plugin_kva_ll = plugin_kva_ll->next;
1462*f8994074SJan Friedel if (plugin_kva_ll != NULL) {
1463*f8994074SJan Friedel (void) printf("\n");
1464*f8994074SJan Friedel }
1465*f8994074SJan Friedel }
1466*f8994074SJan Friedel plugin_kva_ll_free(plugin_kva_ll_head);
1467*f8994074SJan Friedel }
1468*f8994074SJan Friedel
1469*f8994074SJan Friedel /*
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
do_getqbufsz(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"),
14947c478bd9Sstevel@tonic-gate 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
do_getqctrl(void)15039e3700dfSgww do_getqctrl(void)
15047c478bd9Sstevel@tonic-gate {
15057c478bd9Sstevel@tonic-gate struct au_qctrl qctrl;
15067c478bd9Sstevel@tonic-gate
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 }
15418523fda3SJan Friedel
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"),
15487c478bd9Sstevel@tonic-gate qctrl.aq_bufsz);
15498523fda3SJan Friedel (void) printf(gettext("active audit queue delay (ticks) = %ld\n"),
15507c478bd9Sstevel@tonic-gate 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
do_getqdelay(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"),
15787c478bd9Sstevel@tonic-gate 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
do_getqhiwater(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
do_getqlowater(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."));
16217c478bd9Sstevel@tonic-gate }
16227c478bd9Sstevel@tonic-gate
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
16328523fda3SJan Friedel 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);
16358523fda3SJan Friedel }
16368523fda3SJan Friedel
16378523fda3SJan Friedel /*
16388523fda3SJan Friedel * do_getasid() - print out the audit session-ID.
16398523fda3SJan Friedel */
16407c478bd9Sstevel@tonic-gate static void
do_getasid(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
do_getstat(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",
16839e3700dfSgww offset[0] - 1, gettext("gen"),
16849e3700dfSgww offset[1] - offset[0] -1, gettext("nona"),
16859e3700dfSgww offset[2] - offset[1] -1, gettext("kern"),
16869e3700dfSgww offset[3] - offset[2] -1, gettext("aud"),
16879e3700dfSgww offset[4] - offset[3] -1, gettext("ctl"),
16889e3700dfSgww offset[5] - offset[4] -1, gettext("enq"),
16899e3700dfSgww offset[6] - offset[5] -1, gettext("wrtn"),
16909e3700dfSgww offset[7] - offset[6] -1, gettext("wblk"),
16919e3700dfSgww offset[8] - offset[7] -1, gettext("rblk"),
16929e3700dfSgww offset[9] - offset[8] -1, gettext("drop"),
16939e3700dfSgww offset[10] - offset[9] -1, gettext("tot"),
16949e3700dfSgww 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
do_gettermid(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
do_lsevent(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",
17377c478bd9Sstevel@tonic-gate 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
do_lspolicy(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,
17587c478bd9Sstevel@tonic-gate gettext(policy_table[i].policy_desc));
17597c478bd9Sstevel@tonic-gate }
176045916cd2Sjpk }
17617c478bd9Sstevel@tonic-gate
17628523fda3SJan Friedel /*
17638523fda3SJan Friedel * do_setasid() - execute shell or cmd with specified session-ID.
17648523fda3SJan Friedel */
17657c478bd9Sstevel@tonic-gate static void
do_setasid(char * sid_str,char ** argv)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
do_setaudit(char * user_str,char * mask_str,char * tid_str,char * sid_str,char ** argv)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);
1790*f8994074SJan Friedel egetauditflagsbin(mask_str, &ai.ai_mask),
17917c478bd9Sstevel@tonic-gate 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
do_setauid(char * user,char ** argv)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
do_setpmask(char * pid_str,au_mask_t * mask)1816*f8994074SJan Friedel do_setpmask(char *pid_str, au_mask_t *mask)
18177c478bd9Sstevel@tonic-gate {
18187c478bd9Sstevel@tonic-gate struct auditpinfo ap;
18197c478bd9Sstevel@tonic-gate
1820*f8994074SJan Friedel if (strisnum(pid_str)) {
18217c478bd9Sstevel@tonic-gate ap.ap_pid = (pid_t)atoi(pid_str);
1822*f8994074SJan Friedel } else {
18237c478bd9Sstevel@tonic-gate exit_usage(1);
1824*f8994074SJan Friedel }
18257c478bd9Sstevel@tonic-gate
1826*f8994074SJan Friedel ap.ap_mask.am_success = mask->am_success;
1827*f8994074SJan Friedel ap.ap_mask.am_failure = mask->am_failure;
18287c478bd9Sstevel@tonic-gate
1829*f8994074SJan 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
do_setsmask(char * asid_str,au_mask_t * mask)1838*f8994074SJan Friedel do_setsmask(char *asid_str, au_mask_t *mask)
18397c478bd9Sstevel@tonic-gate {
18407c478bd9Sstevel@tonic-gate struct auditinfo ainfo;
18417c478bd9Sstevel@tonic-gate
1842*f8994074SJan Friedel if (strisnum(asid_str)) {
1843d0fa49b7STony Nguyen ainfo.ai_asid = (au_asid_t)atoi(asid_str);
1844*f8994074SJan Friedel } else {
18457c478bd9Sstevel@tonic-gate exit_usage(1);
1846*f8994074SJan Friedel }
18477c478bd9Sstevel@tonic-gate
1848*f8994074SJan Friedel ainfo.ai_mask.am_success = mask->am_success;
1849*f8994074SJan Friedel ainfo.ai_mask.am_failure = mask->am_failure;
18507c478bd9Sstevel@tonic-gate
1851*f8994074SJan 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
do_setumask(char * auid_str,au_mask_t * mask)1860*f8994074SJan Friedel do_setumask(char *auid_str, au_mask_t *mask)
18617c478bd9Sstevel@tonic-gate {
18627c478bd9Sstevel@tonic-gate struct auditinfo ainfo;
18637c478bd9Sstevel@tonic-gate
1864*f8994074SJan Friedel if (strisnum(auid_str)) {
1865d0fa49b7STony Nguyen ainfo.ai_auid = (au_id_t)atoi(auid_str);
1866*f8994074SJan Friedel } else {
18677c478bd9Sstevel@tonic-gate exit_usage(1);
1868*f8994074SJan Friedel }
18697c478bd9Sstevel@tonic-gate
1870*f8994074SJan Friedel ainfo.ai_mask.am_success = mask->am_success;
1871*f8994074SJan Friedel ainfo.ai_mask.am_failure = mask->am_failure;
18727c478bd9Sstevel@tonic-gate
1873*f8994074SJan 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
do_setstat(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
1897*f8994074SJan 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
1903*f8994074SJan 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
do_setclass(char * event_str,au_mask_t * mask)1907*f8994074SJan 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
1913*f8994074SJan Friedel if (strisnum(event_str)) {
19147c478bd9Sstevel@tonic-gate event = (uint_t)atol(event_str);
1915*f8994074SJan Friedel } else {
1916*f8994074SJan Friedel if ((evp = egetauevnam(event_str)) != NULL) {
19177c478bd9Sstevel@tonic-gate event = evp->ae_number;
19187c478bd9Sstevel@tonic-gate }
19197c478bd9Sstevel@tonic-gate }
19207c478bd9Sstevel@tonic-gate
19217c478bd9Sstevel@tonic-gate ec.ec_number = event;
1922*f8994074SJan Friedel ec.ec_class = (mask->am_success | mask->am_failure);
1923*f8994074SJan Friedel
1924*f8994074SJan Friedel eauditon(A_SETCLASS, (caddr_t)&ec, sizeof (ec));
19257c478bd9Sstevel@tonic-gate }
19267c478bd9Sstevel@tonic-gate
19277c478bd9Sstevel@tonic-gate /*
1928*f8994074SJan Friedel * do_setflags() - set configured and active default user preselection masks;
1929*f8994074SJan Friedel * valid per zone if AUDIT_PERZONE is set, else only in global zone.
1930*f8994074SJan Friedel */
1931*f8994074SJan Friedel static void
do_setflags(char * audit_flags,au_mask_t * amask)1932*f8994074SJan Friedel do_setflags(char *audit_flags, au_mask_t *amask)
1933*f8994074SJan Friedel {
1934*f8994074SJan Friedel eauditon(A_SETAMASK, (caddr_t)amask, sizeof (*amask));
1935*f8994074SJan Friedel
1936*f8994074SJan Friedel if (!do_setflags_scf(audit_flags)) {
1937*f8994074SJan Friedel print_mask(gettext("active user default audit flags"), amask);
1938*f8994074SJan Friedel exit_error(gettext("Could not store configuration value."));
1939*f8994074SJan Friedel }
1940*f8994074SJan Friedel print_mask(gettext("user default audit flags"), amask);
1941*f8994074SJan Friedel }
1942*f8994074SJan Friedel
1943*f8994074SJan Friedel /*
1944*f8994074SJan 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
do_setkmask(au_mask_t * pmask)1948*f8994074SJan Friedel do_setkmask(au_mask_t *pmask)
19497c478bd9Sstevel@tonic-gate {
1950*f8994074SJan Friedel eauditon(A_SETKMASK, (caddr_t)pmask, sizeof (*pmask));
1951*f8994074SJan Friedel print_mask(gettext("active non-attributable audit flags"), pmask);
1952*f8994074SJan Friedel }
19537c478bd9Sstevel@tonic-gate
1954*f8994074SJan Friedel /*
1955*f8994074SJan Friedel * do_setnaflags() - set configured and active non-attributable selection flags
1956*f8994074SJan Friedel * of machine; valid per zone if AUDIT_PERZONE is set, else only in global zone.
1957*f8994074SJan Friedel */
1958*f8994074SJan Friedel static void
do_setnaflags(char * audit_naflags,au_mask_t * namask)1959*f8994074SJan Friedel do_setnaflags(char *audit_naflags, au_mask_t *namask)
1960*f8994074SJan Friedel {
1961*f8994074SJan Friedel eauditon(A_SETKMASK, (caddr_t)namask, sizeof (*namask));
1962*f8994074SJan Friedel
1963*f8994074SJan Friedel if (!do_setnaflags_scf(audit_naflags)) {
1964*f8994074SJan Friedel print_mask(
1965*f8994074SJan Friedel gettext("active non-attributable audit flags"), namask);
1966*f8994074SJan Friedel exit_error(gettext("Could not store configuration value."));
1967*f8994074SJan Friedel }
1968*f8994074SJan Friedel print_mask(gettext("non-attributable audit flags"), namask);
1969*f8994074SJan Friedel }
1970*f8994074SJan Friedel
1971*f8994074SJan Friedel /*
1972*f8994074SJan Friedel * do_setplugin() - set the given plugin plugin_str configuration values.
1973*f8994074SJan Friedel */
1974*f8994074SJan Friedel static void
do_setplugin(char * plugin_str,boolean_t plugin_state,char * plugin_attr,int plugin_qsize)1975*f8994074SJan Friedel do_setplugin(char *plugin_str, boolean_t plugin_state, char *plugin_attr,
1976*f8994074SJan Friedel int plugin_qsize)
1977*f8994074SJan Friedel {
1978*f8994074SJan Friedel if (!do_setpluginconfig_scf(plugin_str, plugin_state, plugin_attr,
1979*f8994074SJan Friedel plugin_qsize)) {
1980*f8994074SJan Friedel exit_error(gettext("Could not set plugin configuration."));
1981*f8994074SJan 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
do_setpolicy(char * policy_str)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."),
20157c478bd9Sstevel@tonic-gate 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
do_setqbufsz(char * bufsz)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
do_setqctrl(char * hiwater,char * lowater,char * bufsz,char * delay)20579e3700dfSgww do_setqctrl(char *hiwater, char *lowater, char *bufsz, char *delay)
20587c478bd9Sstevel@tonic-gate {
20597c478bd9Sstevel@tonic-gate struct au_qctrl qctrl;
20607c478bd9Sstevel@tonic-gate
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 }
20888523fda3SJan Friedel
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
do_setqdelay(char * delay)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
do_setqhiwater(char * hiwater)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
do_setqlowater(char * lowater)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
eauditon(int cmd,caddr_t data,int length)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
egetauid(au_id_t * auid)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
egetaudit(auditinfo_addr_t * ai,int size)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
egetkaudit(auditinfo_addr_t * ai,int size)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
esetkaudit(auditinfo_addr_t * ai,int size)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
egetauditflagsbin(char * auditflags,au_mask_t * pmask)22089e3700dfSgww egetauditflagsbin(char *auditflags, au_mask_t *pmask)
22097c478bd9Sstevel@tonic-gate {
2210*f8994074SJan Friedel if (strcmp(auditflags, "none") == 0) {
22117c478bd9Sstevel@tonic-gate pmask->am_success = pmask->am_failure = 0;
22127c478bd9Sstevel@tonic-gate return;
2213*f8994074SJan Friedel }
22147c478bd9Sstevel@tonic-gate
22157c478bd9Sstevel@tonic-gate if (getauditflagsbin(auditflags, pmask) < 0) {
22167c478bd9Sstevel@tonic-gate exit_error(gettext("Could not get audit flags (%s)"),
22177c478bd9Sstevel@tonic-gate auditflags);
22187c478bd9Sstevel@tonic-gate }
22197c478bd9Sstevel@tonic-gate }
22207c478bd9Sstevel@tonic-gate
2221*f8994074SJan Friedel static void
echkflags(char * auditflags,au_mask_t * mask)2222*f8994074SJan Friedel echkflags(char *auditflags, au_mask_t *mask)
2223*f8994074SJan Friedel {
2224*f8994074SJan Friedel char *err = "";
2225*f8994074SJan Friedel char *err_ptr;
2226*f8994074SJan Friedel
2227*f8994074SJan Friedel if (!__chkflags(auditflags, mask, B_FALSE, &err)) {
2228*f8994074SJan Friedel err_ptr = err;
2229*f8994074SJan Friedel while (*err_ptr != ',' && *err_ptr != '\0') {
2230*f8994074SJan Friedel err_ptr++;
2231*f8994074SJan Friedel }
2232*f8994074SJan Friedel *err_ptr = '\0';
2233*f8994074SJan Friedel exit_error(gettext("Unknown audit flags and/or prefixes "
2234*f8994074SJan Friedel "encountered: %s"), err);
2235*f8994074SJan Friedel }
2236*f8994074SJan Friedel }
2237*f8994074SJan Friedel
22387c478bd9Sstevel@tonic-gate static au_event_ent_t *
egetauevnum(au_event_t event_number)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"),
22457c478bd9Sstevel@tonic-gate 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 *
egetauevnam(char * event_name)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
esetauid(au_id_t * auid)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
esetaudit(auditinfo_addr_t * ai,int size)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
get_user_id(char * user)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 *
get_arg_ent(char * arg_str)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
arg_ent_compare(const void * aep1,const void * aep2)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
str2tid(char * tid_str,au_tid_addr_t * tp)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)) {
23737c478bd9Sstevel@tonic-gate if (inet_pton(AF_INET, host_str, &ibuf)) {
23747c478bd9Sstevel@tonic-gate tp->at_addr[0] = ibuf;
23757c478bd9Sstevel@tonic-gate tp->at_type = AU_IPv4;
23767c478bd9Sstevel@tonic-gate } else if (inet_pton(AF_INET6, host_str, ibuf6)) {
23777c478bd9Sstevel@tonic-gate tp->at_addr[0] = ibuf6[0];
23787c478bd9Sstevel@tonic-gate tp->at_addr[1] = ibuf6[1];
23797c478bd9Sstevel@tonic-gate tp->at_addr[2] = ibuf6[2];
23807c478bd9Sstevel@tonic-gate tp->at_addr[3] = ibuf6[3];
23817c478bd9Sstevel@tonic-gate tp->at_type = AU_IPv6;
23827c478bd9Sstevel@tonic-gate }
23837c478bd9Sstevel@tonic-gate } else {
23847c478bd9Sstevel@tonic-gate phe = getipnodebyname((const void *)host_str,
23857c478bd9Sstevel@tonic-gate AF_INET, 0, &err);
23867c478bd9Sstevel@tonic-gate if (phe == 0) {
23877c478bd9Sstevel@tonic-gate phe = getipnodebyname((const void *)host_str,
23887c478bd9Sstevel@tonic-gate 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],
23957c478bd9Sstevel@tonic-gate 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],
24007c478bd9Sstevel@tonic-gate 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 *
cond2str(void)24109e3700dfSgww cond2str(void)
24117c478bd9Sstevel@tonic-gate {
24129e3700dfSgww uint_t cond;
24137c478bd9Sstevel@tonic-gate
2414*f8994074SJan Friedel eauditon(A_GETCOND, (caddr_t)&cond, sizeof (cond));
24159e3700dfSgww
24169e3700dfSgww switch (cond) {
24179e3700dfSgww
24189e3700dfSgww case AUC_AUDITING:
24199e3700dfSgww return ("auditing");
24209e3700dfSgww
24219e3700dfSgww case AUC_NOAUDIT:
24229e3700dfSgww case AUC_INIT_AUDIT:
24239e3700dfSgww return ("noaudit");
24249e3700dfSgww
24259e3700dfSgww case AUC_UNSET:
24269e3700dfSgww return ("unset");
24279e3700dfSgww
24289e3700dfSgww case AUC_NOSPACE:
24299e3700dfSgww return ("nospace");
24309e3700dfSgww
24319e3700dfSgww default:
24329e3700dfSgww return ("");
24337c478bd9Sstevel@tonic-gate }
24347c478bd9Sstevel@tonic-gate }
24357c478bd9Sstevel@tonic-gate
24369e3700dfSgww /*
24379e3700dfSgww * exit = 0, success
24389e3700dfSgww * 1, error
24399e3700dfSgww * 2, bad zone
24409e3700dfSgww */
24417c478bd9Sstevel@tonic-gate static int
str2policy(char * policy_str,uint32_t * policy_mask)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;
24697c478bd9Sstevel@tonic-gate }
24707c478bd9Sstevel@tonic-gate }
24719e3700dfSgww }
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;
25097c478bd9Sstevel@tonic-gate }
25109e3700dfSgww }
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
policy2str(uint32_t policy,char * policy_str,size_t len)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
strisnum(char * s)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
strisipaddr(char * s)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
chk_arg_len(char * argv,uint_t len)2616*f8994074SJan Friedel chk_arg_len(char *argv, uint_t len)
26177c478bd9Sstevel@tonic-gate {
2618*f8994074SJan Friedel if ((strlen(argv) + 1) > len) {
2619*f8994074SJan Friedel *(argv + len - 1) = '\0';
2620*f8994074SJan Friedel exit_error(gettext("Argument too long (%s..)."), argv);
2621*f8994074SJan Friedel }
26227c478bd9Sstevel@tonic-gate }
26237c478bd9Sstevel@tonic-gate
26247c478bd9Sstevel@tonic-gate static void
chk_event_num(int etype,au_event_t event)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
chk_event_str(int etype,char * event_str)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"
26597c478bd9Sstevel@tonic-gate "\t\"%s\" appears to be a user level event. "
26609e3700dfSgww "Check configuration."), event_str);
26617c478bd9Sstevel@tonic-gate } else if (etype == AC_USER_EVENT &&
26627c478bd9Sstevel@tonic-gate (evp->ae_number < as.as_numevent)) {
26638523fda3SJan Friedel exit_error(gettext(
26648523fda3SJan Friedel "Invalid user audit event string specified.\n"
26657c478bd9Sstevel@tonic-gate "\t\"%s\" appears to be a kernel event. "
26669e3700dfSgww "Check configuration."), event_str);
26677c478bd9Sstevel@tonic-gate }
26687c478bd9Sstevel@tonic-gate }
26697c478bd9Sstevel@tonic-gate
26707c478bd9Sstevel@tonic-gate static void
chk_known_plugin(char * plugin_str)2671*f8994074SJan Friedel chk_known_plugin(char *plugin_str)
2672*f8994074SJan Friedel {
2673*f8994074SJan Friedel if ((strlen(plugin_str) + 1) > PLUGIN_MAXBUF) {
2674*f8994074SJan Friedel exit_error(gettext("Plugin name too long.\n"));
2675*f8994074SJan Friedel }
2676*f8994074SJan Friedel
2677*f8994074SJan Friedel if (!plugin_avail_scf(plugin_str)) {
2678*f8994074SJan Friedel exit_error(gettext("No such plugin configured: %s"),
2679*f8994074SJan Friedel plugin_str);
2680*f8994074SJan Friedel }
2681*f8994074SJan Friedel }
2682*f8994074SJan Friedel
2683*f8994074SJan Friedel static void
chk_sorf(char * sorf_str)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
chk_retval(char * retval_str)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
execit(char ** argv)26989e3700dfSgww execit(char **argv)
26997c478bd9Sstevel@tonic-gate {
27004e5fbfedStz204579 char *args, *args_pos;
27014e5fbfedStz204579 size_t len = 0;
27024e5fbfedStz204579 size_t n = 0;
27034e5fbfedStz204579 char **argv_pos;
27047c478bd9Sstevel@tonic-gate
27059e3700dfSgww if (*argv) {
27064e5fbfedStz204579 /* concatenate argument array to be passed to sh -c "..." */
27074e5fbfedStz204579 for (argv_pos = argv; *argv_pos; argv_pos++)
27084e5fbfedStz204579 len += strlen(*argv_pos) + 1;
27097c478bd9Sstevel@tonic-gate
27104e5fbfedStz204579 if ((args = malloc(len + 1)) == NULL)
27114e5fbfedStz204579 exit_error(
27128523fda3SJan Friedel gettext("Allocation for command/arguments failed"));
27134e5fbfedStz204579
27144e5fbfedStz204579 args_pos = args;
27154e5fbfedStz204579 for (argv_pos = argv; *argv_pos; argv_pos++) {
27164e5fbfedStz204579 n += snprintf(args_pos, len - n, "%s ", *argv_pos);
27174e5fbfedStz204579 args_pos = args + n;
27184e5fbfedStz204579 }
27194e5fbfedStz204579 /* strip the last space */
27204e5fbfedStz204579 args[strlen(args)] = '\0';
27214e5fbfedStz204579
27224e5fbfedStz204579 (void) execl("/bin/sh", "sh", "-c", args, NULL);
27234e5fbfedStz204579 } else {
27244e5fbfedStz204579 (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
exit_usage(int status)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
print_asid(au_asid_t asid)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
print_auid(au_id_t auid)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
print_mask(char * desc,au_mask_t * pmp)27749e3700dfSgww print_mask(char *desc, au_mask_t *pmp)
27757c478bd9Sstevel@tonic-gate {
27767c478bd9Sstevel@tonic-gate char auflags[512];
27777c478bd9Sstevel@tonic-gate
27787c478bd9Sstevel@tonic-gate if (getauditflagschar(auflags, pmp, NULL) < 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",
27827c478bd9Sstevel@tonic-gate desc, auflags, pmp->am_success, pmp->am_failure);
27837c478bd9Sstevel@tonic-gate }
27847c478bd9Sstevel@tonic-gate
27857c478bd9Sstevel@tonic-gate static void
print_plugin(char * plugin_name,kva_t * plugin_kva)2786*f8994074SJan Friedel print_plugin(char *plugin_name, kva_t *plugin_kva)
2787*f8994074SJan Friedel {
2788*f8994074SJan Friedel char att_str[PLUGIN_MAXATT];
2789*f8994074SJan Friedel boolean_t plugin_active;
2790*f8994074SJan Friedel char *active_str;
2791*f8994074SJan Friedel char *qsize_ptr;
2792*f8994074SJan Friedel int qsize;
2793*f8994074SJan Friedel
2794*f8994074SJan Friedel if ((active_str = kva_match(plugin_kva, "active")) == NULL) {
2795*f8994074SJan Friedel (void) printf(gettext("Audit service configuration error: "
2796*f8994074SJan Friedel "\"active\" property not found\n"));
2797*f8994074SJan Friedel return;
2798*f8994074SJan Friedel }
2799*f8994074SJan Friedel
2800*f8994074SJan Friedel plugin_active = (boolean_t)atoi(active_str);
2801*f8994074SJan Friedel qsize_ptr = kva_match(plugin_kva, "qsize");
2802*f8994074SJan Friedel qsize = atoi(qsize_ptr == NULL ? "-1" : qsize_ptr);
2803*f8994074SJan Friedel
2804*f8994074SJan Friedel (void) printf(gettext("Plugin: %s (%s)\n"), plugin_name,
2805*f8994074SJan Friedel plugin_active ? "active" : "inactive");
2806*f8994074SJan Friedel
2807*f8994074SJan Friedel free_static_att_kva(plugin_kva);
2808*f8994074SJan Friedel
2809*f8994074SJan Friedel switch (_kva2str(plugin_kva, att_str, PLUGIN_MAXATT, "=", ";")) {
2810*f8994074SJan Friedel case 0:
2811*f8994074SJan Friedel (void) printf(gettext("\tAttributes: %s\n"), att_str);
2812*f8994074SJan Friedel break;
2813*f8994074SJan Friedel case 1:
2814*f8994074SJan Friedel exit_error(gettext("Internal error - buffer size too small."));
2815*f8994074SJan Friedel break;
2816*f8994074SJan Friedel default:
2817*f8994074SJan Friedel exit_error(gettext("Internal error."));
2818*f8994074SJan Friedel break;
2819*f8994074SJan Friedel }
2820*f8994074SJan Friedel
2821*f8994074SJan Friedel if (qsize != 0) {
2822*f8994074SJan Friedel (void) printf(gettext("\tQueue size: %d %s\n"), qsize,
2823*f8994074SJan Friedel qsize == -1 ? "(internal error: value not available)" : "");
2824*f8994074SJan Friedel }
2825*f8994074SJan Friedel }
2826*f8994074SJan Friedel
2827*f8994074SJan Friedel static void
print_tid_ex(au_tid_addr_t * tidp)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"),
28527c478bd9Sstevel@tonic-gate major(tidp->at_port), minor(tidp->at_port),
28537c478bd9Sstevel@tonic-gate 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"),
28697c478bd9Sstevel@tonic-gate major(tidp->at_port), minor(tidp->at_port),
28707c478bd9Sstevel@tonic-gate bufp, buf);
28719e3700dfSgww if (phe) {
28727c478bd9Sstevel@tonic-gate freehostent(phe);
28737c478bd9Sstevel@tonic-gate }
28747c478bd9Sstevel@tonic-gate }
28759e3700dfSgww }
28767c478bd9Sstevel@tonic-gate
28777c478bd9Sstevel@tonic-gate static int
str2ipaddr(char * s,uint32_t * addr,uint32_t type)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);
28897c478bd9Sstevel@tonic-gate }
28909e3700dfSgww 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
str2type(char * s,uint_t * type)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
exit_error(char * fmt,...)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