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 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 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 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 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 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 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 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 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 12169e3700dfSgww do_getauid(void) 12177c478bd9Sstevel@tonic-gate { 12187c478bd9Sstevel@tonic-gate au_id_t auid; 12197c478bd9Sstevel@tonic-gate 12207c478bd9Sstevel@tonic-gate egetauid(&auid); 12217c478bd9Sstevel@tonic-gate print_auid(auid); 12227c478bd9Sstevel@tonic-gate } 12237c478bd9Sstevel@tonic-gate 12248523fda3SJan Friedel /* 12258523fda3SJan Friedel * do_getaudit() - print the audit characteristics of the current process. 12268523fda3SJan Friedel */ 12277c478bd9Sstevel@tonic-gate static void 12289e3700dfSgww do_getaudit(void) 12297c478bd9Sstevel@tonic-gate { 12307c478bd9Sstevel@tonic-gate auditinfo_addr_t ai; 12317c478bd9Sstevel@tonic-gate 12327c478bd9Sstevel@tonic-gate egetaudit(&ai, sizeof (ai)); 12337c478bd9Sstevel@tonic-gate print_auid(ai.ai_auid); 12347c478bd9Sstevel@tonic-gate print_mask(gettext("process preselection mask"), &ai.ai_mask); 12357c478bd9Sstevel@tonic-gate print_tid_ex(&ai.ai_termid); 12367c478bd9Sstevel@tonic-gate print_asid(ai.ai_asid); 12377c478bd9Sstevel@tonic-gate } 12387c478bd9Sstevel@tonic-gate 12398523fda3SJan Friedel /* 12408523fda3SJan Friedel * do_getkaudit() - print the audit characteristics of the current zone. 12418523fda3SJan Friedel */ 12427c478bd9Sstevel@tonic-gate static void 12439e3700dfSgww do_getkaudit(void) 12447c478bd9Sstevel@tonic-gate { 12457c478bd9Sstevel@tonic-gate auditinfo_addr_t ai; 12467c478bd9Sstevel@tonic-gate 12477c478bd9Sstevel@tonic-gate egetkaudit(&ai, sizeof (ai)); 12487c478bd9Sstevel@tonic-gate print_auid(ai.ai_auid); 12497c478bd9Sstevel@tonic-gate print_mask(gettext("process preselection mask"), &ai.ai_mask); 12507c478bd9Sstevel@tonic-gate print_tid_ex(&ai.ai_termid); 12517c478bd9Sstevel@tonic-gate print_asid(ai.ai_asid); 12527c478bd9Sstevel@tonic-gate } 12537c478bd9Sstevel@tonic-gate 12547c478bd9Sstevel@tonic-gate /* 12558523fda3SJan Friedel * do_setkaudit() - set IP address_type/address of machine to specified values; 12568523fda3SJan Friedel * valid per zone if AUDIT_PERZONE is set, else only in global zone. 12577c478bd9Sstevel@tonic-gate */ 12587c478bd9Sstevel@tonic-gate static void 12599e3700dfSgww do_setkaudit(char *t, char *s) 12607c478bd9Sstevel@tonic-gate { 12617c478bd9Sstevel@tonic-gate uint_t type; 12627c478bd9Sstevel@tonic-gate auditinfo_addr_t ai; 12637c478bd9Sstevel@tonic-gate 12647c478bd9Sstevel@tonic-gate egetkaudit(&ai, sizeof (ai)); 12657c478bd9Sstevel@tonic-gate (void) str2type(t, &type); 12667c478bd9Sstevel@tonic-gate (void) str2ipaddr(s, &ai.ai_termid.at_addr[0], type); 12677c478bd9Sstevel@tonic-gate ai.ai_termid.at_type = type; 12687c478bd9Sstevel@tonic-gate esetkaudit(&ai, sizeof (ai)); 12697c478bd9Sstevel@tonic-gate } 12707c478bd9Sstevel@tonic-gate 12717c478bd9Sstevel@tonic-gate /* 12728523fda3SJan Friedel * do_getcar() - print the zone-relative root 12737c478bd9Sstevel@tonic-gate */ 12747c478bd9Sstevel@tonic-gate static void 12759e3700dfSgww do_getcar(void) 12767c478bd9Sstevel@tonic-gate { 12777c478bd9Sstevel@tonic-gate char path[MAXPATHLEN]; 12787c478bd9Sstevel@tonic-gate 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 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 13249e3700dfSgww do_getcond(void) 13257c478bd9Sstevel@tonic-gate { 13269e3700dfSgww (void) printf(gettext("audit condition = %s\n"), cond2str()); 13277c478bd9Sstevel@tonic-gate } 13287c478bd9Sstevel@tonic-gate 13297c478bd9Sstevel@tonic-gate /* 13308523fda3SJan Friedel * do_getcwd() - the printed path is relative to the current zone root 13317c478bd9Sstevel@tonic-gate */ 13327c478bd9Sstevel@tonic-gate static void 13339e3700dfSgww do_getcwd(void) 13347c478bd9Sstevel@tonic-gate { 13357c478bd9Sstevel@tonic-gate char path[MAXPATHLEN]; 13367c478bd9Sstevel@tonic-gate 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 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 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 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 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 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 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 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 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 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 15869e3700dfSgww do_getqhiwater(void) 15877c478bd9Sstevel@tonic-gate { 15887c478bd9Sstevel@tonic-gate struct au_qctrl qctrl; 15897c478bd9Sstevel@tonic-gate 15908523fda3SJan Friedel if (!temporary_set) { 15918523fda3SJan Friedel if (!do_getqhiwater_scf(&qctrl.aq_hiwater)) { 15928523fda3SJan Friedel exit_error(gettext("Could not get configured value.")); 15938523fda3SJan Friedel } 15948523fda3SJan Friedel 15958523fda3SJan Friedel if (qctrl.aq_hiwater == 0) { 15968523fda3SJan Friedel (void) printf(gettext( 15978523fda3SJan Friedel "no configured audit queue hiwater mark\n")); 15988523fda3SJan Friedel } else { 15998523fda3SJan Friedel (void) printf(gettext("configured audit queue " 16008523fda3SJan Friedel "hiwater mark (records) = %d\n"), qctrl.aq_hiwater); 16018523fda3SJan Friedel } 16028523fda3SJan Friedel } 16038523fda3SJan Friedel 16047c478bd9Sstevel@tonic-gate eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0); 16058523fda3SJan Friedel (void) printf(gettext("active audit queue hiwater mark " 16068523fda3SJan Friedel "(records) = %d\n"), qctrl.aq_hiwater); 16077c478bd9Sstevel@tonic-gate } 16087c478bd9Sstevel@tonic-gate 16097c478bd9Sstevel@tonic-gate /* 16108523fda3SJan Friedel * do_getqlowater() - print, relative to the current zone, the low water point 16118523fda3SJan Friedel * in undelivered audit records where blocked processes will resume. 16127c478bd9Sstevel@tonic-gate */ 16137c478bd9Sstevel@tonic-gate static void 16149e3700dfSgww do_getqlowater(void) 16157c478bd9Sstevel@tonic-gate { 16167c478bd9Sstevel@tonic-gate struct au_qctrl qctrl; 16177c478bd9Sstevel@tonic-gate 16188523fda3SJan Friedel if (!temporary_set) { 16198523fda3SJan Friedel if (!do_getqlowater_scf(&qctrl.aq_lowater)) { 16208523fda3SJan Friedel exit_error(gettext("Could not get configured value.")); 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 16419e3700dfSgww do_getasid(void) 16427c478bd9Sstevel@tonic-gate { 16437c478bd9Sstevel@tonic-gate auditinfo_addr_t ai; 16447c478bd9Sstevel@tonic-gate 16457c478bd9Sstevel@tonic-gate if (getaudit_addr(&ai, sizeof (ai))) { 16467c478bd9Sstevel@tonic-gate exit_error(gettext("getaudit_addr(2) failed")); 16477c478bd9Sstevel@tonic-gate } 16487c478bd9Sstevel@tonic-gate print_asid(ai.ai_asid); 16497c478bd9Sstevel@tonic-gate } 16507c478bd9Sstevel@tonic-gate 16517c478bd9Sstevel@tonic-gate /* 16528523fda3SJan Friedel * do_getstat() - the printed statistics are for the entire system unless 16538523fda3SJan Friedel * AUDIT_PERZONE is set. 16547c478bd9Sstevel@tonic-gate */ 16557c478bd9Sstevel@tonic-gate static void 16569e3700dfSgww do_getstat(void) 16577c478bd9Sstevel@tonic-gate { 16587c478bd9Sstevel@tonic-gate au_stat_t as; 16599e3700dfSgww int offset[12]; /* used to line the header up correctly */ 16609e3700dfSgww char buf[512]; 16617c478bd9Sstevel@tonic-gate 16627c478bd9Sstevel@tonic-gate eauditon(A_GETSTAT, (caddr_t)&as, 0); 16639e3700dfSgww (void) sprintf(buf, "%4lu %n%4lu %n%4lu %n%4lu %n%4lu %n%4lu %n%4lu " 16649e3700dfSgww "%n%4lu %n%4lu %n%4lu %n%4lu %n%4lu%n", 16659e3700dfSgww (ulong_t)as.as_generated, &(offset[0]), 16669e3700dfSgww (ulong_t)as.as_nonattrib, &(offset[1]), 16679e3700dfSgww (ulong_t)as.as_kernel, &(offset[2]), 16689e3700dfSgww (ulong_t)as.as_audit, &(offset[3]), 16699e3700dfSgww (ulong_t)as.as_auditctl, &(offset[4]), 16709e3700dfSgww (ulong_t)as.as_enqueue, &(offset[5]), 16719e3700dfSgww (ulong_t)as.as_written, &(offset[6]), 16729e3700dfSgww (ulong_t)as.as_wblocked, &(offset[7]), 16739e3700dfSgww (ulong_t)as.as_rblocked, &(offset[8]), 16749e3700dfSgww (ulong_t)as.as_dropped, &(offset[9]), 16759e3700dfSgww (ulong_t)as.as_totalsize / ONEK, &(offset[10]), 16769e3700dfSgww (ulong_t)as.as_memused / ONEK, &(offset[11])); 16779e3700dfSgww 16789e3700dfSgww /* 16799e3700dfSgww * TRANSLATION_NOTE 16809e3700dfSgww * Print a properly aligned header. 16819e3700dfSgww */ 16829e3700dfSgww (void) printf("%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s\n", 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 17039e3700dfSgww do_gettermid(void) 17047c478bd9Sstevel@tonic-gate { 17057c478bd9Sstevel@tonic-gate auditinfo_addr_t ai; 17067c478bd9Sstevel@tonic-gate 17077c478bd9Sstevel@tonic-gate if (getaudit_addr(&ai, sizeof (ai))) { 17087c478bd9Sstevel@tonic-gate exit_error(gettext("getaudit_addr(2) failed")); 17097c478bd9Sstevel@tonic-gate } 17107c478bd9Sstevel@tonic-gate print_tid_ex(&ai.ai_termid); 17117c478bd9Sstevel@tonic-gate } 17127c478bd9Sstevel@tonic-gate 17137c478bd9Sstevel@tonic-gate /* 17148523fda3SJan Friedel * do_lsevent() - display the active kernel and user level audit event 17158523fda3SJan Friedel * information. The printed events are for the global zone unless AUDIT_PERZONE 17168523fda3SJan Friedel * is set. 17177c478bd9Sstevel@tonic-gate */ 17187c478bd9Sstevel@tonic-gate static void 17199e3700dfSgww do_lsevent(void) 17207c478bd9Sstevel@tonic-gate { 17217c478bd9Sstevel@tonic-gate register au_event_ent_t *evp; 17227c478bd9Sstevel@tonic-gate au_mask_t pmask; 17237c478bd9Sstevel@tonic-gate char auflags[256]; 17247c478bd9Sstevel@tonic-gate 17257c478bd9Sstevel@tonic-gate setauevent(); 17269e3700dfSgww if (getauevent() == NULL) { 17278523fda3SJan Friedel exit_error(gettext("NO AUDIT EVENTS: Could not read %s\n."), 17288523fda3SJan Friedel AUDITEVENTFILE); 17297c478bd9Sstevel@tonic-gate } 17307c478bd9Sstevel@tonic-gate 17317c478bd9Sstevel@tonic-gate setauevent(); 17329e3700dfSgww while ((evp = getauevent()) != NULL) { 17337c478bd9Sstevel@tonic-gate pmask.am_success = pmask.am_failure = evp->ae_class; 17347c478bd9Sstevel@tonic-gate if (getauditflagschar(auflags, &pmask, 0) == -1) 17357c478bd9Sstevel@tonic-gate (void) strcpy(auflags, "unknown"); 1736d0fa49b7STony Nguyen (void) printf("%-30s %5hu %s %s\n", 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 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 17669e3700dfSgww do_setasid(char *sid_str, char **argv) 17677c478bd9Sstevel@tonic-gate { 17687c478bd9Sstevel@tonic-gate struct auditinfo_addr ai; 17697c478bd9Sstevel@tonic-gate 17707c478bd9Sstevel@tonic-gate if (getaudit_addr(&ai, sizeof (ai))) { 17717c478bd9Sstevel@tonic-gate exit_error(gettext("getaudit_addr(2) failed")); 17727c478bd9Sstevel@tonic-gate } 17737c478bd9Sstevel@tonic-gate ai.ai_asid = (au_asid_t)atol(sid_str); 17747c478bd9Sstevel@tonic-gate if (setaudit_addr(&ai, sizeof (ai))) { 17757c478bd9Sstevel@tonic-gate exit_error(gettext("setaudit_addr(2) failed")); 17767c478bd9Sstevel@tonic-gate } 17777c478bd9Sstevel@tonic-gate execit(argv); 17787c478bd9Sstevel@tonic-gate } 17797c478bd9Sstevel@tonic-gate 17808523fda3SJan Friedel /* 17818523fda3SJan Friedel * do_setaudit() - execute shell or cmd with specified audit characteristics. 17828523fda3SJan Friedel */ 17837c478bd9Sstevel@tonic-gate static void 17849e3700dfSgww do_setaudit(char *user_str, char *mask_str, char *tid_str, char *sid_str, 17859e3700dfSgww char **argv) 17867c478bd9Sstevel@tonic-gate { 17877c478bd9Sstevel@tonic-gate auditinfo_addr_t ai; 17887c478bd9Sstevel@tonic-gate 17897c478bd9Sstevel@tonic-gate ai.ai_auid = (au_id_t)get_user_id(user_str); 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 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 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 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 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 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 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 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 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 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 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 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 20309e3700dfSgww do_setqbufsz(char *bufsz) 20317c478bd9Sstevel@tonic-gate { 20327c478bd9Sstevel@tonic-gate struct au_qctrl qctrl; 20337c478bd9Sstevel@tonic-gate 20348523fda3SJan Friedel if (!temporary_set) { 20358523fda3SJan Friedel qctrl.aq_bufsz = (size_t)atol(bufsz); 20368523fda3SJan Friedel if (!do_setqbufsz_scf(&qctrl.aq_bufsz)) { 20378523fda3SJan Friedel exit_error(gettext( 20388523fda3SJan Friedel "Could not store configuration value.")); 20398523fda3SJan Friedel } 2040be61b9faSJan Friedel if (qctrl.aq_bufsz == 0) { 2041be61b9faSJan Friedel return; 2042be61b9faSJan Friedel } 20438523fda3SJan Friedel } 20448523fda3SJan Friedel 20457c478bd9Sstevel@tonic-gate eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0); 20468523fda3SJan Friedel qctrl.aq_bufsz = (size_t)atol(bufsz); 20477c478bd9Sstevel@tonic-gate eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0); 20487c478bd9Sstevel@tonic-gate } 20497c478bd9Sstevel@tonic-gate 20507c478bd9Sstevel@tonic-gate /* 20518523fda3SJan Friedel * do_setqctrl() - set the active and configured audit queue write buffer size 20528523fda3SJan Friedel * (bytes), hiwater audit record count, lowater audit record count, and wakeup 20538523fda3SJan Friedel * interval (ticks); active values can be changed per zone if AUDIT_PERZONE is 20548523fda3SJan Friedel * set, else only in global zone. 20557c478bd9Sstevel@tonic-gate */ 20567c478bd9Sstevel@tonic-gate static void 20579e3700dfSgww do_setqctrl(char *hiwater, char *lowater, char *bufsz, char *delay) 20587c478bd9Sstevel@tonic-gate { 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 20989e3700dfSgww do_setqdelay(char *delay) 20997c478bd9Sstevel@tonic-gate { 21007c478bd9Sstevel@tonic-gate struct au_qctrl qctrl; 21017c478bd9Sstevel@tonic-gate 21028523fda3SJan Friedel if (!temporary_set) { 21038523fda3SJan Friedel qctrl.aq_delay = (clock_t)atol(delay); 21048523fda3SJan Friedel if (!do_setqdelay_scf(&qctrl.aq_delay)) { 21058523fda3SJan Friedel exit_error(gettext( 21068523fda3SJan Friedel "Could not store configuration value.")); 21078523fda3SJan Friedel } 2108be61b9faSJan Friedel if (qctrl.aq_delay == 0) { 2109be61b9faSJan Friedel return; 2110be61b9faSJan Friedel } 21118523fda3SJan Friedel } 21128523fda3SJan Friedel 21137c478bd9Sstevel@tonic-gate eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0); 21148523fda3SJan Friedel qctrl.aq_delay = (clock_t)atol(delay); 21157c478bd9Sstevel@tonic-gate eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0); 21167c478bd9Sstevel@tonic-gate } 21177c478bd9Sstevel@tonic-gate 21187c478bd9Sstevel@tonic-gate /* 21198523fda3SJan Friedel * do_setqhiwater() - sets the active and configured number of undelivered audit 21208523fda3SJan Friedel * records in the audit queue at which audit record generation blocks; active 21218523fda3SJan Friedel * values can be changed per zone if AUDIT_PERZONE is set, else only in global 21228523fda3SJan Friedel * zone. 21237c478bd9Sstevel@tonic-gate */ 21247c478bd9Sstevel@tonic-gate static void 21259e3700dfSgww do_setqhiwater(char *hiwater) 21267c478bd9Sstevel@tonic-gate { 21277c478bd9Sstevel@tonic-gate struct au_qctrl qctrl; 21287c478bd9Sstevel@tonic-gate 21298523fda3SJan Friedel if (!temporary_set) { 21308523fda3SJan Friedel qctrl.aq_hiwater = (size_t)atol(hiwater); 21318523fda3SJan Friedel if (!do_setqhiwater_scf(&qctrl.aq_hiwater)) { 21328523fda3SJan Friedel exit_error(gettext( 21338523fda3SJan Friedel "Could not store configuration value.")); 21348523fda3SJan Friedel } 2135be61b9faSJan Friedel if (qctrl.aq_hiwater == 0) { 2136be61b9faSJan Friedel return; 2137be61b9faSJan Friedel } 21388523fda3SJan Friedel } 21398523fda3SJan Friedel 21407c478bd9Sstevel@tonic-gate eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0); 21418523fda3SJan Friedel qctrl.aq_hiwater = (size_t)atol(hiwater); 21427c478bd9Sstevel@tonic-gate eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0); 21437c478bd9Sstevel@tonic-gate } 21447c478bd9Sstevel@tonic-gate 21457c478bd9Sstevel@tonic-gate /* 21468523fda3SJan Friedel * do_setqlowater() - set the active and configured number of undelivered audit 21478523fda3SJan Friedel * records in the audit queue at which blocked auditing processes unblock; 21488523fda3SJan Friedel * active values can be changed per zone if AUDIT_PERZONE is set, else only in 21498523fda3SJan Friedel * global zone. 21507c478bd9Sstevel@tonic-gate */ 21517c478bd9Sstevel@tonic-gate static void 21529e3700dfSgww do_setqlowater(char *lowater) 21537c478bd9Sstevel@tonic-gate { 21547c478bd9Sstevel@tonic-gate struct au_qctrl qctrl; 21557c478bd9Sstevel@tonic-gate 21568523fda3SJan Friedel if (!temporary_set) { 21578523fda3SJan Friedel qctrl.aq_lowater = (size_t)atol(lowater); 21588523fda3SJan Friedel if (!do_setqlowater_scf(&qctrl.aq_lowater)) { 21598523fda3SJan Friedel exit_error(gettext( 21608523fda3SJan Friedel "Could not store configuration value.")); 21618523fda3SJan Friedel } 2162be61b9faSJan Friedel if (qctrl.aq_lowater == 0) { 2163be61b9faSJan Friedel return; 2164be61b9faSJan Friedel } 21658523fda3SJan Friedel } 21668523fda3SJan Friedel 21677c478bd9Sstevel@tonic-gate eauditon(A_GETQCTRL, (caddr_t)&qctrl, 0); 21688523fda3SJan Friedel qctrl.aq_lowater = (size_t)atol(lowater); 21697c478bd9Sstevel@tonic-gate eauditon(A_SETQCTRL, (caddr_t)&qctrl, 0); 21707c478bd9Sstevel@tonic-gate } 21717c478bd9Sstevel@tonic-gate 21727c478bd9Sstevel@tonic-gate static void 21739e3700dfSgww eauditon(int cmd, caddr_t data, int length) 21747c478bd9Sstevel@tonic-gate { 21757c478bd9Sstevel@tonic-gate if (auditon(cmd, data, length) == -1) 21767c478bd9Sstevel@tonic-gate exit_error(gettext("auditon(2) failed.")); 21777c478bd9Sstevel@tonic-gate } 21787c478bd9Sstevel@tonic-gate 21797c478bd9Sstevel@tonic-gate static void 21809e3700dfSgww egetauid(au_id_t *auid) 21817c478bd9Sstevel@tonic-gate { 21827c478bd9Sstevel@tonic-gate if (getauid(auid) == -1) 21837c478bd9Sstevel@tonic-gate exit_error(gettext("getauid(2) failed.")); 21847c478bd9Sstevel@tonic-gate } 21857c478bd9Sstevel@tonic-gate 21867c478bd9Sstevel@tonic-gate static void 21879e3700dfSgww egetaudit(auditinfo_addr_t *ai, int size) 21887c478bd9Sstevel@tonic-gate { 21897c478bd9Sstevel@tonic-gate if (getaudit_addr(ai, size) == -1) 21907c478bd9Sstevel@tonic-gate exit_error(gettext("getaudit_addr(2) failed.")); 21917c478bd9Sstevel@tonic-gate } 21927c478bd9Sstevel@tonic-gate 21937c478bd9Sstevel@tonic-gate static void 21949e3700dfSgww egetkaudit(auditinfo_addr_t *ai, int size) 21957c478bd9Sstevel@tonic-gate { 21967c478bd9Sstevel@tonic-gate if (auditon(A_GETKAUDIT, (char *)ai, size) < 0) 21977c478bd9Sstevel@tonic-gate exit_error(gettext("auditon: A_GETKAUDIT failed.")); 21987c478bd9Sstevel@tonic-gate } 21997c478bd9Sstevel@tonic-gate 22007c478bd9Sstevel@tonic-gate static void 22019e3700dfSgww esetkaudit(auditinfo_addr_t *ai, int size) 22027c478bd9Sstevel@tonic-gate { 22037c478bd9Sstevel@tonic-gate if (auditon(A_SETKAUDIT, (char *)ai, size) < 0) 22047c478bd9Sstevel@tonic-gate exit_error(gettext("auditon: A_SETKAUDIT failed.")); 22057c478bd9Sstevel@tonic-gate } 22067c478bd9Sstevel@tonic-gate 22077c478bd9Sstevel@tonic-gate static void 22089e3700dfSgww egetauditflagsbin(char *auditflags, au_mask_t *pmask) 22097c478bd9Sstevel@tonic-gate { 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 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 * 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 * 22529e3700dfSgww egetauevnam(char *event_name) 22537c478bd9Sstevel@tonic-gate { 22547c478bd9Sstevel@tonic-gate register au_event_ent_t *evp; 22557c478bd9Sstevel@tonic-gate 22569e3700dfSgww if ((evp = getauevnam(event_name)) == NULL) 22577c478bd9Sstevel@tonic-gate exit_error(gettext("Could not get audit event %s"), event_name); 22587c478bd9Sstevel@tonic-gate 22597c478bd9Sstevel@tonic-gate return (evp); 22607c478bd9Sstevel@tonic-gate } 22617c478bd9Sstevel@tonic-gate 22627c478bd9Sstevel@tonic-gate static void 22639e3700dfSgww esetauid(au_id_t *auid) 22647c478bd9Sstevel@tonic-gate { 22657c478bd9Sstevel@tonic-gate if (setauid(auid) == -1) 22667c478bd9Sstevel@tonic-gate exit_error(gettext("setauid(2) failed.")); 22677c478bd9Sstevel@tonic-gate } 22687c478bd9Sstevel@tonic-gate 22697c478bd9Sstevel@tonic-gate static void 22709e3700dfSgww esetaudit(auditinfo_addr_t *ai, int size) 22717c478bd9Sstevel@tonic-gate { 22727c478bd9Sstevel@tonic-gate if (setaudit_addr(ai, size) == -1) 22737c478bd9Sstevel@tonic-gate exit_error(gettext("setaudit_addr(2) failed.")); 22747c478bd9Sstevel@tonic-gate } 22757c478bd9Sstevel@tonic-gate 22767c478bd9Sstevel@tonic-gate static uid_t 22779e3700dfSgww get_user_id(char *user) 22787c478bd9Sstevel@tonic-gate { 22797c478bd9Sstevel@tonic-gate struct passwd *pwd; 22807c478bd9Sstevel@tonic-gate uid_t uid; 22817c478bd9Sstevel@tonic-gate 22827c478bd9Sstevel@tonic-gate if (isdigit(*user)) { 22837c478bd9Sstevel@tonic-gate uid = atoi(user); 22849e3700dfSgww if ((pwd = getpwuid(uid)) == NULL) { 22857c478bd9Sstevel@tonic-gate exit_error(gettext("Invalid user: %s"), user); 22867c478bd9Sstevel@tonic-gate } 22877c478bd9Sstevel@tonic-gate } else { 22889e3700dfSgww if ((pwd = getpwnam(user)) == NULL) { 22897c478bd9Sstevel@tonic-gate exit_error(gettext("Invalid user: %s"), user); 22907c478bd9Sstevel@tonic-gate } 22917c478bd9Sstevel@tonic-gate } 22927c478bd9Sstevel@tonic-gate 22937c478bd9Sstevel@tonic-gate return (pwd->pw_uid); 22947c478bd9Sstevel@tonic-gate } 22957c478bd9Sstevel@tonic-gate 22967c478bd9Sstevel@tonic-gate /* 22977c478bd9Sstevel@tonic-gate * get_arg_ent() 22987c478bd9Sstevel@tonic-gate * Inputs: command line argument string 22998523fda3SJan Friedel * Returns ptr to struct arg_entry if found; null, if not found 23007c478bd9Sstevel@tonic-gate */ 23018523fda3SJan Friedel static arg_entry_t * 23029e3700dfSgww get_arg_ent(char *arg_str) 23037c478bd9Sstevel@tonic-gate { 23048523fda3SJan Friedel arg_entry_t key; 23057c478bd9Sstevel@tonic-gate 23067c478bd9Sstevel@tonic-gate key.arg_str = arg_str; 23077c478bd9Sstevel@tonic-gate 23088523fda3SJan Friedel return ((arg_entry_t *)bsearch((char *)&key, (char *)arg_table, 23098523fda3SJan Friedel ARG_TBL_SZ, sizeof (arg_entry_t), arg_ent_compare)); 23107c478bd9Sstevel@tonic-gate } 23117c478bd9Sstevel@tonic-gate 23127c478bd9Sstevel@tonic-gate /* 23137c478bd9Sstevel@tonic-gate * arg_ent_compare() 23147c478bd9Sstevel@tonic-gate * Compares two command line arguments to determine which is 23157c478bd9Sstevel@tonic-gate * lexicographically greater. 23167c478bd9Sstevel@tonic-gate * Inputs: two argument map table entry pointers 23177c478bd9Sstevel@tonic-gate * Returns: > 1: aep1->arg_str > aep2->arg_str 23187c478bd9Sstevel@tonic-gate * < 1: aep1->arg_str < aep2->arg_str 23197c478bd9Sstevel@tonic-gate * 0: aep1->arg_str = aep->arg_str2 23207c478bd9Sstevel@tonic-gate */ 23217c478bd9Sstevel@tonic-gate static int 23229e3700dfSgww arg_ent_compare(const void *aep1, const void *aep2) 23237c478bd9Sstevel@tonic-gate { 23248523fda3SJan Friedel return (strcmp(((arg_entry_t *)aep1)->arg_str, 23258523fda3SJan Friedel ((arg_entry_t *)aep2)->arg_str)); 23267c478bd9Sstevel@tonic-gate } 23277c478bd9Sstevel@tonic-gate 23287c478bd9Sstevel@tonic-gate /* 23297c478bd9Sstevel@tonic-gate * tid_str is major,minor,host -- host is a name or an ip address 23307c478bd9Sstevel@tonic-gate */ 23317c478bd9Sstevel@tonic-gate static void 23327c478bd9Sstevel@tonic-gate str2tid(char *tid_str, au_tid_addr_t *tp) 23337c478bd9Sstevel@tonic-gate { 23349e3700dfSgww char *major_str; 23359e3700dfSgww char *minor_str; 23369e3700dfSgww char *host_str = NULL; 23377c478bd9Sstevel@tonic-gate major_t major = 0; 23387c478bd9Sstevel@tonic-gate major_t minor = 0; 23397c478bd9Sstevel@tonic-gate dev_t dev = 0; 23407c478bd9Sstevel@tonic-gate struct hostent *phe; 23417c478bd9Sstevel@tonic-gate int err; 23427c478bd9Sstevel@tonic-gate uint32_t ibuf; 23437c478bd9Sstevel@tonic-gate uint32_t ibuf6[4]; 23447c478bd9Sstevel@tonic-gate 23457c478bd9Sstevel@tonic-gate tp->at_port = 0; 23467c478bd9Sstevel@tonic-gate tp->at_type = 0; 23477c478bd9Sstevel@tonic-gate bzero(tp->at_addr, 16); 23487c478bd9Sstevel@tonic-gate 23497c478bd9Sstevel@tonic-gate major_str = tid_str; 23507c478bd9Sstevel@tonic-gate if ((minor_str = strchr(tid_str, ',')) != NULL) { 23517c478bd9Sstevel@tonic-gate *minor_str = '\0'; 23527c478bd9Sstevel@tonic-gate minor_str++; 23537c478bd9Sstevel@tonic-gate } 23547c478bd9Sstevel@tonic-gate 23559e3700dfSgww if (minor_str) { 23567c478bd9Sstevel@tonic-gate if ((host_str = strchr(minor_str, ',')) != NULL) { 23577c478bd9Sstevel@tonic-gate *host_str = '\0'; 23587c478bd9Sstevel@tonic-gate host_str++; 23597c478bd9Sstevel@tonic-gate } 23609e3700dfSgww } 23617c478bd9Sstevel@tonic-gate 23627c478bd9Sstevel@tonic-gate if (major_str) 23637c478bd9Sstevel@tonic-gate major = (major_t)atoi(major_str); 23647c478bd9Sstevel@tonic-gate 23657c478bd9Sstevel@tonic-gate if (minor_str) 23667c478bd9Sstevel@tonic-gate minor = (minor_t)atoi(minor_str); 23677c478bd9Sstevel@tonic-gate 23687c478bd9Sstevel@tonic-gate if ((dev = makedev(major, minor)) != NODEV) 23697c478bd9Sstevel@tonic-gate tp->at_port = dev; 23707c478bd9Sstevel@tonic-gate 23717c478bd9Sstevel@tonic-gate if (host_str) { 23727c478bd9Sstevel@tonic-gate if (strisipaddr(host_str)) { 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 * 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 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 25358523fda3SJan Friedel policy2str(uint32_t policy, char *policy_str, size_t len) 25367c478bd9Sstevel@tonic-gate { 25377c478bd9Sstevel@tonic-gate int i, j; 25387c478bd9Sstevel@tonic-gate 25397c478bd9Sstevel@tonic-gate if (policy == ALL_POLICIES) { 25407c478bd9Sstevel@tonic-gate (void) strcpy(policy_str, "all"); 25417c478bd9Sstevel@tonic-gate return (1); 25427c478bd9Sstevel@tonic-gate } 25437c478bd9Sstevel@tonic-gate 25447c478bd9Sstevel@tonic-gate if (policy == NO_POLICIES) { 25457c478bd9Sstevel@tonic-gate (void) strcpy(policy_str, "none"); 25467c478bd9Sstevel@tonic-gate return (1); 25477c478bd9Sstevel@tonic-gate } 25487c478bd9Sstevel@tonic-gate 25497c478bd9Sstevel@tonic-gate *policy_str = '\0'; 25507c478bd9Sstevel@tonic-gate 255145916cd2Sjpk for (i = 0, j = 0; i < POLICY_TBL_SZ; i++) { 25527c478bd9Sstevel@tonic-gate if (policy & policy_table[i].policy_mask && 25537c478bd9Sstevel@tonic-gate policy_table[i].policy_mask != ALL_POLICIES) { 25549e3700dfSgww if (j++) { 25557c478bd9Sstevel@tonic-gate (void) strcat(policy_str, ","); 25569e3700dfSgww } 25579e3700dfSgww (void) strlcat(policy_str, policy_table[i].policy_str, 25589e3700dfSgww len); 25597c478bd9Sstevel@tonic-gate } 256045916cd2Sjpk } 25617c478bd9Sstevel@tonic-gate 25627c478bd9Sstevel@tonic-gate if (*policy_str) 25637c478bd9Sstevel@tonic-gate return (0); 25647c478bd9Sstevel@tonic-gate 25657c478bd9Sstevel@tonic-gate return (1); 25667c478bd9Sstevel@tonic-gate } 25677c478bd9Sstevel@tonic-gate 25687c478bd9Sstevel@tonic-gate 25697c478bd9Sstevel@tonic-gate static int 25709e3700dfSgww strisnum(char *s) 25717c478bd9Sstevel@tonic-gate { 25729e3700dfSgww if (s == NULL || !*s) 25737c478bd9Sstevel@tonic-gate return (0); 25747c478bd9Sstevel@tonic-gate 25757c478bd9Sstevel@tonic-gate for (; *s == '-' || *s == '+'; s++) 25767c478bd9Sstevel@tonic-gate 25777c478bd9Sstevel@tonic-gate if (!*s) 25787c478bd9Sstevel@tonic-gate return (0); 25797c478bd9Sstevel@tonic-gate 25807c478bd9Sstevel@tonic-gate for (; *s; s++) 25817c478bd9Sstevel@tonic-gate if (!isdigit(*s)) 25827c478bd9Sstevel@tonic-gate return (0); 25837c478bd9Sstevel@tonic-gate 25847c478bd9Sstevel@tonic-gate return (1); 25857c478bd9Sstevel@tonic-gate } 25867c478bd9Sstevel@tonic-gate 25877c478bd9Sstevel@tonic-gate static int 25889e3700dfSgww strisipaddr(char *s) 25897c478bd9Sstevel@tonic-gate { 25907c478bd9Sstevel@tonic-gate int dot = 0; 25917c478bd9Sstevel@tonic-gate int colon = 0; 25927c478bd9Sstevel@tonic-gate 25937c478bd9Sstevel@tonic-gate /* no string */ 25949e3700dfSgww if ((s == NULL) || (!*s)) 25957c478bd9Sstevel@tonic-gate return (0); 25967c478bd9Sstevel@tonic-gate 25977c478bd9Sstevel@tonic-gate for (; *s; s++) { 25987c478bd9Sstevel@tonic-gate if (!(isxdigit(*s) || *s != '.' || *s != ':')) 25997c478bd9Sstevel@tonic-gate return (0); 26009e3700dfSgww if (*s == '.') 26019e3700dfSgww dot++; 26029e3700dfSgww if (*s == ':') 26039e3700dfSgww colon++; 26047c478bd9Sstevel@tonic-gate } 26057c478bd9Sstevel@tonic-gate 26067c478bd9Sstevel@tonic-gate if (dot && colon) 26077c478bd9Sstevel@tonic-gate return (0); 26087c478bd9Sstevel@tonic-gate 26097c478bd9Sstevel@tonic-gate if (!dot && !colon) 26107c478bd9Sstevel@tonic-gate return (0); 26117c478bd9Sstevel@tonic-gate 26127c478bd9Sstevel@tonic-gate return (1); 26137c478bd9Sstevel@tonic-gate } 26147c478bd9Sstevel@tonic-gate 26157c478bd9Sstevel@tonic-gate static void 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 26259e3700dfSgww chk_event_num(int etype, au_event_t event) 26267c478bd9Sstevel@tonic-gate { 26277c478bd9Sstevel@tonic-gate au_stat_t as; 26287c478bd9Sstevel@tonic-gate 26297c478bd9Sstevel@tonic-gate eauditon(A_GETSTAT, (caddr_t)&as, 0); 26307c478bd9Sstevel@tonic-gate 26317c478bd9Sstevel@tonic-gate if (etype == AC_KERN_EVENT) { 26327c478bd9Sstevel@tonic-gate if (event > as.as_numevent) { 26338523fda3SJan Friedel exit_error(gettext( 26348523fda3SJan Friedel "Invalid kernel audit event number specified.\n" 2635d0fa49b7STony Nguyen "\t%hu is outside allowable range 0-%d."), 26367c478bd9Sstevel@tonic-gate event, as.as_numevent); 26377c478bd9Sstevel@tonic-gate } 26389e3700dfSgww } else { 26399e3700dfSgww /* user event */ 26407c478bd9Sstevel@tonic-gate if (event <= as.as_numevent) { 26419e3700dfSgww exit_error(gettext("Invalid user level audit event " 2642d0fa49b7STony Nguyen "number specified %hu."), event); 26437c478bd9Sstevel@tonic-gate } 26447c478bd9Sstevel@tonic-gate } 26457c478bd9Sstevel@tonic-gate } 26467c478bd9Sstevel@tonic-gate 26477c478bd9Sstevel@tonic-gate static void 26489e3700dfSgww chk_event_str(int etype, char *event_str) 26497c478bd9Sstevel@tonic-gate { 26507c478bd9Sstevel@tonic-gate au_event_ent_t *evp; 26517c478bd9Sstevel@tonic-gate au_stat_t as; 26527c478bd9Sstevel@tonic-gate 26537c478bd9Sstevel@tonic-gate eauditon(A_GETSTAT, (caddr_t)&as, 0); 26547c478bd9Sstevel@tonic-gate 26557c478bd9Sstevel@tonic-gate evp = egetauevnam(event_str); 26567c478bd9Sstevel@tonic-gate if (etype == AC_KERN_EVENT && (evp->ae_number > as.as_numevent)) { 26578523fda3SJan Friedel exit_error(gettext( 26588523fda3SJan Friedel "Invalid kernel audit event string specified.\n" 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 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 26849e3700dfSgww chk_sorf(char *sorf_str) 26857c478bd9Sstevel@tonic-gate { 26867c478bd9Sstevel@tonic-gate if (!strisnum(sorf_str)) 26877c478bd9Sstevel@tonic-gate exit_error(gettext("Invalid sorf specified: %s"), sorf_str); 26887c478bd9Sstevel@tonic-gate } 26897c478bd9Sstevel@tonic-gate 26907c478bd9Sstevel@tonic-gate static void 26919e3700dfSgww chk_retval(char *retval_str) 26927c478bd9Sstevel@tonic-gate { 26937c478bd9Sstevel@tonic-gate if (!strisnum(retval_str)) 26947c478bd9Sstevel@tonic-gate exit_error(gettext("Invalid retval specified: %s"), retval_str); 26957c478bd9Sstevel@tonic-gate } 26967c478bd9Sstevel@tonic-gate 26977c478bd9Sstevel@tonic-gate static void 26989e3700dfSgww execit(char **argv) 26997c478bd9Sstevel@tonic-gate { 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 27319e3700dfSgww exit_usage(int status) 27327c478bd9Sstevel@tonic-gate { 27337c478bd9Sstevel@tonic-gate FILE *fp; 27347c478bd9Sstevel@tonic-gate int i; 27357c478bd9Sstevel@tonic-gate 27367c478bd9Sstevel@tonic-gate fp = (status ? stderr : stdout); 27377c478bd9Sstevel@tonic-gate (void) fprintf(fp, gettext("usage: %s option ...\n"), progname); 27387c478bd9Sstevel@tonic-gate 27398523fda3SJan Friedel for (i = 0; i < ARG_TBL_SZ; i++) { 27408523fda3SJan Friedel /* skip the -t option; it's not a standalone option */ 27418523fda3SJan Friedel if (arg_table[i].auditconfig_cmd == AC_ARG_SET_TEMPORARY) { 27428523fda3SJan Friedel continue; 27438523fda3SJan Friedel } 27448523fda3SJan Friedel 27458523fda3SJan Friedel (void) fprintf(fp, " %s%s%s\n", 27468523fda3SJan Friedel arg_table[i].arg_str, arg_table[i].arg_opts, 27478523fda3SJan Friedel (arg_table[i].temporary_allowed ? " [-t]" : "")); 27488523fda3SJan Friedel } 27497c478bd9Sstevel@tonic-gate 27507c478bd9Sstevel@tonic-gate exit(status); 27517c478bd9Sstevel@tonic-gate } 27527c478bd9Sstevel@tonic-gate 27537c478bd9Sstevel@tonic-gate static void 27549e3700dfSgww print_asid(au_asid_t asid) 27557c478bd9Sstevel@tonic-gate { 27567c478bd9Sstevel@tonic-gate (void) printf(gettext("audit session id = %u\n"), asid); 27577c478bd9Sstevel@tonic-gate } 27587c478bd9Sstevel@tonic-gate 27597c478bd9Sstevel@tonic-gate static void 27609e3700dfSgww print_auid(au_id_t auid) 27617c478bd9Sstevel@tonic-gate { 27627c478bd9Sstevel@tonic-gate struct passwd *pwd; 27637c478bd9Sstevel@tonic-gate char *username; 27647c478bd9Sstevel@tonic-gate 27659e3700dfSgww if ((pwd = getpwuid((uid_t)auid)) != NULL) 27667c478bd9Sstevel@tonic-gate username = pwd->pw_name; 27677c478bd9Sstevel@tonic-gate else 27687c478bd9Sstevel@tonic-gate username = gettext("unknown"); 27697c478bd9Sstevel@tonic-gate 27707c478bd9Sstevel@tonic-gate (void) printf(gettext("audit id = %s(%d)\n"), username, auid); 27717c478bd9Sstevel@tonic-gate } 27727c478bd9Sstevel@tonic-gate 27737c478bd9Sstevel@tonic-gate static void 27749e3700dfSgww print_mask(char *desc, au_mask_t *pmp) 27757c478bd9Sstevel@tonic-gate { 27767c478bd9Sstevel@tonic-gate char auflags[512]; 27777c478bd9Sstevel@tonic-gate 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 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 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 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 29229e3700dfSgww str2type(char *s, uint_t *type) 29237c478bd9Sstevel@tonic-gate { 29247c478bd9Sstevel@tonic-gate if (strcmp(s, "ipv6") == 0) { 29257c478bd9Sstevel@tonic-gate *type = AU_IPv6; 29267c478bd9Sstevel@tonic-gate return (0); 29277c478bd9Sstevel@tonic-gate } 29287c478bd9Sstevel@tonic-gate if (strcmp(s, "ipv4") == 0) { 29297c478bd9Sstevel@tonic-gate *type = AU_IPv4; 29307c478bd9Sstevel@tonic-gate return (0); 29317c478bd9Sstevel@tonic-gate } 29327c478bd9Sstevel@tonic-gate 29337c478bd9Sstevel@tonic-gate return (1); 29347c478bd9Sstevel@tonic-gate } 29358523fda3SJan Friedel 29368523fda3SJan Friedel /* 29378523fda3SJan Friedel * exit_error() - print an error message along with corresponding system error 29388523fda3SJan Friedel * number and error message, then exit. Inputs - program error format and 29398523fda3SJan Friedel * message. 29408523fda3SJan Friedel */ 29418523fda3SJan Friedel /*PRINTFLIKE1*/ 29428523fda3SJan Friedel static void 29438523fda3SJan Friedel exit_error(char *fmt, ...) 29448523fda3SJan Friedel { 29458523fda3SJan Friedel va_list args; 29468523fda3SJan Friedel 29478523fda3SJan Friedel va_start(args, fmt); 29488523fda3SJan Friedel prt_error_va(fmt, args); 29498523fda3SJan Friedel va_end(args); 29508523fda3SJan Friedel 29518523fda3SJan Friedel exit(1); 29528523fda3SJan Friedel } 2953