1*12918SJan.Friedel@Sun.COM /*
2*12918SJan.Friedel@Sun.COM * CDDL HEADER START
3*12918SJan.Friedel@Sun.COM *
4*12918SJan.Friedel@Sun.COM * The contents of this file are subject to the terms of the
5*12918SJan.Friedel@Sun.COM * Common Development and Distribution License (the "License").
6*12918SJan.Friedel@Sun.COM * You may not use this file except in compliance with the License.
7*12918SJan.Friedel@Sun.COM *
8*12918SJan.Friedel@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*12918SJan.Friedel@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*12918SJan.Friedel@Sun.COM * See the License for the specific language governing permissions
11*12918SJan.Friedel@Sun.COM * and limitations under the License.
12*12918SJan.Friedel@Sun.COM *
13*12918SJan.Friedel@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*12918SJan.Friedel@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*12918SJan.Friedel@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*12918SJan.Friedel@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*12918SJan.Friedel@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*12918SJan.Friedel@Sun.COM *
19*12918SJan.Friedel@Sun.COM * CDDL HEADER END
20*12918SJan.Friedel@Sun.COM */
21*12918SJan.Friedel@Sun.COM /*
22*12918SJan.Friedel@Sun.COM * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
23*12918SJan.Friedel@Sun.COM */
24*12918SJan.Friedel@Sun.COM
25*12918SJan.Friedel@Sun.COM /* auditd smf(5)/libscf(3LIB) interface - set and display audit parameters */
26*12918SJan.Friedel@Sun.COM #include <audit_scf.h>
27*12918SJan.Friedel@Sun.COM #include <audit_policy.h>
28*12918SJan.Friedel@Sun.COM
29*12918SJan.Friedel@Sun.COM /* propvec array must be NULL terminated */
30*12918SJan.Friedel@Sun.COM scf_propvec_t prop_vect[MAX_PROPVECS + 1];
31*12918SJan.Friedel@Sun.COM
32*12918SJan.Friedel@Sun.COM /*
33*12918SJan.Friedel@Sun.COM * prt_error() - prt_error_va() wrapper; see prt_error_va() for more contextual
34*12918SJan.Friedel@Sun.COM * information. Note, that the function disregards errno; if you need to print
35*12918SJan.Friedel@Sun.COM * out strerror()/errno use directly prt_error_va().
36*12918SJan.Friedel@Sun.COM * Inputs - program error format and message.
37*12918SJan.Friedel@Sun.COM */
38*12918SJan.Friedel@Sun.COM /*PRINTFLIKE1*/
39*12918SJan.Friedel@Sun.COM static void
prt_error(char * fmt,...)40*12918SJan.Friedel@Sun.COM prt_error(char *fmt, ...)
41*12918SJan.Friedel@Sun.COM {
42*12918SJan.Friedel@Sun.COM va_list args;
43*12918SJan.Friedel@Sun.COM
44*12918SJan.Friedel@Sun.COM errno = 0;
45*12918SJan.Friedel@Sun.COM
46*12918SJan.Friedel@Sun.COM va_start(args, fmt);
47*12918SJan.Friedel@Sun.COM prt_error_va(fmt, args);
48*12918SJan.Friedel@Sun.COM va_end(args);
49*12918SJan.Friedel@Sun.COM }
50*12918SJan.Friedel@Sun.COM
51*12918SJan.Friedel@Sun.COM /*
52*12918SJan.Friedel@Sun.COM * prt_error_va() - prints an error message along with corresponding system
53*12918SJan.Friedel@Sun.COM * error number. Inputs - program error format and the va_list already prepared
54*12918SJan.Friedel@Sun.COM * by the preceding functions.
55*12918SJan.Friedel@Sun.COM *
56*12918SJan.Friedel@Sun.COM */
57*12918SJan.Friedel@Sun.COM /*PRINTFLIKE1*/
58*12918SJan.Friedel@Sun.COM void
prt_error_va(char * fmt,va_list args)59*12918SJan.Friedel@Sun.COM prt_error_va(char *fmt, va_list args)
60*12918SJan.Friedel@Sun.COM {
61*12918SJan.Friedel@Sun.COM (void) vfprintf(stderr, fmt, args);
62*12918SJan.Friedel@Sun.COM (void) fputc('\n', stderr);
63*12918SJan.Friedel@Sun.COM if (errno)
64*12918SJan.Friedel@Sun.COM (void) fprintf(stderr, "error: %s(%d)\n",
65*12918SJan.Friedel@Sun.COM strerror(errno), errno);
66*12918SJan.Friedel@Sun.COM (void) fflush(stderr);
67*12918SJan.Friedel@Sun.COM }
68*12918SJan.Friedel@Sun.COM
69*12918SJan.Friedel@Sun.COM /*
70*12918SJan.Friedel@Sun.COM * prt_scf_err() - scf_error()/scf_strerror() wrapper.
71*12918SJan.Friedel@Sun.COM */
72*12918SJan.Friedel@Sun.COM static void
prt_scf_err(void)73*12918SJan.Friedel@Sun.COM prt_scf_err(void)
74*12918SJan.Friedel@Sun.COM {
75*12918SJan.Friedel@Sun.COM (void) fprintf(stderr, "error: %s\n", scf_strerror(scf_error()));
76*12918SJan.Friedel@Sun.COM }
77*12918SJan.Friedel@Sun.COM
78*12918SJan.Friedel@Sun.COM /*
79*12918SJan.Friedel@Sun.COM * add_prop_vect_scf() - adds vector to the array of vectors later passed to
80*12918SJan.Friedel@Sun.COM * get_/set_val_scf(). The first argument (vector) points to particular position
81*12918SJan.Friedel@Sun.COM * in the vector of properties.
82*12918SJan.Friedel@Sun.COM */
83*12918SJan.Friedel@Sun.COM static void
add_prop_vect_scf(scf_propvec_t * vector,const char * prop_str,scf_type_t prop_type,void * prop_val_ptr)84*12918SJan.Friedel@Sun.COM add_prop_vect_scf(scf_propvec_t *vector, const char *prop_str,
85*12918SJan.Friedel@Sun.COM scf_type_t prop_type, void *prop_val_ptr)
86*12918SJan.Friedel@Sun.COM {
87*12918SJan.Friedel@Sun.COM vector->pv_prop = prop_str;
88*12918SJan.Friedel@Sun.COM vector->pv_type = prop_type;
89*12918SJan.Friedel@Sun.COM vector->pv_ptr = prop_val_ptr;
90*12918SJan.Friedel@Sun.COM }
91*12918SJan.Friedel@Sun.COM
92*12918SJan.Friedel@Sun.COM /*
93*12918SJan.Friedel@Sun.COM * get_val_scf() - get a property values from the audit service
94*12918SJan.Friedel@Sun.COM *
95*12918SJan.Friedel@Sun.COM * Arguments: vector = pointers to the head end of array of property vectors
96*12918SJan.Friedel@Sun.COM * pgroup_str = property group of property in AUDITD_FMRI
97*12918SJan.Friedel@Sun.COM *
98*12918SJan.Friedel@Sun.COM */
99*12918SJan.Friedel@Sun.COM static boolean_t
get_val_scf(scf_propvec_t * vector,char * pgroup_str)100*12918SJan.Friedel@Sun.COM get_val_scf(scf_propvec_t *vector, char *pgroup_str)
101*12918SJan.Friedel@Sun.COM {
102*12918SJan.Friedel@Sun.COM scf_propvec_t *bad_prop_vec = NULL;
103*12918SJan.Friedel@Sun.COM
104*12918SJan.Friedel@Sun.COM /*
105*12918SJan.Friedel@Sun.COM * Get the property vector from the editing snapshot (B_FALSE).
106*12918SJan.Friedel@Sun.COM * For documentation on property vectors see <libscf_priv.h>.
107*12918SJan.Friedel@Sun.COM */
108*12918SJan.Friedel@Sun.COM if (scf_read_propvec(AUDITD_FMRI, pgroup_str, B_FALSE, vector,
109*12918SJan.Friedel@Sun.COM &bad_prop_vec) != SCF_SUCCESS) {
110*12918SJan.Friedel@Sun.COM prt_scf_err();
111*12918SJan.Friedel@Sun.COM if (bad_prop_vec != NULL) {
112*12918SJan.Friedel@Sun.COM prt_error(gettext("Reading the %s property in the %s "
113*12918SJan.Friedel@Sun.COM "property group failed.\n"), bad_prop_vec->pv_prop,
114*12918SJan.Friedel@Sun.COM pgroup_str);
115*12918SJan.Friedel@Sun.COM }
116*12918SJan.Friedel@Sun.COM return (B_FALSE);
117*12918SJan.Friedel@Sun.COM }
118*12918SJan.Friedel@Sun.COM
119*12918SJan.Friedel@Sun.COM return (B_TRUE);
120*12918SJan.Friedel@Sun.COM }
121*12918SJan.Friedel@Sun.COM
122*12918SJan.Friedel@Sun.COM /*
123*12918SJan.Friedel@Sun.COM * set_val_scf() - set property values of the audit service.
124*12918SJan.Friedel@Sun.COM *
125*12918SJan.Friedel@Sun.COM * arguments: vector = pointers to the head end of array of property vectors
126*12918SJan.Friedel@Sun.COM * pgroup_str = property group of property in AUDITD_FMRI
127*12918SJan.Friedel@Sun.COM *
128*12918SJan.Friedel@Sun.COM */
129*12918SJan.Friedel@Sun.COM static boolean_t
set_val_scf(scf_propvec_t * vector,char * pgroup_str)130*12918SJan.Friedel@Sun.COM set_val_scf(scf_propvec_t *vector, char *pgroup_str)
131*12918SJan.Friedel@Sun.COM {
132*12918SJan.Friedel@Sun.COM scf_propvec_t *bad_prop_vec = NULL;
133*12918SJan.Friedel@Sun.COM
134*12918SJan.Friedel@Sun.COM /* for documentation on property vectors see <libscf_priv.h> */
135*12918SJan.Friedel@Sun.COM if (scf_write_propvec(AUDITD_FMRI, pgroup_str, vector,
136*12918SJan.Friedel@Sun.COM &bad_prop_vec) != SCF_SUCCESS) {
137*12918SJan.Friedel@Sun.COM prt_scf_err();
138*12918SJan.Friedel@Sun.COM if (bad_prop_vec != NULL) {
139*12918SJan.Friedel@Sun.COM prt_error(gettext("Setting the %s property in the %s "
140*12918SJan.Friedel@Sun.COM "property group failed.\n"), bad_prop_vec->pv_prop,
141*12918SJan.Friedel@Sun.COM pgroup_str);
142*12918SJan.Friedel@Sun.COM }
143*12918SJan.Friedel@Sun.COM return (B_FALSE);
144*12918SJan.Friedel@Sun.COM }
145*12918SJan.Friedel@Sun.COM
146*12918SJan.Friedel@Sun.COM return (B_TRUE);
147*12918SJan.Friedel@Sun.COM }
148*12918SJan.Friedel@Sun.COM
149*12918SJan.Friedel@Sun.COM /*
150*12918SJan.Friedel@Sun.COM * free_prop_vect() - deallocate heap memory used for propvect values.
151*12918SJan.Friedel@Sun.COM */
152*12918SJan.Friedel@Sun.COM static void
free_prop_vect(void)153*12918SJan.Friedel@Sun.COM free_prop_vect(void)
154*12918SJan.Friedel@Sun.COM {
155*12918SJan.Friedel@Sun.COM scf_propvec_t *prop_vect_ptr;
156*12918SJan.Friedel@Sun.COM
157*12918SJan.Friedel@Sun.COM prop_vect_ptr = prop_vect;
158*12918SJan.Friedel@Sun.COM
159*12918SJan.Friedel@Sun.COM while (prop_vect_ptr->pv_prop != NULL) {
160*12918SJan.Friedel@Sun.COM if (stack_inbounds(prop_vect_ptr->pv_ptr) == 0) {
161*12918SJan.Friedel@Sun.COM free(prop_vect_ptr->pv_ptr);
162*12918SJan.Friedel@Sun.COM }
163*12918SJan.Friedel@Sun.COM prop_vect_ptr++;
164*12918SJan.Friedel@Sun.COM }
165*12918SJan.Friedel@Sun.COM }
166*12918SJan.Friedel@Sun.COM
167*12918SJan.Friedel@Sun.COM /*
168*12918SJan.Friedel@Sun.COM * chk_prop_vect() - check for prop_vect boundaries and possibly process
169*12918SJan.Friedel@Sun.COM * (typically) full prop_vect.
170*12918SJan.Friedel@Sun.COM */
171*12918SJan.Friedel@Sun.COM static boolean_t
chk_prop_vect(scf_propvec_t ** prop_vect_ptr,char * pgrp_str)172*12918SJan.Friedel@Sun.COM chk_prop_vect(scf_propvec_t **prop_vect_ptr, char *pgrp_str)
173*12918SJan.Friedel@Sun.COM {
174*12918SJan.Friedel@Sun.COM if (*prop_vect_ptr < prop_vect ||
175*12918SJan.Friedel@Sun.COM *prop_vect_ptr >= (prop_vect + MAX_PROPVECS)) {
176*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "prop_vect is full; flushing\n"));
177*12918SJan.Friedel@Sun.COM if (!set_val_scf(prop_vect, pgrp_str)) {
178*12918SJan.Friedel@Sun.COM return (B_FALSE);
179*12918SJan.Friedel@Sun.COM }
180*12918SJan.Friedel@Sun.COM free_prop_vect();
181*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
182*12918SJan.Friedel@Sun.COM *prop_vect_ptr = prop_vect;
183*12918SJan.Friedel@Sun.COM }
184*12918SJan.Friedel@Sun.COM return (B_TRUE);
185*12918SJan.Friedel@Sun.COM }
186*12918SJan.Friedel@Sun.COM
187*12918SJan.Friedel@Sun.COM /*
188*12918SJan.Friedel@Sun.COM * get_props_kva_all() - get all properties and fill in the plugin_kva.
189*12918SJan.Friedel@Sun.COM */
190*12918SJan.Friedel@Sun.COM static boolean_t
get_props_kva_all(asi_scfhandle_t * handle,asi_scfhandle_iter_t * handle_iter,kva_t ** plugin_kva)191*12918SJan.Friedel@Sun.COM get_props_kva_all(asi_scfhandle_t *handle, asi_scfhandle_iter_t *handle_iter,
192*12918SJan.Friedel@Sun.COM kva_t **plugin_kva)
193*12918SJan.Friedel@Sun.COM {
194*12918SJan.Friedel@Sun.COM char key_buf[PLUGIN_MAXKEY];
195*12918SJan.Friedel@Sun.COM char val_buf[PLUGIN_MAXVAL];
196*12918SJan.Friedel@Sun.COM char attr_string[PLUGIN_MAXATT];
197*12918SJan.Friedel@Sun.COM char attr_buf[PLUGIN_MAXATT];
198*12918SJan.Friedel@Sun.COM int len = 0;
199*12918SJan.Friedel@Sun.COM scf_type_t prop_type;
200*12918SJan.Friedel@Sun.COM
201*12918SJan.Friedel@Sun.COM attr_string[0] = 0;
202*12918SJan.Friedel@Sun.COM attr_buf[0] = 0;
203*12918SJan.Friedel@Sun.COM
204*12918SJan.Friedel@Sun.COM while (scf_iter_next_property(handle_iter->prop, handle->prop) == 1) {
205*12918SJan.Friedel@Sun.COM if (scf_property_get_name(handle->prop, key_buf,
206*12918SJan.Friedel@Sun.COM PLUGIN_MAXKEY) == -1) {
207*12918SJan.Friedel@Sun.COM prt_scf_err();
208*12918SJan.Friedel@Sun.COM return (B_FALSE);
209*12918SJan.Friedel@Sun.COM }
210*12918SJan.Friedel@Sun.COM
211*12918SJan.Friedel@Sun.COM /*
212*12918SJan.Friedel@Sun.COM * We do not fully support multi-valued properties.
213*12918SJan.Friedel@Sun.COM * scf_property_get_value() only supports single-valued
214*12918SJan.Friedel@Sun.COM * properties. It returns SCF_ERROR_CONSTRAINT_VIOLATED and one
215*12918SJan.Friedel@Sun.COM * of the property values. The audit service configuration
216*12918SJan.Friedel@Sun.COM * values are all single-valued properties. The authorizations
217*12918SJan.Friedel@Sun.COM * to configure and read the audit service properties may be
218*12918SJan.Friedel@Sun.COM * multi-valued, these may safely be ignored here as not an
219*12918SJan.Friedel@Sun.COM * error.
220*12918SJan.Friedel@Sun.COM */
221*12918SJan.Friedel@Sun.COM if (scf_property_get_value(handle->prop,
222*12918SJan.Friedel@Sun.COM handle_iter->prop_val) != 0 &&
223*12918SJan.Friedel@Sun.COM scf_error() != SCF_ERROR_CONSTRAINT_VIOLATED) {
224*12918SJan.Friedel@Sun.COM prt_scf_err();
225*12918SJan.Friedel@Sun.COM return (B_FALSE);
226*12918SJan.Friedel@Sun.COM }
227*12918SJan.Friedel@Sun.COM if (scf_property_type(handle->prop, &prop_type) == -1) {
228*12918SJan.Friedel@Sun.COM prt_scf_err();
229*12918SJan.Friedel@Sun.COM return (B_FALSE);
230*12918SJan.Friedel@Sun.COM }
231*12918SJan.Friedel@Sun.COM switch (prop_type) {
232*12918SJan.Friedel@Sun.COM case SCF_TYPE_BOOLEAN: {
233*12918SJan.Friedel@Sun.COM uint8_t pval_bool;
234*12918SJan.Friedel@Sun.COM if (scf_value_get_boolean(handle_iter->prop_val,
235*12918SJan.Friedel@Sun.COM &pval_bool) == -1) {
236*12918SJan.Friedel@Sun.COM prt_scf_err();
237*12918SJan.Friedel@Sun.COM return (B_FALSE);
238*12918SJan.Friedel@Sun.COM }
239*12918SJan.Friedel@Sun.COM len = snprintf(attr_buf, PLUGIN_MAXATT, "%s=%d;",
240*12918SJan.Friedel@Sun.COM key_buf, pval_bool);
241*12918SJan.Friedel@Sun.COM if (len < 0 || len >= PLUGIN_MAXATT) {
242*12918SJan.Friedel@Sun.COM prt_error(gettext("Too long attribute: %s\n"),
243*12918SJan.Friedel@Sun.COM key_buf);
244*12918SJan.Friedel@Sun.COM return (B_FALSE);
245*12918SJan.Friedel@Sun.COM }
246*12918SJan.Friedel@Sun.COM if (strlcat(attr_string, attr_buf, PLUGIN_MAXATT) >=
247*12918SJan.Friedel@Sun.COM PLUGIN_MAXATT) {
248*12918SJan.Friedel@Sun.COM prt_error(gettext("Too long attribute string: "
249*12918SJan.Friedel@Sun.COM "%s\n"), key_buf);
250*12918SJan.Friedel@Sun.COM return (B_FALSE);
251*12918SJan.Friedel@Sun.COM }
252*12918SJan.Friedel@Sun.COM break;
253*12918SJan.Friedel@Sun.COM }
254*12918SJan.Friedel@Sun.COM case SCF_TYPE_ASTRING: {
255*12918SJan.Friedel@Sun.COM if (scf_value_get_as_string(handle_iter->prop_val,
256*12918SJan.Friedel@Sun.COM val_buf, PLUGIN_MAXATT) == -1) {
257*12918SJan.Friedel@Sun.COM prt_scf_err();
258*12918SJan.Friedel@Sun.COM return (B_FALSE);
259*12918SJan.Friedel@Sun.COM }
260*12918SJan.Friedel@Sun.COM len = snprintf(attr_buf, PLUGIN_MAXATT, "%s=%s;",
261*12918SJan.Friedel@Sun.COM key_buf, val_buf);
262*12918SJan.Friedel@Sun.COM if (len < 0 || len >= PLUGIN_MAXATT) {
263*12918SJan.Friedel@Sun.COM prt_error(gettext("Too long attribute: %s\n"),
264*12918SJan.Friedel@Sun.COM key_buf);
265*12918SJan.Friedel@Sun.COM return (B_FALSE);
266*12918SJan.Friedel@Sun.COM }
267*12918SJan.Friedel@Sun.COM if (strlcat(attr_string, attr_buf, PLUGIN_MAXATT) >=
268*12918SJan.Friedel@Sun.COM PLUGIN_MAXATT) {
269*12918SJan.Friedel@Sun.COM prt_error(gettext("Too long attribute string: "
270*12918SJan.Friedel@Sun.COM "%s\n"), key_buf);
271*12918SJan.Friedel@Sun.COM return (B_FALSE);
272*12918SJan.Friedel@Sun.COM }
273*12918SJan.Friedel@Sun.COM break;
274*12918SJan.Friedel@Sun.COM }
275*12918SJan.Friedel@Sun.COM case SCF_TYPE_COUNT: {
276*12918SJan.Friedel@Sun.COM uint64_t pval_count;
277*12918SJan.Friedel@Sun.COM if (scf_value_get_count(handle_iter->prop_val,
278*12918SJan.Friedel@Sun.COM &pval_count) == -1) {
279*12918SJan.Friedel@Sun.COM prt_scf_err();
280*12918SJan.Friedel@Sun.COM return (B_FALSE);
281*12918SJan.Friedel@Sun.COM }
282*12918SJan.Friedel@Sun.COM len = snprintf(attr_buf, PLUGIN_MAXATT, "%s=%llu;",
283*12918SJan.Friedel@Sun.COM key_buf, pval_count);
284*12918SJan.Friedel@Sun.COM if (len < 0 || len >= PLUGIN_MAXATT) {
285*12918SJan.Friedel@Sun.COM prt_error(gettext("Too long attribute: %s\n"),
286*12918SJan.Friedel@Sun.COM key_buf);
287*12918SJan.Friedel@Sun.COM return (B_FALSE);
288*12918SJan.Friedel@Sun.COM }
289*12918SJan.Friedel@Sun.COM if (strlcat(attr_string, attr_buf, PLUGIN_MAXATT) >=
290*12918SJan.Friedel@Sun.COM PLUGIN_MAXATT) {
291*12918SJan.Friedel@Sun.COM prt_error(gettext("Too long attribute string: "
292*12918SJan.Friedel@Sun.COM "%s\n"), key_buf);
293*12918SJan.Friedel@Sun.COM return (B_FALSE);
294*12918SJan.Friedel@Sun.COM }
295*12918SJan.Friedel@Sun.COM break;
296*12918SJan.Friedel@Sun.COM }
297*12918SJan.Friedel@Sun.COM default:
298*12918SJan.Friedel@Sun.COM (void) printf("Unsupported value type %s [%d]\n",
299*12918SJan.Friedel@Sun.COM key_buf, prop_type);
300*12918SJan.Friedel@Sun.COM break;
301*12918SJan.Friedel@Sun.COM }
302*12918SJan.Friedel@Sun.COM }
303*12918SJan.Friedel@Sun.COM
304*12918SJan.Friedel@Sun.COM if (*attr_string == '\0' ||
305*12918SJan.Friedel@Sun.COM (*plugin_kva = _str2kva(attr_string, "=", ";")) == NULL) {
306*12918SJan.Friedel@Sun.COM prt_error(gettext("Empty or invalid attribute string."));
307*12918SJan.Friedel@Sun.COM return (B_FALSE);
308*12918SJan.Friedel@Sun.COM }
309*12918SJan.Friedel@Sun.COM
310*12918SJan.Friedel@Sun.COM return (B_TRUE);
311*12918SJan.Friedel@Sun.COM }
312*12918SJan.Friedel@Sun.COM
313*12918SJan.Friedel@Sun.COM /*
314*12918SJan.Friedel@Sun.COM * get_plugin_kva() - get and save config attributes of given plugin plugin_str
315*12918SJan.Friedel@Sun.COM * (or all plugins in case plugin_str == NULL) into scf_plugin_kva_node_t.
316*12918SJan.Friedel@Sun.COM */
317*12918SJan.Friedel@Sun.COM static boolean_t
get_plugin_kva(asi_scfhandle_t * handle,asi_scfhandle_iter_t * handle_iter,scf_plugin_kva_node_t ** plugin_kva_ll,char * plugin_str)318*12918SJan.Friedel@Sun.COM get_plugin_kva(asi_scfhandle_t *handle, asi_scfhandle_iter_t *handle_iter,
319*12918SJan.Friedel@Sun.COM scf_plugin_kva_node_t **plugin_kva_ll, char *plugin_str)
320*12918SJan.Friedel@Sun.COM {
321*12918SJan.Friedel@Sun.COM
322*12918SJan.Friedel@Sun.COM scf_plugin_kva_node_t *node = NULL;
323*12918SJan.Friedel@Sun.COM scf_plugin_kva_node_t *node_prev = NULL;
324*12918SJan.Friedel@Sun.COM scf_plugin_kva_node_t *node_head = NULL;
325*12918SJan.Friedel@Sun.COM char plugin_str_tmp[PLUGIN_MAXBUF];
326*12918SJan.Friedel@Sun.COM
327*12918SJan.Friedel@Sun.COM bzero(plugin_str_tmp, PLUGIN_MAXBUF);
328*12918SJan.Friedel@Sun.COM
329*12918SJan.Friedel@Sun.COM if (scf_iter_instance_pgs_typed(handle_iter->pgrp, handle->inst,
330*12918SJan.Friedel@Sun.COM (const char *)"plugin") == -1) {
331*12918SJan.Friedel@Sun.COM prt_scf_err();
332*12918SJan.Friedel@Sun.COM return (B_FALSE);
333*12918SJan.Friedel@Sun.COM }
334*12918SJan.Friedel@Sun.COM
335*12918SJan.Friedel@Sun.COM while (scf_iter_next_pg(handle_iter->pgrp, handle->pgrp) == 1) {
336*12918SJan.Friedel@Sun.COM if (scf_pg_get_name(handle->pgrp, plugin_str_tmp,
337*12918SJan.Friedel@Sun.COM PLUGIN_MAXBUF) == -1) {
338*12918SJan.Friedel@Sun.COM prt_scf_err();
339*12918SJan.Friedel@Sun.COM plugin_kva_ll_free(node);
340*12918SJan.Friedel@Sun.COM return (B_FALSE);
341*12918SJan.Friedel@Sun.COM }
342*12918SJan.Friedel@Sun.COM
343*12918SJan.Friedel@Sun.COM if (plugin_str != NULL &&
344*12918SJan.Friedel@Sun.COM strcmp(plugin_str_tmp, plugin_str) != 0) {
345*12918SJan.Friedel@Sun.COM continue;
346*12918SJan.Friedel@Sun.COM }
347*12918SJan.Friedel@Sun.COM
348*12918SJan.Friedel@Sun.COM if ((node =
349*12918SJan.Friedel@Sun.COM calloc(1, sizeof (scf_plugin_kva_node_t))) == NULL) {
350*12918SJan.Friedel@Sun.COM prt_error(gettext("No available memory."));
351*12918SJan.Friedel@Sun.COM plugin_kva_ll_free(node_prev);
352*12918SJan.Friedel@Sun.COM return (B_FALSE);
353*12918SJan.Friedel@Sun.COM }
354*12918SJan.Friedel@Sun.COM if (node_head == NULL) {
355*12918SJan.Friedel@Sun.COM node_head = node;
356*12918SJan.Friedel@Sun.COM }
357*12918SJan.Friedel@Sun.COM if (node_prev != NULL) {
358*12918SJan.Friedel@Sun.COM node_prev->next = node;
359*12918SJan.Friedel@Sun.COM node->prev = node_prev;
360*12918SJan.Friedel@Sun.COM }
361*12918SJan.Friedel@Sun.COM node_prev = node;
362*12918SJan.Friedel@Sun.COM
363*12918SJan.Friedel@Sun.COM (void) strlcat((char *)&(node->plugin_name), plugin_str_tmp,
364*12918SJan.Friedel@Sun.COM PLUGIN_MAXBUF);
365*12918SJan.Friedel@Sun.COM
366*12918SJan.Friedel@Sun.COM if (scf_iter_pg_properties(handle_iter->prop,
367*12918SJan.Friedel@Sun.COM handle->pgrp) != 0) {
368*12918SJan.Friedel@Sun.COM prt_scf_err();
369*12918SJan.Friedel@Sun.COM plugin_kva_ll_free(node);
370*12918SJan.Friedel@Sun.COM return (B_FALSE);
371*12918SJan.Friedel@Sun.COM }
372*12918SJan.Friedel@Sun.COM
373*12918SJan.Friedel@Sun.COM if (!get_props_kva_all(handle, handle_iter,
374*12918SJan.Friedel@Sun.COM &(node->plugin_kva))) {
375*12918SJan.Friedel@Sun.COM plugin_kva_ll_free(node);
376*12918SJan.Friedel@Sun.COM return (B_FALSE);
377*12918SJan.Friedel@Sun.COM }
378*12918SJan.Friedel@Sun.COM }
379*12918SJan.Friedel@Sun.COM
380*12918SJan.Friedel@Sun.COM #if DEBUG
381*12918SJan.Friedel@Sun.COM {
382*12918SJan.Friedel@Sun.COM scf_plugin_kva_node_t *node_debug = node_head;
383*12918SJan.Friedel@Sun.COM char attr_string[PLUGIN_MAXATT];
384*12918SJan.Friedel@Sun.COM
385*12918SJan.Friedel@Sun.COM while (node_debug != NULL) {
386*12918SJan.Friedel@Sun.COM if (_kva2str(node_debug->plugin_kva, attr_string,
387*12918SJan.Friedel@Sun.COM PLUGIN_MAXATT, "=", ";") == 0) {
388*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "Found plugin - %s: %s\n",
389*12918SJan.Friedel@Sun.COM node_debug->plugin_name, attr_string));
390*12918SJan.Friedel@Sun.COM } else {
391*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "Could not get attribute string "
392*12918SJan.Friedel@Sun.COM "for %s\n", node_debug->plugin_name));
393*12918SJan.Friedel@Sun.COM }
394*12918SJan.Friedel@Sun.COM node_debug = node_debug->prev;
395*12918SJan.Friedel@Sun.COM }
396*12918SJan.Friedel@Sun.COM }
397*12918SJan.Friedel@Sun.COM #endif
398*12918SJan.Friedel@Sun.COM
399*12918SJan.Friedel@Sun.COM *plugin_kva_ll = node_head;
400*12918SJan.Friedel@Sun.COM
401*12918SJan.Friedel@Sun.COM return (B_TRUE);
402*12918SJan.Friedel@Sun.COM }
403*12918SJan.Friedel@Sun.COM
404*12918SJan.Friedel@Sun.COM /*
405*12918SJan.Friedel@Sun.COM * scf_free() - free scf handles
406*12918SJan.Friedel@Sun.COM */
407*12918SJan.Friedel@Sun.COM static void
scf_free(asi_scfhandle_t * handle)408*12918SJan.Friedel@Sun.COM scf_free(asi_scfhandle_t *handle)
409*12918SJan.Friedel@Sun.COM {
410*12918SJan.Friedel@Sun.COM if (handle == NULL) {
411*12918SJan.Friedel@Sun.COM return;
412*12918SJan.Friedel@Sun.COM }
413*12918SJan.Friedel@Sun.COM
414*12918SJan.Friedel@Sun.COM if (handle->prop != NULL) {
415*12918SJan.Friedel@Sun.COM scf_property_destroy(handle->prop);
416*12918SJan.Friedel@Sun.COM }
417*12918SJan.Friedel@Sun.COM if (handle->pgrp != NULL) {
418*12918SJan.Friedel@Sun.COM scf_pg_destroy(handle->pgrp);
419*12918SJan.Friedel@Sun.COM }
420*12918SJan.Friedel@Sun.COM if (handle->inst != NULL) {
421*12918SJan.Friedel@Sun.COM scf_instance_destroy(handle->inst);
422*12918SJan.Friedel@Sun.COM }
423*12918SJan.Friedel@Sun.COM if (handle->hndl != NULL) {
424*12918SJan.Friedel@Sun.COM if (scf_handle_unbind(handle->hndl) == -1) {
425*12918SJan.Friedel@Sun.COM prt_error(gettext("Internal error."));
426*12918SJan.Friedel@Sun.COM prt_scf_err();
427*12918SJan.Friedel@Sun.COM }
428*12918SJan.Friedel@Sun.COM scf_handle_destroy(handle->hndl);
429*12918SJan.Friedel@Sun.COM }
430*12918SJan.Friedel@Sun.COM }
431*12918SJan.Friedel@Sun.COM
432*12918SJan.Friedel@Sun.COM /*
433*12918SJan.Friedel@Sun.COM * scf_init() - initiate scf handles
434*12918SJan.Friedel@Sun.COM */
435*12918SJan.Friedel@Sun.COM static boolean_t
scf_init(asi_scfhandle_t * handle)436*12918SJan.Friedel@Sun.COM scf_init(asi_scfhandle_t *handle)
437*12918SJan.Friedel@Sun.COM {
438*12918SJan.Friedel@Sun.COM bzero(handle, sizeof (asi_scfhandle_t));
439*12918SJan.Friedel@Sun.COM
440*12918SJan.Friedel@Sun.COM if ((handle->hndl = scf_handle_create(SCF_VERSION)) == NULL ||
441*12918SJan.Friedel@Sun.COM scf_handle_bind(handle->hndl) != 0) {
442*12918SJan.Friedel@Sun.COM goto err_out;
443*12918SJan.Friedel@Sun.COM }
444*12918SJan.Friedel@Sun.COM if ((handle->inst = scf_instance_create(handle->hndl)) == NULL) {
445*12918SJan.Friedel@Sun.COM goto err_out;
446*12918SJan.Friedel@Sun.COM }
447*12918SJan.Friedel@Sun.COM if ((handle->pgrp = scf_pg_create(handle->hndl)) == NULL) {
448*12918SJan.Friedel@Sun.COM goto err_out;
449*12918SJan.Friedel@Sun.COM }
450*12918SJan.Friedel@Sun.COM if ((handle->prop = scf_property_create(handle->hndl)) == NULL) {
451*12918SJan.Friedel@Sun.COM goto err_out;
452*12918SJan.Friedel@Sun.COM }
453*12918SJan.Friedel@Sun.COM
454*12918SJan.Friedel@Sun.COM return (B_TRUE);
455*12918SJan.Friedel@Sun.COM
456*12918SJan.Friedel@Sun.COM err_out:
457*12918SJan.Friedel@Sun.COM prt_scf_err();
458*12918SJan.Friedel@Sun.COM scf_free(handle);
459*12918SJan.Friedel@Sun.COM return (B_FALSE);
460*12918SJan.Friedel@Sun.COM }
461*12918SJan.Friedel@Sun.COM
462*12918SJan.Friedel@Sun.COM /*
463*12918SJan.Friedel@Sun.COM * scf_free_iter() - free scf iter handles
464*12918SJan.Friedel@Sun.COM */
465*12918SJan.Friedel@Sun.COM static void
scf_free_iter(asi_scfhandle_iter_t * handle_iter)466*12918SJan.Friedel@Sun.COM scf_free_iter(asi_scfhandle_iter_t *handle_iter)
467*12918SJan.Friedel@Sun.COM {
468*12918SJan.Friedel@Sun.COM if (handle_iter == NULL) {
469*12918SJan.Friedel@Sun.COM return;
470*12918SJan.Friedel@Sun.COM }
471*12918SJan.Friedel@Sun.COM
472*12918SJan.Friedel@Sun.COM if (handle_iter->pgrp != NULL) {
473*12918SJan.Friedel@Sun.COM scf_iter_destroy(handle_iter->pgrp);
474*12918SJan.Friedel@Sun.COM }
475*12918SJan.Friedel@Sun.COM if (handle_iter->prop != NULL) {
476*12918SJan.Friedel@Sun.COM scf_iter_destroy(handle_iter->prop);
477*12918SJan.Friedel@Sun.COM }
478*12918SJan.Friedel@Sun.COM if (handle_iter->prop_val != NULL) {
479*12918SJan.Friedel@Sun.COM scf_value_destroy(handle_iter->prop_val);
480*12918SJan.Friedel@Sun.COM }
481*12918SJan.Friedel@Sun.COM }
482*12918SJan.Friedel@Sun.COM
483*12918SJan.Friedel@Sun.COM /*
484*12918SJan.Friedel@Sun.COM * scf_init_iter() - initiate scf iter handles
485*12918SJan.Friedel@Sun.COM */
486*12918SJan.Friedel@Sun.COM static boolean_t
scf_init_iter(asi_scfhandle_iter_t * handle_iter,asi_scfhandle_t * handle)487*12918SJan.Friedel@Sun.COM scf_init_iter(asi_scfhandle_iter_t *handle_iter,
488*12918SJan.Friedel@Sun.COM asi_scfhandle_t *handle)
489*12918SJan.Friedel@Sun.COM {
490*12918SJan.Friedel@Sun.COM bzero(handle_iter, sizeof (asi_scfhandle_iter_t));
491*12918SJan.Friedel@Sun.COM
492*12918SJan.Friedel@Sun.COM if ((handle_iter->pgrp = scf_iter_create(handle->hndl)) == NULL) {
493*12918SJan.Friedel@Sun.COM goto err_out;
494*12918SJan.Friedel@Sun.COM }
495*12918SJan.Friedel@Sun.COM if ((handle_iter->prop = scf_iter_create(handle->hndl)) == NULL) {
496*12918SJan.Friedel@Sun.COM goto err_out;
497*12918SJan.Friedel@Sun.COM }
498*12918SJan.Friedel@Sun.COM if ((handle_iter->prop_val = scf_value_create(handle->hndl)) == NULL) {
499*12918SJan.Friedel@Sun.COM goto err_out;
500*12918SJan.Friedel@Sun.COM }
501*12918SJan.Friedel@Sun.COM
502*12918SJan.Friedel@Sun.COM return (B_TRUE);
503*12918SJan.Friedel@Sun.COM
504*12918SJan.Friedel@Sun.COM err_out:
505*12918SJan.Friedel@Sun.COM prt_scf_err();
506*12918SJan.Friedel@Sun.COM scf_free_iter(handle_iter);
507*12918SJan.Friedel@Sun.COM return (B_FALSE);
508*12918SJan.Friedel@Sun.COM }
509*12918SJan.Friedel@Sun.COM
510*12918SJan.Friedel@Sun.COM /*
511*12918SJan.Friedel@Sun.COM * chk_policy_context() - does some policy based checks, checks the context
512*12918SJan.Friedel@Sun.COM * (zone, smf) in which the policy could make some sense.
513*12918SJan.Friedel@Sun.COM */
514*12918SJan.Friedel@Sun.COM static boolean_t
chk_policy_context(char * policy_str)515*12918SJan.Friedel@Sun.COM chk_policy_context(char *policy_str)
516*12918SJan.Friedel@Sun.COM {
517*12918SJan.Friedel@Sun.COM
518*12918SJan.Friedel@Sun.COM /*
519*12918SJan.Friedel@Sun.COM * "all" and "none" policy flags, since they represent
520*12918SJan.Friedel@Sun.COM * sub/set of auditing policies, are not stored in the
521*12918SJan.Friedel@Sun.COM * AUDITD_FMRI service instance configuration.
522*12918SJan.Friedel@Sun.COM */
523*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "Walking policy - %s: ", policy_str));
524*12918SJan.Friedel@Sun.COM if (strcmp("all", policy_str) == 0 ||
525*12918SJan.Friedel@Sun.COM strcmp("none", policy_str) == 0) {
526*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "skipped\n"));
527*12918SJan.Friedel@Sun.COM return (B_FALSE);
528*12918SJan.Friedel@Sun.COM }
529*12918SJan.Friedel@Sun.COM /*
530*12918SJan.Friedel@Sun.COM * In the local zone (!= GLOBAL_ZONEID) we do not touch
531*12918SJan.Friedel@Sun.COM * "ahlt" and "perzone" policy flags, since these are
532*12918SJan.Friedel@Sun.COM * relevant only in the global zone.
533*12918SJan.Friedel@Sun.COM */
534*12918SJan.Friedel@Sun.COM if ((getzoneid() != GLOBAL_ZONEID) &&
535*12918SJan.Friedel@Sun.COM (strcmp("ahlt", policy_str) == 0 ||
536*12918SJan.Friedel@Sun.COM strcmp("perzone", policy_str) == 0)) {
537*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "skipped\n"));
538*12918SJan.Friedel@Sun.COM return (B_FALSE);
539*12918SJan.Friedel@Sun.COM }
540*12918SJan.Friedel@Sun.COM
541*12918SJan.Friedel@Sun.COM return (B_TRUE);
542*12918SJan.Friedel@Sun.COM }
543*12918SJan.Friedel@Sun.COM
544*12918SJan.Friedel@Sun.COM /*
545*12918SJan.Friedel@Sun.COM * free_static_att_kva() - free hardcoded/static plugin attributes (key/value
546*12918SJan.Friedel@Sun.COM * pairs) from the kva plugin structure.
547*12918SJan.Friedel@Sun.COM */
548*12918SJan.Friedel@Sun.COM void
free_static_att_kva(kva_t * plugin_kva)549*12918SJan.Friedel@Sun.COM free_static_att_kva(kva_t *plugin_kva)
550*12918SJan.Friedel@Sun.COM {
551*12918SJan.Friedel@Sun.COM _kva_free_value(plugin_kva, PLUGIN_ACTIVE);
552*12918SJan.Friedel@Sun.COM _kva_free_value(plugin_kva, PLUGIN_PATH);
553*12918SJan.Friedel@Sun.COM _kva_free_value(plugin_kva, PLUGIN_QSIZE);
554*12918SJan.Friedel@Sun.COM _kva_free_value(plugin_kva, "read_authorization");
555*12918SJan.Friedel@Sun.COM _kva_free_value(plugin_kva, "value_authorization");
556*12918SJan.Friedel@Sun.COM }
557*12918SJan.Friedel@Sun.COM
558*12918SJan.Friedel@Sun.COM
559*12918SJan.Friedel@Sun.COM /*
560*12918SJan.Friedel@Sun.COM * do_getqctrl_scf() - get the values of qctrl properties of the audit service
561*12918SJan.Friedel@Sun.COM */
562*12918SJan.Friedel@Sun.COM boolean_t
do_getqctrl_scf(struct au_qctrl * cval)563*12918SJan.Friedel@Sun.COM do_getqctrl_scf(struct au_qctrl *cval)
564*12918SJan.Friedel@Sun.COM {
565*12918SJan.Friedel@Sun.COM scf_propvec_t *prop_vect_ptr;
566*12918SJan.Friedel@Sun.COM scf_qctrl_t cval_scf;
567*12918SJan.Friedel@Sun.COM
568*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
569*12918SJan.Friedel@Sun.COM
570*12918SJan.Friedel@Sun.COM prop_vect_ptr = prop_vect;
571*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QHIWATER,
572*12918SJan.Friedel@Sun.COM SCF_TYPE_COUNT, &cval_scf.scf_qhiwater);
573*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QLOWATER,
574*12918SJan.Friedel@Sun.COM SCF_TYPE_COUNT, &cval_scf.scf_qlowater);
575*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QBUFSZ,
576*12918SJan.Friedel@Sun.COM SCF_TYPE_COUNT, &cval_scf.scf_qbufsz);
577*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr, QUEUECTRL_QDELAY,
578*12918SJan.Friedel@Sun.COM SCF_TYPE_COUNT, &cval_scf.scf_qdelay);
579*12918SJan.Friedel@Sun.COM
580*12918SJan.Friedel@Sun.COM if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
581*12918SJan.Friedel@Sun.COM return (B_FALSE);
582*12918SJan.Friedel@Sun.COM }
583*12918SJan.Friedel@Sun.COM
584*12918SJan.Friedel@Sun.COM cval->aq_hiwater = (size_t)cval_scf.scf_qhiwater;
585*12918SJan.Friedel@Sun.COM cval->aq_lowater = (size_t)cval_scf.scf_qlowater;
586*12918SJan.Friedel@Sun.COM cval->aq_bufsz = (size_t)cval_scf.scf_qbufsz;
587*12918SJan.Friedel@Sun.COM cval->aq_delay = (clock_t)cval_scf.scf_qdelay;
588*12918SJan.Friedel@Sun.COM
589*12918SJan.Friedel@Sun.COM scf_clean_propvec(prop_vect);
590*12918SJan.Friedel@Sun.COM
591*12918SJan.Friedel@Sun.COM return (B_TRUE);
592*12918SJan.Friedel@Sun.COM }
593*12918SJan.Friedel@Sun.COM
594*12918SJan.Friedel@Sun.COM /*
595*12918SJan.Friedel@Sun.COM * do_getqbufsz_scf() - get the qbufsz audit service property value
596*12918SJan.Friedel@Sun.COM */
597*12918SJan.Friedel@Sun.COM boolean_t
do_getqbufsz_scf(size_t * cval)598*12918SJan.Friedel@Sun.COM do_getqbufsz_scf(size_t *cval)
599*12918SJan.Friedel@Sun.COM {
600*12918SJan.Friedel@Sun.COM uint64_t cval_l;
601*12918SJan.Friedel@Sun.COM
602*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
603*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, QUEUECTRL_QBUFSZ, SCF_TYPE_COUNT, &cval_l);
604*12918SJan.Friedel@Sun.COM
605*12918SJan.Friedel@Sun.COM if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
606*12918SJan.Friedel@Sun.COM return (B_FALSE);
607*12918SJan.Friedel@Sun.COM }
608*12918SJan.Friedel@Sun.COM
609*12918SJan.Friedel@Sun.COM *cval = (size_t)cval_l;
610*12918SJan.Friedel@Sun.COM
611*12918SJan.Friedel@Sun.COM return (B_TRUE);
612*12918SJan.Friedel@Sun.COM }
613*12918SJan.Friedel@Sun.COM
614*12918SJan.Friedel@Sun.COM /*
615*12918SJan.Friedel@Sun.COM * do_getqdelay_scf() - get the qdelay audit service property value
616*12918SJan.Friedel@Sun.COM */
617*12918SJan.Friedel@Sun.COM boolean_t
do_getqdelay_scf(clock_t * cval)618*12918SJan.Friedel@Sun.COM do_getqdelay_scf(clock_t *cval)
619*12918SJan.Friedel@Sun.COM {
620*12918SJan.Friedel@Sun.COM uint64_t cval_l;
621*12918SJan.Friedel@Sun.COM
622*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
623*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, QUEUECTRL_QDELAY, SCF_TYPE_COUNT, &cval_l);
624*12918SJan.Friedel@Sun.COM
625*12918SJan.Friedel@Sun.COM if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
626*12918SJan.Friedel@Sun.COM return (B_FALSE);
627*12918SJan.Friedel@Sun.COM }
628*12918SJan.Friedel@Sun.COM
629*12918SJan.Friedel@Sun.COM *cval = (clock_t)cval_l;
630*12918SJan.Friedel@Sun.COM
631*12918SJan.Friedel@Sun.COM return (B_TRUE);
632*12918SJan.Friedel@Sun.COM }
633*12918SJan.Friedel@Sun.COM
634*12918SJan.Friedel@Sun.COM /*
635*12918SJan.Friedel@Sun.COM * do_getqhiwater_scf() - get the qhiwater audit service property value
636*12918SJan.Friedel@Sun.COM */
637*12918SJan.Friedel@Sun.COM boolean_t
do_getqhiwater_scf(size_t * cval)638*12918SJan.Friedel@Sun.COM do_getqhiwater_scf(size_t *cval)
639*12918SJan.Friedel@Sun.COM {
640*12918SJan.Friedel@Sun.COM uint64_t cval_l;
641*12918SJan.Friedel@Sun.COM
642*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
643*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, QUEUECTRL_QHIWATER, SCF_TYPE_COUNT,
644*12918SJan.Friedel@Sun.COM &cval_l);
645*12918SJan.Friedel@Sun.COM
646*12918SJan.Friedel@Sun.COM if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
647*12918SJan.Friedel@Sun.COM return (B_FALSE);
648*12918SJan.Friedel@Sun.COM }
649*12918SJan.Friedel@Sun.COM
650*12918SJan.Friedel@Sun.COM *cval = (size_t)cval_l;
651*12918SJan.Friedel@Sun.COM
652*12918SJan.Friedel@Sun.COM return (B_TRUE);
653*12918SJan.Friedel@Sun.COM }
654*12918SJan.Friedel@Sun.COM
655*12918SJan.Friedel@Sun.COM /*
656*12918SJan.Friedel@Sun.COM * do_getqlowater_scf() - get the qlowater audit service property value
657*12918SJan.Friedel@Sun.COM */
658*12918SJan.Friedel@Sun.COM boolean_t
do_getqlowater_scf(size_t * cval)659*12918SJan.Friedel@Sun.COM do_getqlowater_scf(size_t *cval)
660*12918SJan.Friedel@Sun.COM {
661*12918SJan.Friedel@Sun.COM uint64_t cval_l;
662*12918SJan.Friedel@Sun.COM
663*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
664*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, QUEUECTRL_QLOWATER, SCF_TYPE_COUNT,
665*12918SJan.Friedel@Sun.COM &cval_l);
666*12918SJan.Friedel@Sun.COM
667*12918SJan.Friedel@Sun.COM if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
668*12918SJan.Friedel@Sun.COM return (B_FALSE);
669*12918SJan.Friedel@Sun.COM }
670*12918SJan.Friedel@Sun.COM
671*12918SJan.Friedel@Sun.COM *cval = (size_t)cval_l;
672*12918SJan.Friedel@Sun.COM
673*12918SJan.Friedel@Sun.COM return (B_TRUE);
674*12918SJan.Friedel@Sun.COM }
675*12918SJan.Friedel@Sun.COM
676*12918SJan.Friedel@Sun.COM /*
677*12918SJan.Friedel@Sun.COM * do_getpolicy_scf() - get the audit policy flags from service
678*12918SJan.Friedel@Sun.COM */
679*12918SJan.Friedel@Sun.COM boolean_t
do_getpolicy_scf(uint32_t * policy_mask)680*12918SJan.Friedel@Sun.COM do_getpolicy_scf(uint32_t *policy_mask)
681*12918SJan.Friedel@Sun.COM {
682*12918SJan.Friedel@Sun.COM int i;
683*12918SJan.Friedel@Sun.COM scf_propvec_t *prop_vect_ptr;
684*12918SJan.Friedel@Sun.COM char *cur_policy_str;
685*12918SJan.Friedel@Sun.COM policy_sw_t policy_arr[POLICY_TBL_SZ + 1];
686*12918SJan.Friedel@Sun.COM policy_sw_t *policy_arr_ptr;
687*12918SJan.Friedel@Sun.COM
688*12918SJan.Friedel@Sun.COM prop_vect_ptr = prop_vect;
689*12918SJan.Friedel@Sun.COM policy_arr_ptr = policy_arr;
690*12918SJan.Friedel@Sun.COM
691*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
692*12918SJan.Friedel@Sun.COM bzero(policy_arr, sizeof (policy_arr));
693*12918SJan.Friedel@Sun.COM
694*12918SJan.Friedel@Sun.COM /* prepare the smf(5) query */
695*12918SJan.Friedel@Sun.COM for (i = 0; i < POLICY_TBL_SZ; i++) {
696*12918SJan.Friedel@Sun.COM
697*12918SJan.Friedel@Sun.COM cur_policy_str = policy_table[i].policy_str;
698*12918SJan.Friedel@Sun.COM
699*12918SJan.Friedel@Sun.COM /* Do some basic policy dependent checks */
700*12918SJan.Friedel@Sun.COM if (!chk_policy_context(cur_policy_str)) {
701*12918SJan.Friedel@Sun.COM continue;
702*12918SJan.Friedel@Sun.COM }
703*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "will be queried\n"));
704*12918SJan.Friedel@Sun.COM
705*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, cur_policy_str,
706*12918SJan.Friedel@Sun.COM SCF_TYPE_BOOLEAN, &policy_arr_ptr->flag);
707*12918SJan.Friedel@Sun.COM
708*12918SJan.Friedel@Sun.COM policy_arr_ptr->policy = cur_policy_str;
709*12918SJan.Friedel@Sun.COM policy_arr_ptr++;
710*12918SJan.Friedel@Sun.COM
711*12918SJan.Friedel@Sun.COM }
712*12918SJan.Friedel@Sun.COM if (!get_val_scf(prop_vect, ASI_PGROUP_POLICY)) {
713*12918SJan.Friedel@Sun.COM return (B_FALSE);
714*12918SJan.Friedel@Sun.COM }
715*12918SJan.Friedel@Sun.COM
716*12918SJan.Friedel@Sun.COM /* set the policy mask */
717*12918SJan.Friedel@Sun.COM policy_arr_ptr = policy_arr;
718*12918SJan.Friedel@Sun.COM *policy_mask = 0;
719*12918SJan.Friedel@Sun.COM while (policy_arr_ptr->policy != NULL) {
720*12918SJan.Friedel@Sun.COM if (policy_arr_ptr->flag) {
721*12918SJan.Friedel@Sun.COM *policy_mask |= get_policy(policy_arr_ptr->policy);
722*12918SJan.Friedel@Sun.COM }
723*12918SJan.Friedel@Sun.COM policy_arr_ptr++;
724*12918SJan.Friedel@Sun.COM }
725*12918SJan.Friedel@Sun.COM
726*12918SJan.Friedel@Sun.COM return (B_TRUE);
727*12918SJan.Friedel@Sun.COM }
728*12918SJan.Friedel@Sun.COM
729*12918SJan.Friedel@Sun.COM /*
730*12918SJan.Friedel@Sun.COM * do_setpolicy_scf() - sets the policy flags in audit service configuration
731*12918SJan.Friedel@Sun.COM */
732*12918SJan.Friedel@Sun.COM boolean_t
do_setpolicy_scf(uint32_t policy)733*12918SJan.Friedel@Sun.COM do_setpolicy_scf(uint32_t policy)
734*12918SJan.Friedel@Sun.COM {
735*12918SJan.Friedel@Sun.COM int i;
736*12918SJan.Friedel@Sun.COM char *cur_policy_str;
737*12918SJan.Friedel@Sun.COM scf_propvec_t *prop_vect_ptr;
738*12918SJan.Friedel@Sun.COM boolean_t bool_arr[POLICY_TBL_SZ];
739*12918SJan.Friedel@Sun.COM boolean_t *bool_arr_ptr;
740*12918SJan.Friedel@Sun.COM
741*12918SJan.Friedel@Sun.COM prop_vect_ptr = prop_vect;
742*12918SJan.Friedel@Sun.COM bool_arr_ptr = bool_arr;
743*12918SJan.Friedel@Sun.COM
744*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
745*12918SJan.Friedel@Sun.COM bzero(bool_arr, sizeof (bool_arr));
746*12918SJan.Friedel@Sun.COM
747*12918SJan.Friedel@Sun.COM for (i = 0; i < POLICY_TBL_SZ; i++) {
748*12918SJan.Friedel@Sun.COM
749*12918SJan.Friedel@Sun.COM cur_policy_str = policy_table[i].policy_str;
750*12918SJan.Friedel@Sun.COM
751*12918SJan.Friedel@Sun.COM /* Do some basic policy dependent checks */
752*12918SJan.Friedel@Sun.COM if (!chk_policy_context(cur_policy_str)) {
753*12918SJan.Friedel@Sun.COM continue;
754*12918SJan.Friedel@Sun.COM }
755*12918SJan.Friedel@Sun.COM
756*12918SJan.Friedel@Sun.COM if (policy_table[i].policy_mask & policy) {
757*12918SJan.Friedel@Sun.COM *bool_arr_ptr = B_TRUE;
758*12918SJan.Friedel@Sun.COM } else {
759*12918SJan.Friedel@Sun.COM *bool_arr_ptr = B_FALSE;
760*12918SJan.Friedel@Sun.COM }
761*12918SJan.Friedel@Sun.COM
762*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "%s%s\n", (*bool_arr_ptr == B_TRUE ? "+" : "-"),
763*12918SJan.Friedel@Sun.COM cur_policy_str));
764*12918SJan.Friedel@Sun.COM
765*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, cur_policy_str,
766*12918SJan.Friedel@Sun.COM SCF_TYPE_BOOLEAN, bool_arr_ptr++);
767*12918SJan.Friedel@Sun.COM
768*12918SJan.Friedel@Sun.COM }
769*12918SJan.Friedel@Sun.COM
770*12918SJan.Friedel@Sun.COM return (set_val_scf(prop_vect, ASI_PGROUP_POLICY));
771*12918SJan.Friedel@Sun.COM }
772*12918SJan.Friedel@Sun.COM
773*12918SJan.Friedel@Sun.COM /*
774*12918SJan.Friedel@Sun.COM * do_setqctrl_scf() - set the values of qctrl properties of the audit service
775*12918SJan.Friedel@Sun.COM */
776*12918SJan.Friedel@Sun.COM boolean_t
do_setqctrl_scf(struct au_qctrl * cval)777*12918SJan.Friedel@Sun.COM do_setqctrl_scf(struct au_qctrl *cval)
778*12918SJan.Friedel@Sun.COM {
779*12918SJan.Friedel@Sun.COM scf_propvec_t *prop_vect_ptr;
780*12918SJan.Friedel@Sun.COM scf_qctrl_t cval_scf;
781*12918SJan.Friedel@Sun.COM
782*12918SJan.Friedel@Sun.COM if (!CHK_BDRY_QHIWATER(cval->aq_lowater, cval->aq_hiwater) &&
783*12918SJan.Friedel@Sun.COM cval->aq_hiwater != 0) {
784*12918SJan.Friedel@Sun.COM (void) printf(gettext("Specified audit queue hiwater mark is "
785*12918SJan.Friedel@Sun.COM "outside of allowed boundaries.\n"));
786*12918SJan.Friedel@Sun.COM return (B_FALSE);
787*12918SJan.Friedel@Sun.COM }
788*12918SJan.Friedel@Sun.COM if (!CHK_BDRY_QLOWATER(cval->aq_lowater, cval->aq_hiwater) &&
789*12918SJan.Friedel@Sun.COM cval->aq_lowater != 0) {
790*12918SJan.Friedel@Sun.COM (void) printf(gettext("Specified audit queue lowater mark is "
791*12918SJan.Friedel@Sun.COM "outside of allowed boundaries.\n"));
792*12918SJan.Friedel@Sun.COM return (B_FALSE);
793*12918SJan.Friedel@Sun.COM }
794*12918SJan.Friedel@Sun.COM if (!CHK_BDRY_QBUFSZ(cval->aq_bufsz) && cval->aq_bufsz != 0) {
795*12918SJan.Friedel@Sun.COM (void) printf(gettext("Specified audit queue buffer size is "
796*12918SJan.Friedel@Sun.COM "outside of allowed boundaries.\n"));
797*12918SJan.Friedel@Sun.COM return (B_FALSE);
798*12918SJan.Friedel@Sun.COM }
799*12918SJan.Friedel@Sun.COM if (!CHK_BDRY_QDELAY(cval->aq_delay) && cval->aq_delay != 0) {
800*12918SJan.Friedel@Sun.COM (void) printf(gettext("Specified audit queue delay is "
801*12918SJan.Friedel@Sun.COM "outside of allowed boundaries.\n"));
802*12918SJan.Friedel@Sun.COM return (B_FALSE);
803*12918SJan.Friedel@Sun.COM }
804*12918SJan.Friedel@Sun.COM
805*12918SJan.Friedel@Sun.COM cval_scf.scf_qhiwater = (uint64_t)cval->aq_hiwater;
806*12918SJan.Friedel@Sun.COM cval_scf.scf_qlowater = (uint64_t)cval->aq_lowater;
807*12918SJan.Friedel@Sun.COM cval_scf.scf_qbufsz = (uint64_t)cval->aq_bufsz;
808*12918SJan.Friedel@Sun.COM cval_scf.scf_qdelay = (uint64_t)cval->aq_delay;
809*12918SJan.Friedel@Sun.COM
810*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
811*12918SJan.Friedel@Sun.COM
812*12918SJan.Friedel@Sun.COM prop_vect_ptr = prop_vect;
813*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QHIWATER, SCF_TYPE_COUNT,
814*12918SJan.Friedel@Sun.COM &cval_scf.scf_qhiwater);
815*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QLOWATER, SCF_TYPE_COUNT,
816*12918SJan.Friedel@Sun.COM &cval_scf.scf_qlowater);
817*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QBUFSZ, SCF_TYPE_COUNT,
818*12918SJan.Friedel@Sun.COM &cval_scf.scf_qbufsz);
819*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr, QUEUECTRL_QDELAY, SCF_TYPE_COUNT,
820*12918SJan.Friedel@Sun.COM &cval_scf.scf_qdelay);
821*12918SJan.Friedel@Sun.COM
822*12918SJan.Friedel@Sun.COM return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
823*12918SJan.Friedel@Sun.COM }
824*12918SJan.Friedel@Sun.COM
825*12918SJan.Friedel@Sun.COM /*
826*12918SJan.Friedel@Sun.COM * do_setqbufsz_scf() - set the qbufsz property value of the audit service
827*12918SJan.Friedel@Sun.COM */
828*12918SJan.Friedel@Sun.COM boolean_t
do_setqbufsz_scf(size_t * cval)829*12918SJan.Friedel@Sun.COM do_setqbufsz_scf(size_t *cval)
830*12918SJan.Friedel@Sun.COM {
831*12918SJan.Friedel@Sun.COM uint64_t cval_l;
832*12918SJan.Friedel@Sun.COM
833*12918SJan.Friedel@Sun.COM if (!CHK_BDRY_QBUFSZ(*cval) && *cval != 0) {
834*12918SJan.Friedel@Sun.COM (void) printf(gettext("Specified audit queue buffer size is "
835*12918SJan.Friedel@Sun.COM "outside of allowed boundaries.\n"));
836*12918SJan.Friedel@Sun.COM return (B_FALSE);
837*12918SJan.Friedel@Sun.COM }
838*12918SJan.Friedel@Sun.COM
839*12918SJan.Friedel@Sun.COM cval_l = (uint64_t)*cval;
840*12918SJan.Friedel@Sun.COM
841*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
842*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, QUEUECTRL_QBUFSZ, SCF_TYPE_COUNT, &cval_l);
843*12918SJan.Friedel@Sun.COM
844*12918SJan.Friedel@Sun.COM return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
845*12918SJan.Friedel@Sun.COM }
846*12918SJan.Friedel@Sun.COM
847*12918SJan.Friedel@Sun.COM /*
848*12918SJan.Friedel@Sun.COM * do_setqdelay_scf() - set the qdelay property value of the audit service
849*12918SJan.Friedel@Sun.COM */
850*12918SJan.Friedel@Sun.COM boolean_t
do_setqdelay_scf(clock_t * cval)851*12918SJan.Friedel@Sun.COM do_setqdelay_scf(clock_t *cval)
852*12918SJan.Friedel@Sun.COM {
853*12918SJan.Friedel@Sun.COM uint64_t cval_l;
854*12918SJan.Friedel@Sun.COM
855*12918SJan.Friedel@Sun.COM if (!CHK_BDRY_QDELAY(*cval) && *cval != 0) {
856*12918SJan.Friedel@Sun.COM (void) printf(gettext("Specified audit queue delay is "
857*12918SJan.Friedel@Sun.COM "outside of allowed boundaries.\n"));
858*12918SJan.Friedel@Sun.COM return (B_FALSE);
859*12918SJan.Friedel@Sun.COM }
860*12918SJan.Friedel@Sun.COM
861*12918SJan.Friedel@Sun.COM cval_l = (uint64_t)*cval;
862*12918SJan.Friedel@Sun.COM
863*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
864*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, QUEUECTRL_QDELAY, SCF_TYPE_COUNT, &cval_l);
865*12918SJan.Friedel@Sun.COM
866*12918SJan.Friedel@Sun.COM return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
867*12918SJan.Friedel@Sun.COM }
868*12918SJan.Friedel@Sun.COM
869*12918SJan.Friedel@Sun.COM /*
870*12918SJan.Friedel@Sun.COM * do_setqhiwater_scf() - set the qhiwater property value of the audit service
871*12918SJan.Friedel@Sun.COM */
872*12918SJan.Friedel@Sun.COM boolean_t
do_setqhiwater_scf(size_t * cval)873*12918SJan.Friedel@Sun.COM do_setqhiwater_scf(size_t *cval)
874*12918SJan.Friedel@Sun.COM {
875*12918SJan.Friedel@Sun.COM uint64_t cval_l;
876*12918SJan.Friedel@Sun.COM size_t cval_lowater;
877*12918SJan.Friedel@Sun.COM
878*12918SJan.Friedel@Sun.COM if (!do_getqlowater_scf(&cval_lowater)) {
879*12918SJan.Friedel@Sun.COM (void) printf(gettext("Could not get configured value of "
880*12918SJan.Friedel@Sun.COM "queue lowater mark.\n"));
881*12918SJan.Friedel@Sun.COM return (B_FALSE);
882*12918SJan.Friedel@Sun.COM }
883*12918SJan.Friedel@Sun.COM if (cval_lowater == 0) {
884*12918SJan.Friedel@Sun.COM cval_lowater = AQ_MINLOW;
885*12918SJan.Friedel@Sun.COM }
886*12918SJan.Friedel@Sun.COM if (!CHK_BDRY_QHIWATER(cval_lowater, *cval) && *cval != 0) {
887*12918SJan.Friedel@Sun.COM (void) printf(gettext("Specified audit queue hiwater mark is "
888*12918SJan.Friedel@Sun.COM "outside of allowed boundaries.\n"));
889*12918SJan.Friedel@Sun.COM return (B_FALSE);
890*12918SJan.Friedel@Sun.COM }
891*12918SJan.Friedel@Sun.COM
892*12918SJan.Friedel@Sun.COM cval_l = (uint64_t)*cval;
893*12918SJan.Friedel@Sun.COM
894*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
895*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, QUEUECTRL_QHIWATER, SCF_TYPE_COUNT,
896*12918SJan.Friedel@Sun.COM &cval_l);
897*12918SJan.Friedel@Sun.COM
898*12918SJan.Friedel@Sun.COM return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
899*12918SJan.Friedel@Sun.COM }
900*12918SJan.Friedel@Sun.COM
901*12918SJan.Friedel@Sun.COM /*
902*12918SJan.Friedel@Sun.COM * do_setqlowater_scf() - set the qlowater property value of the audit service
903*12918SJan.Friedel@Sun.COM */
904*12918SJan.Friedel@Sun.COM boolean_t
do_setqlowater_scf(size_t * cval)905*12918SJan.Friedel@Sun.COM do_setqlowater_scf(size_t *cval)
906*12918SJan.Friedel@Sun.COM {
907*12918SJan.Friedel@Sun.COM uint64_t cval_l;
908*12918SJan.Friedel@Sun.COM size_t cval_hiwater;
909*12918SJan.Friedel@Sun.COM
910*12918SJan.Friedel@Sun.COM if (!do_getqhiwater_scf(&cval_hiwater)) {
911*12918SJan.Friedel@Sun.COM (void) printf(gettext("Could not get configured value of "
912*12918SJan.Friedel@Sun.COM "queue hiwater mark.\n"));
913*12918SJan.Friedel@Sun.COM return (B_FALSE);
914*12918SJan.Friedel@Sun.COM }
915*12918SJan.Friedel@Sun.COM if (cval_hiwater == 0) {
916*12918SJan.Friedel@Sun.COM cval_hiwater = AQ_MAXHIGH;
917*12918SJan.Friedel@Sun.COM }
918*12918SJan.Friedel@Sun.COM if (!CHK_BDRY_QLOWATER(*cval, cval_hiwater) && *cval != 0) {
919*12918SJan.Friedel@Sun.COM (void) printf(gettext("Specified audit queue lowater mark is "
920*12918SJan.Friedel@Sun.COM "outside of allowed boundaries.\n"));
921*12918SJan.Friedel@Sun.COM return (B_FALSE);
922*12918SJan.Friedel@Sun.COM }
923*12918SJan.Friedel@Sun.COM
924*12918SJan.Friedel@Sun.COM cval_l = (uint64_t)*cval;
925*12918SJan.Friedel@Sun.COM
926*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
927*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, QUEUECTRL_QLOWATER, SCF_TYPE_COUNT,
928*12918SJan.Friedel@Sun.COM &cval_l);
929*12918SJan.Friedel@Sun.COM
930*12918SJan.Friedel@Sun.COM return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
931*12918SJan.Friedel@Sun.COM }
932*12918SJan.Friedel@Sun.COM
933*12918SJan.Friedel@Sun.COM /*
934*12918SJan.Friedel@Sun.COM * do_getflags_scf() - get the audit attributable flags from service
935*12918SJan.Friedel@Sun.COM */
936*12918SJan.Friedel@Sun.COM boolean_t
do_getflags_scf(char ** flags)937*12918SJan.Friedel@Sun.COM do_getflags_scf(char **flags)
938*12918SJan.Friedel@Sun.COM {
939*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
940*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, PRESELECTION_FLAGS, SCF_TYPE_ASTRING,
941*12918SJan.Friedel@Sun.COM flags);
942*12918SJan.Friedel@Sun.COM
943*12918SJan.Friedel@Sun.COM if (!get_val_scf(prop_vect, ASI_PGROUP_PRESELECTION)) {
944*12918SJan.Friedel@Sun.COM return (B_FALSE);
945*12918SJan.Friedel@Sun.COM }
946*12918SJan.Friedel@Sun.COM
947*12918SJan.Friedel@Sun.COM return (B_TRUE);
948*12918SJan.Friedel@Sun.COM }
949*12918SJan.Friedel@Sun.COM
950*12918SJan.Friedel@Sun.COM /*
951*12918SJan.Friedel@Sun.COM * do_getnaflags_scf() - get the audit non-attributable flags from service
952*12918SJan.Friedel@Sun.COM */
953*12918SJan.Friedel@Sun.COM boolean_t
do_getnaflags_scf(char ** naflags)954*12918SJan.Friedel@Sun.COM do_getnaflags_scf(char **naflags)
955*12918SJan.Friedel@Sun.COM {
956*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
957*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, PRESELECTION_NAFLAGS, SCF_TYPE_ASTRING,
958*12918SJan.Friedel@Sun.COM naflags);
959*12918SJan.Friedel@Sun.COM
960*12918SJan.Friedel@Sun.COM if (!get_val_scf(prop_vect, ASI_PGROUP_PRESELECTION)) {
961*12918SJan.Friedel@Sun.COM return (B_FALSE);
962*12918SJan.Friedel@Sun.COM }
963*12918SJan.Friedel@Sun.COM
964*12918SJan.Friedel@Sun.COM return (B_TRUE);
965*12918SJan.Friedel@Sun.COM }
966*12918SJan.Friedel@Sun.COM
967*12918SJan.Friedel@Sun.COM /*
968*12918SJan.Friedel@Sun.COM * do_setflags_scf() - set the attributable mask property value of the audit
969*12918SJan.Friedel@Sun.COM * service
970*12918SJan.Friedel@Sun.COM */
971*12918SJan.Friedel@Sun.COM boolean_t
do_setflags_scf(char * flags)972*12918SJan.Friedel@Sun.COM do_setflags_scf(char *flags)
973*12918SJan.Friedel@Sun.COM {
974*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
975*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, PRESELECTION_FLAGS, SCF_TYPE_ASTRING,
976*12918SJan.Friedel@Sun.COM flags);
977*12918SJan.Friedel@Sun.COM
978*12918SJan.Friedel@Sun.COM return (set_val_scf(prop_vect, ASI_PGROUP_PRESELECTION));
979*12918SJan.Friedel@Sun.COM }
980*12918SJan.Friedel@Sun.COM
981*12918SJan.Friedel@Sun.COM /*
982*12918SJan.Friedel@Sun.COM * do_setnaflags_scf() - set the attributable mask property value of the audit
983*12918SJan.Friedel@Sun.COM * service
984*12918SJan.Friedel@Sun.COM */
985*12918SJan.Friedel@Sun.COM boolean_t
do_setnaflags_scf(char * naflags)986*12918SJan.Friedel@Sun.COM do_setnaflags_scf(char *naflags)
987*12918SJan.Friedel@Sun.COM {
988*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
989*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect, PRESELECTION_NAFLAGS, SCF_TYPE_ASTRING,
990*12918SJan.Friedel@Sun.COM naflags);
991*12918SJan.Friedel@Sun.COM
992*12918SJan.Friedel@Sun.COM return (set_val_scf(prop_vect, ASI_PGROUP_PRESELECTION));
993*12918SJan.Friedel@Sun.COM }
994*12918SJan.Friedel@Sun.COM
995*12918SJan.Friedel@Sun.COM /*
996*12918SJan.Friedel@Sun.COM * plugin_avail_scf() - look for the plugin in the audit service configuration
997*12918SJan.Friedel@Sun.COM */
998*12918SJan.Friedel@Sun.COM boolean_t
plugin_avail_scf(const char * plugin_str)999*12918SJan.Friedel@Sun.COM plugin_avail_scf(const char *plugin_str)
1000*12918SJan.Friedel@Sun.COM {
1001*12918SJan.Friedel@Sun.COM scf_simple_handle_t *sh;
1002*12918SJan.Friedel@Sun.COM
1003*12918SJan.Friedel@Sun.COM if (plugin_str == NULL || *plugin_str == '\0') {
1004*12918SJan.Friedel@Sun.COM return (B_FALSE);
1005*12918SJan.Friedel@Sun.COM }
1006*12918SJan.Friedel@Sun.COM
1007*12918SJan.Friedel@Sun.COM if ((sh = scf_general_pg_setup(AUDITD_FMRI, plugin_str)) == NULL) {
1008*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "No such plugin found: %s (%s)\n", plugin_str,
1009*12918SJan.Friedel@Sun.COM scf_strerror(scf_error())));
1010*12918SJan.Friedel@Sun.COM return (B_FALSE);
1011*12918SJan.Friedel@Sun.COM }
1012*12918SJan.Friedel@Sun.COM
1013*12918SJan.Friedel@Sun.COM scf_simple_handle_destroy(sh);
1014*12918SJan.Friedel@Sun.COM return (B_TRUE);
1015*12918SJan.Friedel@Sun.COM }
1016*12918SJan.Friedel@Sun.COM
1017*12918SJan.Friedel@Sun.COM /*
1018*12918SJan.Friedel@Sun.COM * do_getpluginconfig_scf() - get plugin configuration from the audit service
1019*12918SJan.Friedel@Sun.COM * configuration.
1020*12918SJan.Friedel@Sun.COM */
1021*12918SJan.Friedel@Sun.COM boolean_t
do_getpluginconfig_scf(char * plugin_str,scf_plugin_kva_node_t ** plugin_kva_ll)1022*12918SJan.Friedel@Sun.COM do_getpluginconfig_scf(char *plugin_str, scf_plugin_kva_node_t **plugin_kva_ll)
1023*12918SJan.Friedel@Sun.COM {
1024*12918SJan.Friedel@Sun.COM
1025*12918SJan.Friedel@Sun.COM char *asi_fmri;
1026*12918SJan.Friedel@Sun.COM asi_scfhandle_t handle;
1027*12918SJan.Friedel@Sun.COM asi_scfhandle_iter_t handle_iter;
1028*12918SJan.Friedel@Sun.COM boolean_t plugin_all = B_FALSE;
1029*12918SJan.Friedel@Sun.COM boolean_t rv = B_TRUE;
1030*12918SJan.Friedel@Sun.COM
1031*12918SJan.Friedel@Sun.COM if (plugin_str == NULL || *plugin_str == '\0') {
1032*12918SJan.Friedel@Sun.COM if (asprintf(&asi_fmri, "%s", AUDITD_FMRI) == -1) {
1033*12918SJan.Friedel@Sun.COM prt_error(gettext("Out of memory."));
1034*12918SJan.Friedel@Sun.COM return (B_FALSE);
1035*12918SJan.Friedel@Sun.COM }
1036*12918SJan.Friedel@Sun.COM plugin_all = B_TRUE;
1037*12918SJan.Friedel@Sun.COM } else {
1038*12918SJan.Friedel@Sun.COM if (asprintf(&asi_fmri, "%s%s%s", AUDITD_FMRI,
1039*12918SJan.Friedel@Sun.COM SCF_FMRI_PROPERTYGRP_PREFIX, plugin_str) == -1) {
1040*12918SJan.Friedel@Sun.COM prt_error(gettext("Out of memory."));
1041*12918SJan.Friedel@Sun.COM return (B_FALSE);
1042*12918SJan.Friedel@Sun.COM }
1043*12918SJan.Friedel@Sun.COM }
1044*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "%s will be decoded\n", asi_fmri));
1045*12918SJan.Friedel@Sun.COM
1046*12918SJan.Friedel@Sun.COM if (!scf_init(&handle)) {
1047*12918SJan.Friedel@Sun.COM prt_error(gettext("Unable to initialize scf handles."));
1048*12918SJan.Friedel@Sun.COM free(asi_fmri);
1049*12918SJan.Friedel@Sun.COM return (B_FALSE);
1050*12918SJan.Friedel@Sun.COM }
1051*12918SJan.Friedel@Sun.COM
1052*12918SJan.Friedel@Sun.COM if (scf_handle_decode_fmri(handle.hndl, asi_fmri, NULL, NULL,
1053*12918SJan.Friedel@Sun.COM handle.inst, plugin_all ? NULL : handle.pgrp, NULL,
1054*12918SJan.Friedel@Sun.COM SCF_DECODE_FMRI_EXACT) == -1) {
1055*12918SJan.Friedel@Sun.COM prt_scf_err();
1056*12918SJan.Friedel@Sun.COM scf_free(&handle);
1057*12918SJan.Friedel@Sun.COM free(asi_fmri);
1058*12918SJan.Friedel@Sun.COM return (B_FALSE);
1059*12918SJan.Friedel@Sun.COM }
1060*12918SJan.Friedel@Sun.COM
1061*12918SJan.Friedel@Sun.COM if (!scf_init_iter(&handle_iter, &handle)) {
1062*12918SJan.Friedel@Sun.COM prt_error(gettext("Unable to initialize scf iter handles."));
1063*12918SJan.Friedel@Sun.COM scf_free(&handle);
1064*12918SJan.Friedel@Sun.COM free(asi_fmri);
1065*12918SJan.Friedel@Sun.COM return (B_FALSE);
1066*12918SJan.Friedel@Sun.COM }
1067*12918SJan.Friedel@Sun.COM
1068*12918SJan.Friedel@Sun.COM
1069*12918SJan.Friedel@Sun.COM if (plugin_all) {
1070*12918SJan.Friedel@Sun.COM rv = get_plugin_kva(&handle, &handle_iter, plugin_kva_ll, NULL);
1071*12918SJan.Friedel@Sun.COM } else {
1072*12918SJan.Friedel@Sun.COM rv = get_plugin_kva(&handle, &handle_iter, plugin_kva_ll,
1073*12918SJan.Friedel@Sun.COM plugin_str);
1074*12918SJan.Friedel@Sun.COM }
1075*12918SJan.Friedel@Sun.COM
1076*12918SJan.Friedel@Sun.COM scf_free(&handle);
1077*12918SJan.Friedel@Sun.COM scf_free_iter(&handle_iter);
1078*12918SJan.Friedel@Sun.COM free(asi_fmri);
1079*12918SJan.Friedel@Sun.COM return (rv);
1080*12918SJan.Friedel@Sun.COM }
1081*12918SJan.Friedel@Sun.COM
1082*12918SJan.Friedel@Sun.COM /*
1083*12918SJan.Friedel@Sun.COM * do_setpluginconfig_scf() - set plugin configuration in the audit service
1084*12918SJan.Friedel@Sun.COM * configuration.
1085*12918SJan.Friedel@Sun.COM */
1086*12918SJan.Friedel@Sun.COM boolean_t
do_setpluginconfig_scf(char * plugin_str,boolean_t plugin_state,char * plugin_att,int plugin_qsize)1087*12918SJan.Friedel@Sun.COM do_setpluginconfig_scf(char *plugin_str, boolean_t plugin_state,
1088*12918SJan.Friedel@Sun.COM char *plugin_att, int plugin_qsize)
1089*12918SJan.Friedel@Sun.COM {
1090*12918SJan.Friedel@Sun.COM kva_t *plugin_att_kva = NULL;
1091*12918SJan.Friedel@Sun.COM char *plugin_att_ptr = plugin_att;
1092*12918SJan.Friedel@Sun.COM char *plugin_att_clr_ptr = plugin_att;
1093*12918SJan.Friedel@Sun.COM scf_simple_prop_t *plugin_prop;
1094*12918SJan.Friedel@Sun.COM scf_type_t plugin_prop_type;
1095*12918SJan.Friedel@Sun.COM scf_propvec_t *prop_vect_ptr;
1096*12918SJan.Friedel@Sun.COM int cnt = 0;
1097*12918SJan.Friedel@Sun.COM kv_t *data;
1098*12918SJan.Friedel@Sun.COM boolean_t rval = B_TRUE;
1099*12918SJan.Friedel@Sun.COM uint64_t plugin_qsize_l = (uint64_t)plugin_qsize;
1100*12918SJan.Friedel@Sun.COM
1101*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "Auditd plugin configuration to be set:\n\tplugin=%s\n\t"
1102*12918SJan.Friedel@Sun.COM "state=%d (%s)\n\tattributes=%s\n\tqsize=%d%s\n", plugin_str,
1103*12918SJan.Friedel@Sun.COM plugin_state, plugin_state == B_TRUE ? "active" : "inactive",
1104*12918SJan.Friedel@Sun.COM plugin_att == NULL ? " (unspecified)" : plugin_att,
1105*12918SJan.Friedel@Sun.COM plugin_qsize, plugin_qsize == -1 ? " (unspecified)" : ""));
1106*12918SJan.Friedel@Sun.COM
1107*12918SJan.Friedel@Sun.COM bzero(prop_vect, sizeof (prop_vect));
1108*12918SJan.Friedel@Sun.COM prop_vect_ptr = prop_vect;
1109*12918SJan.Friedel@Sun.COM
1110*12918SJan.Friedel@Sun.COM if (plugin_att != NULL) {
1111*12918SJan.Friedel@Sun.COM
1112*12918SJan.Friedel@Sun.COM /* get rid of white-space chars */
1113*12918SJan.Friedel@Sun.COM if (*plugin_att_ptr != '\0') {
1114*12918SJan.Friedel@Sun.COM while (*plugin_att_ptr != '\0') {
1115*12918SJan.Friedel@Sun.COM if (isspace(*plugin_att_ptr) == 0) {
1116*12918SJan.Friedel@Sun.COM *plugin_att_clr_ptr++ = *plugin_att_ptr;
1117*12918SJan.Friedel@Sun.COM }
1118*12918SJan.Friedel@Sun.COM plugin_att_ptr++;
1119*12918SJan.Friedel@Sun.COM }
1120*12918SJan.Friedel@Sun.COM *plugin_att_clr_ptr = '\0';
1121*12918SJan.Friedel@Sun.COM }
1122*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "attributes (no white-space): %s\n", plugin_att));
1123*12918SJan.Friedel@Sun.COM
1124*12918SJan.Friedel@Sun.COM /* allow empty plugin_att */
1125*12918SJan.Friedel@Sun.COM if (*plugin_att == '\0') {
1126*12918SJan.Friedel@Sun.COM cnt = 0;
1127*12918SJan.Friedel@Sun.COM data = NULL;
1128*12918SJan.Friedel@Sun.COM } else {
1129*12918SJan.Friedel@Sun.COM plugin_att_kva = _str2kva(plugin_att, "=", ";");
1130*12918SJan.Friedel@Sun.COM if (plugin_att_kva == NULL) {
1131*12918SJan.Friedel@Sun.COM prt_error(gettext("Could not parse plugin "
1132*12918SJan.Friedel@Sun.COM "attributes."));
1133*12918SJan.Friedel@Sun.COM return (B_FALSE);
1134*12918SJan.Friedel@Sun.COM }
1135*12918SJan.Friedel@Sun.COM
1136*12918SJan.Friedel@Sun.COM free_static_att_kva(plugin_att_kva);
1137*12918SJan.Friedel@Sun.COM cnt = plugin_att_kva->length;
1138*12918SJan.Friedel@Sun.COM data = plugin_att_kva->data;
1139*12918SJan.Friedel@Sun.COM }
1140*12918SJan.Friedel@Sun.COM }
1141*12918SJan.Friedel@Sun.COM
1142*12918SJan.Friedel@Sun.COM /* set state */
1143*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, PLUGIN_ACTIVE, SCF_TYPE_BOOLEAN,
1144*12918SJan.Friedel@Sun.COM &plugin_state);
1145*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "Prepared active -> %d\n", plugin_state));
1146*12918SJan.Friedel@Sun.COM
1147*12918SJan.Friedel@Sun.COM /* set attributes */
1148*12918SJan.Friedel@Sun.COM while (cnt) {
1149*12918SJan.Friedel@Sun.COM if (data->value == NULL) {
1150*12918SJan.Friedel@Sun.COM cnt--;
1151*12918SJan.Friedel@Sun.COM data++;
1152*12918SJan.Friedel@Sun.COM continue;
1153*12918SJan.Friedel@Sun.COM }
1154*12918SJan.Friedel@Sun.COM if (!chk_prop_vect(&prop_vect_ptr, plugin_str)) {
1155*12918SJan.Friedel@Sun.COM rval = B_FALSE;
1156*12918SJan.Friedel@Sun.COM goto err_out;
1157*12918SJan.Friedel@Sun.COM }
1158*12918SJan.Friedel@Sun.COM
1159*12918SJan.Friedel@Sun.COM if ((plugin_prop = scf_simple_prop_get(NULL,
1160*12918SJan.Friedel@Sun.COM AUDITD_FMRI, plugin_str, data->key)) == NULL) {
1161*12918SJan.Friedel@Sun.COM prt_error(gettext("Could not get configuration for "
1162*12918SJan.Friedel@Sun.COM "attribute: %s"), data->key);
1163*12918SJan.Friedel@Sun.COM prt_scf_err();
1164*12918SJan.Friedel@Sun.COM rval = B_FALSE;
1165*12918SJan.Friedel@Sun.COM goto err_out;
1166*12918SJan.Friedel@Sun.COM }
1167*12918SJan.Friedel@Sun.COM if ((plugin_prop_type = scf_simple_prop_type(plugin_prop))
1168*12918SJan.Friedel@Sun.COM == -1) {
1169*12918SJan.Friedel@Sun.COM prt_error(gettext("Could not get property type: %s"),
1170*12918SJan.Friedel@Sun.COM data->key);
1171*12918SJan.Friedel@Sun.COM prt_scf_err();
1172*12918SJan.Friedel@Sun.COM rval = B_FALSE;
1173*12918SJan.Friedel@Sun.COM goto err_out;
1174*12918SJan.Friedel@Sun.COM }
1175*12918SJan.Friedel@Sun.COM
1176*12918SJan.Friedel@Sun.COM switch (plugin_prop_type) {
1177*12918SJan.Friedel@Sun.COM case SCF_TYPE_BOOLEAN: {
1178*12918SJan.Friedel@Sun.COM uint8_t *pval_bool;
1179*12918SJan.Friedel@Sun.COM pval_bool = (uint8_t *)malloc(sizeof (uint8_t));
1180*12918SJan.Friedel@Sun.COM if (pval_bool == NULL) {
1181*12918SJan.Friedel@Sun.COM prt_error(gettext("No free memory available."));
1182*12918SJan.Friedel@Sun.COM rval = B_FALSE;
1183*12918SJan.Friedel@Sun.COM goto err_out;
1184*12918SJan.Friedel@Sun.COM }
1185*12918SJan.Friedel@Sun.COM *pval_bool = (uint8_t)atoi(data->value);
1186*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, data->key,
1187*12918SJan.Friedel@Sun.COM SCF_TYPE_BOOLEAN, pval_bool);
1188*12918SJan.Friedel@Sun.COM break;
1189*12918SJan.Friedel@Sun.COM }
1190*12918SJan.Friedel@Sun.COM case SCF_TYPE_ASTRING: {
1191*12918SJan.Friedel@Sun.COM char *pval_str;
1192*12918SJan.Friedel@Sun.COM if ((pval_str = strdup(data->value)) == NULL) {
1193*12918SJan.Friedel@Sun.COM prt_error(gettext("No free memory available."));
1194*12918SJan.Friedel@Sun.COM rval = B_FALSE;
1195*12918SJan.Friedel@Sun.COM goto err_out;
1196*12918SJan.Friedel@Sun.COM }
1197*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, data->key,
1198*12918SJan.Friedel@Sun.COM SCF_TYPE_ASTRING, pval_str);
1199*12918SJan.Friedel@Sun.COM break;
1200*12918SJan.Friedel@Sun.COM }
1201*12918SJan.Friedel@Sun.COM case SCF_TYPE_COUNT: {
1202*12918SJan.Friedel@Sun.COM uint64_t *pval_count;
1203*12918SJan.Friedel@Sun.COM pval_count = (uint64_t *)malloc(sizeof (uint64_t));
1204*12918SJan.Friedel@Sun.COM if (pval_count == NULL) {
1205*12918SJan.Friedel@Sun.COM prt_error(gettext("No free memory available."));
1206*12918SJan.Friedel@Sun.COM rval = B_FALSE;
1207*12918SJan.Friedel@Sun.COM goto err_out;
1208*12918SJan.Friedel@Sun.COM }
1209*12918SJan.Friedel@Sun.COM *pval_count = (uint64_t)atoll(data->value);
1210*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr++, data->key,
1211*12918SJan.Friedel@Sun.COM SCF_TYPE_COUNT, pval_count);
1212*12918SJan.Friedel@Sun.COM break;
1213*12918SJan.Friedel@Sun.COM }
1214*12918SJan.Friedel@Sun.COM default:
1215*12918SJan.Friedel@Sun.COM prt_error(gettext("Unsupported property type: %s (%d)"),
1216*12918SJan.Friedel@Sun.COM data->key, plugin_prop_type);
1217*12918SJan.Friedel@Sun.COM break;
1218*12918SJan.Friedel@Sun.COM }
1219*12918SJan.Friedel@Sun.COM
1220*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "Prepared %s -> %s\n", data->key, data->value));
1221*12918SJan.Friedel@Sun.COM scf_simple_prop_free(plugin_prop);
1222*12918SJan.Friedel@Sun.COM data++;
1223*12918SJan.Friedel@Sun.COM cnt--;
1224*12918SJan.Friedel@Sun.COM }
1225*12918SJan.Friedel@Sun.COM
1226*12918SJan.Friedel@Sun.COM if (!chk_prop_vect(&prop_vect_ptr, plugin_str)) {
1227*12918SJan.Friedel@Sun.COM rval = B_FALSE;
1228*12918SJan.Friedel@Sun.COM goto err_out;
1229*12918SJan.Friedel@Sun.COM }
1230*12918SJan.Friedel@Sun.COM
1231*12918SJan.Friedel@Sun.COM /* set qsize */
1232*12918SJan.Friedel@Sun.COM if (plugin_qsize != -1) {
1233*12918SJan.Friedel@Sun.COM add_prop_vect_scf(prop_vect_ptr, PLUGIN_QSIZE, SCF_TYPE_COUNT,
1234*12918SJan.Friedel@Sun.COM &plugin_qsize_l);
1235*12918SJan.Friedel@Sun.COM DPRINT((dbfp, "Prepared qsize -> %d\n", plugin_qsize));
1236*12918SJan.Friedel@Sun.COM }
1237*12918SJan.Friedel@Sun.COM
1238*12918SJan.Friedel@Sun.COM if (!set_val_scf(prop_vect, plugin_str)) {
1239*12918SJan.Friedel@Sun.COM rval = B_FALSE;
1240*12918SJan.Friedel@Sun.COM }
1241*12918SJan.Friedel@Sun.COM
1242*12918SJan.Friedel@Sun.COM err_out:
1243*12918SJan.Friedel@Sun.COM free_prop_vect();
1244*12918SJan.Friedel@Sun.COM _kva_free(plugin_att_kva);
1245*12918SJan.Friedel@Sun.COM return (rval);
1246*12918SJan.Friedel@Sun.COM }
1247*12918SJan.Friedel@Sun.COM
1248*12918SJan.Friedel@Sun.COM /*
1249*12918SJan.Friedel@Sun.COM * plugin_kva_ll_free() - free the memory used by plugin kva linked list.
1250*12918SJan.Friedel@Sun.COM */
1251*12918SJan.Friedel@Sun.COM void
plugin_kva_ll_free(scf_plugin_kva_node_t * node)1252*12918SJan.Friedel@Sun.COM plugin_kva_ll_free(scf_plugin_kva_node_t *node)
1253*12918SJan.Friedel@Sun.COM {
1254*12918SJan.Friedel@Sun.COM scf_plugin_kva_node_t *node_next;
1255*12918SJan.Friedel@Sun.COM
1256*12918SJan.Friedel@Sun.COM if (node == NULL) {
1257*12918SJan.Friedel@Sun.COM return;
1258*12918SJan.Friedel@Sun.COM }
1259*12918SJan.Friedel@Sun.COM
1260*12918SJan.Friedel@Sun.COM while (node->prev != NULL) {
1261*12918SJan.Friedel@Sun.COM node = node->prev;
1262*12918SJan.Friedel@Sun.COM }
1263*12918SJan.Friedel@Sun.COM while (node != NULL) {
1264*12918SJan.Friedel@Sun.COM _kva_free(node->plugin_kva);
1265*12918SJan.Friedel@Sun.COM node_next = node->next;
1266*12918SJan.Friedel@Sun.COM free(node);
1267*12918SJan.Friedel@Sun.COM node = node_next;
1268*12918SJan.Friedel@Sun.COM }
1269*12918SJan.Friedel@Sun.COM }
1270*12918SJan.Friedel@Sun.COM
1271*12918SJan.Friedel@Sun.COM /*
1272*12918SJan.Friedel@Sun.COM * get_policy() - get policy mask entry
1273*12918SJan.Friedel@Sun.COM */
1274*12918SJan.Friedel@Sun.COM uint32_t
get_policy(char * policy)1275*12918SJan.Friedel@Sun.COM get_policy(char *policy)
1276*12918SJan.Friedel@Sun.COM {
1277*12918SJan.Friedel@Sun.COM int i;
1278*12918SJan.Friedel@Sun.COM
1279*12918SJan.Friedel@Sun.COM for (i = 0; i < POLICY_TBL_SZ; i++) {
1280*12918SJan.Friedel@Sun.COM if (strcasecmp(policy, policy_table[i].policy_str) == 0) {
1281*12918SJan.Friedel@Sun.COM return (policy_table[i].policy_mask);
1282*12918SJan.Friedel@Sun.COM }
1283*12918SJan.Friedel@Sun.COM }
1284*12918SJan.Friedel@Sun.COM
1285*12918SJan.Friedel@Sun.COM return (0);
1286*12918SJan.Friedel@Sun.COM }
1287