1*11767SAnurag.Maskey@Sun.COM /*
2*11767SAnurag.Maskey@Sun.COM * CDDL HEADER START
3*11767SAnurag.Maskey@Sun.COM *
4*11767SAnurag.Maskey@Sun.COM * The contents of this file are subject to the terms of the
5*11767SAnurag.Maskey@Sun.COM * Common Development and Distribution License (the "License").
6*11767SAnurag.Maskey@Sun.COM * You may not use this file except in compliance with the License.
7*11767SAnurag.Maskey@Sun.COM *
8*11767SAnurag.Maskey@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*11767SAnurag.Maskey@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*11767SAnurag.Maskey@Sun.COM * See the License for the specific language governing permissions
11*11767SAnurag.Maskey@Sun.COM * and limitations under the License.
12*11767SAnurag.Maskey@Sun.COM *
13*11767SAnurag.Maskey@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*11767SAnurag.Maskey@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*11767SAnurag.Maskey@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*11767SAnurag.Maskey@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*11767SAnurag.Maskey@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*11767SAnurag.Maskey@Sun.COM *
19*11767SAnurag.Maskey@Sun.COM * CDDL HEADER END
20*11767SAnurag.Maskey@Sun.COM */
21*11767SAnurag.Maskey@Sun.COM
22*11767SAnurag.Maskey@Sun.COM /*
23*11767SAnurag.Maskey@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
24*11767SAnurag.Maskey@Sun.COM * Use is subject to license terms.
25*11767SAnurag.Maskey@Sun.COM */
26*11767SAnurag.Maskey@Sun.COM
27*11767SAnurag.Maskey@Sun.COM #include <assert.h>
28*11767SAnurag.Maskey@Sun.COM #include <ctype.h>
29*11767SAnurag.Maskey@Sun.COM #include <sys/param.h>
30*11767SAnurag.Maskey@Sun.COM #include <sys/types.h>
31*11767SAnurag.Maskey@Sun.COM #include <sys/stat.h>
32*11767SAnurag.Maskey@Sun.COM #include <stdio.h>
33*11767SAnurag.Maskey@Sun.COM #include <stdlib.h>
34*11767SAnurag.Maskey@Sun.COM #include <strings.h>
35*11767SAnurag.Maskey@Sun.COM #include <unistd.h>
36*11767SAnurag.Maskey@Sun.COM #include <libscf.h>
37*11767SAnurag.Maskey@Sun.COM #include "libnwam_impl.h"
38*11767SAnurag.Maskey@Sun.COM #include <libnwam_priv.h>
39*11767SAnurag.Maskey@Sun.COM #include <libnwam.h>
40*11767SAnurag.Maskey@Sun.COM
41*11767SAnurag.Maskey@Sun.COM /*
42*11767SAnurag.Maskey@Sun.COM * Functions to support creating, modifying, destroying, querying the
43*11767SAnurag.Maskey@Sun.COM * state of and changing the state of ENM (External Network Modifier)
44*11767SAnurag.Maskey@Sun.COM * objects. ENMs represent services or scripts that can be enabled
45*11767SAnurag.Maskey@Sun.COM * either manually or conditionally for a combination of the set of
46*11767SAnurag.Maskey@Sun.COM * available conditions (an IP address is present, a location is active etc).
47*11767SAnurag.Maskey@Sun.COM */
48*11767SAnurag.Maskey@Sun.COM
49*11767SAnurag.Maskey@Sun.COM typedef nwam_error_t (*nwam_enm_prop_validate_func_t)(nwam_value_t);
50*11767SAnurag.Maskey@Sun.COM
51*11767SAnurag.Maskey@Sun.COM static nwam_error_t valid_enm_activation_mode(nwam_value_t);
52*11767SAnurag.Maskey@Sun.COM
53*11767SAnurag.Maskey@Sun.COM struct nwam_prop_table_entry enm_prop_table_entries[] = {
54*11767SAnurag.Maskey@Sun.COM {NWAM_ENM_PROP_ACTIVATION_MODE, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 1,
55*11767SAnurag.Maskey@Sun.COM valid_enm_activation_mode,
56*11767SAnurag.Maskey@Sun.COM "specifies the ENM activation mode - valid values are:\n"
57*11767SAnurag.Maskey@Sun.COM "\'manual\', \'conditional-any\' and \'conditional-all\'",
58*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY},
59*11767SAnurag.Maskey@Sun.COM {NWAM_ENM_PROP_CONDITIONS, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
60*11767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, nwam_valid_condition,
61*11767SAnurag.Maskey@Sun.COM "specifies the activation condition. Conditions are of the form:\n"
62*11767SAnurag.Maskey@Sun.COM "ncp|ncu|enm|loc name is|is-not active\n"
63*11767SAnurag.Maskey@Sun.COM "ip-address is|is-not|is-in-range|is-not-in-range| 1.2.3.4[/24]\n"
64*11767SAnurag.Maskey@Sun.COM "advertised-domain is|is-not|contains|does-not-contain string\n"
65*11767SAnurag.Maskey@Sun.COM "system-domain is|is-not|contains|does-not-contain string\n"
66*11767SAnurag.Maskey@Sun.COM "essid is|is-not|contains|does-not-contain string\n"
67*11767SAnurag.Maskey@Sun.COM "bssid is|is-not string",
68*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY},
69*11767SAnurag.Maskey@Sun.COM {NWAM_ENM_PROP_ENABLED, NWAM_VALUE_TYPE_BOOLEAN, B_TRUE, 0, 1,
70*11767SAnurag.Maskey@Sun.COM nwam_valid_boolean,
71*11767SAnurag.Maskey@Sun.COM "specifies if manual ENM is to be enabled",
72*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY},
73*11767SAnurag.Maskey@Sun.COM {NWAM_ENM_PROP_FMRI, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
74*11767SAnurag.Maskey@Sun.COM nwam_valid_fmri,
75*11767SAnurag.Maskey@Sun.COM "specifies SMF FMRI of service to be enabled on ENM activation",
76*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY},
77*11767SAnurag.Maskey@Sun.COM {NWAM_ENM_PROP_START, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
78*11767SAnurag.Maskey@Sun.COM nwam_valid_file,
79*11767SAnurag.Maskey@Sun.COM "specifies absolute path to start script to be run on ENM "
80*11767SAnurag.Maskey@Sun.COM "activation",
81*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY},
82*11767SAnurag.Maskey@Sun.COM {NWAM_ENM_PROP_STOP, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
83*11767SAnurag.Maskey@Sun.COM nwam_valid_file,
84*11767SAnurag.Maskey@Sun.COM "specifies absolute path to stop script to be run on ENM "
85*11767SAnurag.Maskey@Sun.COM "deactivation",
86*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}
87*11767SAnurag.Maskey@Sun.COM };
88*11767SAnurag.Maskey@Sun.COM
89*11767SAnurag.Maskey@Sun.COM #define NWAM_NUM_ENM_PROPS (sizeof (enm_prop_table_entries) / \
90*11767SAnurag.Maskey@Sun.COM sizeof (*enm_prop_table_entries))
91*11767SAnurag.Maskey@Sun.COM
92*11767SAnurag.Maskey@Sun.COM struct nwam_prop_table enm_prop_table =
93*11767SAnurag.Maskey@Sun.COM { NWAM_NUM_ENM_PROPS, enm_prop_table_entries };
94*11767SAnurag.Maskey@Sun.COM
95*11767SAnurag.Maskey@Sun.COM static uint64_t
nwam_enm_activation_to_flag(nwam_activation_mode_t activation)96*11767SAnurag.Maskey@Sun.COM nwam_enm_activation_to_flag(nwam_activation_mode_t activation)
97*11767SAnurag.Maskey@Sun.COM {
98*11767SAnurag.Maskey@Sun.COM switch (activation) {
99*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_MANUAL:
100*11767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_MANUAL);
101*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY:
102*11767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ANY);
103*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL:
104*11767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ALL);
105*11767SAnurag.Maskey@Sun.COM default:
106*11767SAnurag.Maskey@Sun.COM return (0);
107*11767SAnurag.Maskey@Sun.COM }
108*11767SAnurag.Maskey@Sun.COM }
109*11767SAnurag.Maskey@Sun.COM
110*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_read(const char * name,uint64_t flags,nwam_enm_handle_t * enmhp)111*11767SAnurag.Maskey@Sun.COM nwam_enm_read(const char *name, uint64_t flags, nwam_enm_handle_t *enmhp)
112*11767SAnurag.Maskey@Sun.COM {
113*11767SAnurag.Maskey@Sun.COM return (nwam_read(NWAM_OBJECT_TYPE_ENM, NWAM_ENM_CONF_FILE, name,
114*11767SAnurag.Maskey@Sun.COM flags, enmhp));
115*11767SAnurag.Maskey@Sun.COM }
116*11767SAnurag.Maskey@Sun.COM
117*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_create(const char * name,const char * fmri,nwam_enm_handle_t * enmhp)118*11767SAnurag.Maskey@Sun.COM nwam_enm_create(const char *name, const char *fmri, nwam_enm_handle_t *enmhp)
119*11767SAnurag.Maskey@Sun.COM {
120*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
121*11767SAnurag.Maskey@Sun.COM nwam_value_t actval = NULL, falseval = NULL, fmrival = NULL;
122*11767SAnurag.Maskey@Sun.COM
123*11767SAnurag.Maskey@Sun.COM assert(enmhp != NULL && name != NULL);
124*11767SAnurag.Maskey@Sun.COM
125*11767SAnurag.Maskey@Sun.COM if ((err = nwam_create(NWAM_OBJECT_TYPE_ENM, NWAM_ENM_CONF_FILE, name,
126*11767SAnurag.Maskey@Sun.COM enmhp)) != NWAM_SUCCESS)
127*11767SAnurag.Maskey@Sun.COM return (err);
128*11767SAnurag.Maskey@Sun.COM
129*11767SAnurag.Maskey@Sun.COM /*
130*11767SAnurag.Maskey@Sun.COM * Create new object list for ENM. The initial activation mode is set,
131*11767SAnurag.Maskey@Sun.COM * and the FMRI property is set, if specified.
132*11767SAnurag.Maskey@Sun.COM */
133*11767SAnurag.Maskey@Sun.COM if ((err = nwam_alloc_object_list(&((*enmhp)->nwh_data)))
134*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
135*11767SAnurag.Maskey@Sun.COM goto finish;
136*11767SAnurag.Maskey@Sun.COM
137*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL,
138*11767SAnurag.Maskey@Sun.COM &actval)) != NWAM_SUCCESS ||
139*11767SAnurag.Maskey@Sun.COM ((fmri != NULL) &&
140*11767SAnurag.Maskey@Sun.COM (err = nwam_value_create_string((char *)fmri, &fmrival))
141*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) ||
142*11767SAnurag.Maskey@Sun.COM (err = nwam_value_create_boolean(B_FALSE, &falseval))
143*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
144*11767SAnurag.Maskey@Sun.COM goto finish;
145*11767SAnurag.Maskey@Sun.COM }
146*11767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*enmhp)->nwh_data,
147*11767SAnurag.Maskey@Sun.COM NWAM_ENM_PROP_ACTIVATION_MODE, actval)) == NWAM_SUCCESS &&
148*11767SAnurag.Maskey@Sun.COM (err = nwam_set_prop_value((*enmhp)->nwh_data,
149*11767SAnurag.Maskey@Sun.COM NWAM_ENM_PROP_ENABLED, falseval)) == NWAM_SUCCESS) {
150*11767SAnurag.Maskey@Sun.COM if (fmri != NULL) {
151*11767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*enmhp)->nwh_data,
152*11767SAnurag.Maskey@Sun.COM NWAM_ENM_PROP_FMRI, fmrival);
153*11767SAnurag.Maskey@Sun.COM }
154*11767SAnurag.Maskey@Sun.COM }
155*11767SAnurag.Maskey@Sun.COM
156*11767SAnurag.Maskey@Sun.COM finish:
157*11767SAnurag.Maskey@Sun.COM nwam_value_free(actval);
158*11767SAnurag.Maskey@Sun.COM nwam_value_free(falseval);
159*11767SAnurag.Maskey@Sun.COM if (fmrival != NULL)
160*11767SAnurag.Maskey@Sun.COM nwam_value_free(fmrival);
161*11767SAnurag.Maskey@Sun.COM
162*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) {
163*11767SAnurag.Maskey@Sun.COM nwam_enm_free(*enmhp);
164*11767SAnurag.Maskey@Sun.COM *enmhp = NULL;
165*11767SAnurag.Maskey@Sun.COM }
166*11767SAnurag.Maskey@Sun.COM
167*11767SAnurag.Maskey@Sun.COM return (err);
168*11767SAnurag.Maskey@Sun.COM }
169*11767SAnurag.Maskey@Sun.COM
170*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_get_name(nwam_enm_handle_t enmh,char ** namep)171*11767SAnurag.Maskey@Sun.COM nwam_enm_get_name(nwam_enm_handle_t enmh, char **namep)
172*11767SAnurag.Maskey@Sun.COM {
173*11767SAnurag.Maskey@Sun.COM return (nwam_get_name(enmh, namep));
174*11767SAnurag.Maskey@Sun.COM }
175*11767SAnurag.Maskey@Sun.COM
176*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_set_name(nwam_enm_handle_t enmh,const char * name)177*11767SAnurag.Maskey@Sun.COM nwam_enm_set_name(nwam_enm_handle_t enmh, const char *name)
178*11767SAnurag.Maskey@Sun.COM {
179*11767SAnurag.Maskey@Sun.COM return (nwam_set_name(enmh, name));
180*11767SAnurag.Maskey@Sun.COM }
181*11767SAnurag.Maskey@Sun.COM
182*11767SAnurag.Maskey@Sun.COM boolean_t
nwam_enm_can_set_name(nwam_enm_handle_t enmh)183*11767SAnurag.Maskey@Sun.COM nwam_enm_can_set_name(nwam_enm_handle_t enmh)
184*11767SAnurag.Maskey@Sun.COM {
185*11767SAnurag.Maskey@Sun.COM return (!enmh->nwh_committed);
186*11767SAnurag.Maskey@Sun.COM }
187*11767SAnurag.Maskey@Sun.COM
188*11767SAnurag.Maskey@Sun.COM /* ARGSUSED2 */
189*11767SAnurag.Maskey@Sun.COM static int
enm_selectcb(struct nwam_handle * hp,uint64_t flags,void * data)190*11767SAnurag.Maskey@Sun.COM enm_selectcb(struct nwam_handle *hp, uint64_t flags, void *data)
191*11767SAnurag.Maskey@Sun.COM {
192*11767SAnurag.Maskey@Sun.COM nwam_enm_handle_t enmh = hp;
193*11767SAnurag.Maskey@Sun.COM uint64_t activation, actflag, walkfilter;
194*11767SAnurag.Maskey@Sun.COM nwam_value_t actval;
195*11767SAnurag.Maskey@Sun.COM
196*11767SAnurag.Maskey@Sun.COM /*
197*11767SAnurag.Maskey@Sun.COM * Get a bitmapped flag value corresponding to this enm's
198*11767SAnurag.Maskey@Sun.COM * activation value - if the activation value is not recognized,
199*11767SAnurag.Maskey@Sun.COM * actflag will be set to 0, and will thus fail to match
200*11767SAnurag.Maskey@Sun.COM * any bit flag passed in by the caller.
201*11767SAnurag.Maskey@Sun.COM */
202*11767SAnurag.Maskey@Sun.COM if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ACTIVATION_MODE,
203*11767SAnurag.Maskey@Sun.COM &actval) != NWAM_SUCCESS) {
204*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
205*11767SAnurag.Maskey@Sun.COM }
206*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(actval, &activation) != NWAM_SUCCESS) {
207*11767SAnurag.Maskey@Sun.COM nwam_value_free(actval);
208*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
209*11767SAnurag.Maskey@Sun.COM }
210*11767SAnurag.Maskey@Sun.COM
211*11767SAnurag.Maskey@Sun.COM actflag = nwam_enm_activation_to_flag(activation);
212*11767SAnurag.Maskey@Sun.COM nwam_value_free(actval);
213*11767SAnurag.Maskey@Sun.COM if ((walkfilter = flags & NWAM_WALK_FILTER_MASK) == 0)
214*11767SAnurag.Maskey@Sun.COM walkfilter = NWAM_FLAG_ACTIVATION_MODE_ALL;
215*11767SAnurag.Maskey@Sun.COM if (actflag & walkfilter)
216*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
217*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
218*11767SAnurag.Maskey@Sun.COM }
219*11767SAnurag.Maskey@Sun.COM
220*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_walk_enms(int (* cb)(nwam_enm_handle_t,void *),void * data,uint64_t flags,int * retp)221*11767SAnurag.Maskey@Sun.COM nwam_walk_enms(int(*cb)(nwam_enm_handle_t, void *), void *data, uint64_t flags,
222*11767SAnurag.Maskey@Sun.COM int *retp)
223*11767SAnurag.Maskey@Sun.COM {
224*11767SAnurag.Maskey@Sun.COM nwam_error_t err = nwam_valid_flags(flags,
225*11767SAnurag.Maskey@Sun.COM NWAM_FLAG_ACTIVATION_MODE_ALL | NWAM_FLAG_BLOCKING);
226*11767SAnurag.Maskey@Sun.COM
227*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
228*11767SAnurag.Maskey@Sun.COM return (err);
229*11767SAnurag.Maskey@Sun.COM
230*11767SAnurag.Maskey@Sun.COM return (nwam_walk(NWAM_OBJECT_TYPE_ENM, NWAM_ENM_CONF_FILE,
231*11767SAnurag.Maskey@Sun.COM cb, data, flags, retp, enm_selectcb));
232*11767SAnurag.Maskey@Sun.COM }
233*11767SAnurag.Maskey@Sun.COM
234*11767SAnurag.Maskey@Sun.COM void
nwam_enm_free(nwam_enm_handle_t enmh)235*11767SAnurag.Maskey@Sun.COM nwam_enm_free(nwam_enm_handle_t enmh)
236*11767SAnurag.Maskey@Sun.COM {
237*11767SAnurag.Maskey@Sun.COM nwam_free(enmh);
238*11767SAnurag.Maskey@Sun.COM }
239*11767SAnurag.Maskey@Sun.COM
240*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_copy(nwam_enm_handle_t oldenmh,const char * newname,nwam_enm_handle_t * newenmhp)241*11767SAnurag.Maskey@Sun.COM nwam_enm_copy(nwam_enm_handle_t oldenmh, const char *newname,
242*11767SAnurag.Maskey@Sun.COM nwam_enm_handle_t *newenmhp)
243*11767SAnurag.Maskey@Sun.COM {
244*11767SAnurag.Maskey@Sun.COM return (nwam_copy(NWAM_ENM_CONF_FILE, oldenmh, newname, newenmhp));
245*11767SAnurag.Maskey@Sun.COM }
246*11767SAnurag.Maskey@Sun.COM
247*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_delete_prop(nwam_enm_handle_t enmh,const char * propname)248*11767SAnurag.Maskey@Sun.COM nwam_enm_delete_prop(nwam_enm_handle_t enmh, const char *propname)
249*11767SAnurag.Maskey@Sun.COM {
250*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
251*11767SAnurag.Maskey@Sun.COM boolean_t ro;
252*11767SAnurag.Maskey@Sun.COM void *olddata;
253*11767SAnurag.Maskey@Sun.COM boolean_t manual;
254*11767SAnurag.Maskey@Sun.COM
255*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL && propname != NULL);
256*11767SAnurag.Maskey@Sun.COM
257*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_prop_read_only(propname, &ro)) != NWAM_SUCCESS)
258*11767SAnurag.Maskey@Sun.COM return (err);
259*11767SAnurag.Maskey@Sun.COM if (ro) {
260*11767SAnurag.Maskey@Sun.COM /*
261*11767SAnurag.Maskey@Sun.COM * If the activation-mode is not manual, allow the enabled
262*11767SAnurag.Maskey@Sun.COM * property to be deleted.
263*11767SAnurag.Maskey@Sun.COM */
264*11767SAnurag.Maskey@Sun.COM if (strcmp(propname, NWAM_ENM_PROP_ENABLED) != 0)
265*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY);
266*11767SAnurag.Maskey@Sun.COM
267*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_is_manual(enmh, &manual)) != NWAM_SUCCESS)
268*11767SAnurag.Maskey@Sun.COM return (err);
269*11767SAnurag.Maskey@Sun.COM if (manual)
270*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY);
271*11767SAnurag.Maskey@Sun.COM }
272*11767SAnurag.Maskey@Sun.COM
273*11767SAnurag.Maskey@Sun.COM /*
274*11767SAnurag.Maskey@Sun.COM * Duplicate data, remove property and validate. If validation
275*11767SAnurag.Maskey@Sun.COM * fails, revert to data duplicated prior to remove.
276*11767SAnurag.Maskey@Sun.COM */
277*11767SAnurag.Maskey@Sun.COM if ((err = nwam_dup_object_list(enmh->nwh_data, &olddata))
278*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
279*11767SAnurag.Maskey@Sun.COM return (err);
280*11767SAnurag.Maskey@Sun.COM if ((err = nwam_delete_prop(enmh->nwh_data, propname))
281*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
282*11767SAnurag.Maskey@Sun.COM nwam_free_object_list(enmh->nwh_data);
283*11767SAnurag.Maskey@Sun.COM enmh->nwh_data = olddata;
284*11767SAnurag.Maskey@Sun.COM return (err);
285*11767SAnurag.Maskey@Sun.COM }
286*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_validate(enmh, NULL)) != NWAM_SUCCESS) {
287*11767SAnurag.Maskey@Sun.COM nwam_free_object_list(enmh->nwh_data);
288*11767SAnurag.Maskey@Sun.COM enmh->nwh_data = olddata;
289*11767SAnurag.Maskey@Sun.COM return (err);
290*11767SAnurag.Maskey@Sun.COM }
291*11767SAnurag.Maskey@Sun.COM nwam_free_object_list(olddata);
292*11767SAnurag.Maskey@Sun.COM
293*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
294*11767SAnurag.Maskey@Sun.COM }
295*11767SAnurag.Maskey@Sun.COM
296*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_set_prop_value(nwam_enm_handle_t enmh,const char * propname,nwam_value_t value)297*11767SAnurag.Maskey@Sun.COM nwam_enm_set_prop_value(nwam_enm_handle_t enmh, const char *propname,
298*11767SAnurag.Maskey@Sun.COM nwam_value_t value)
299*11767SAnurag.Maskey@Sun.COM {
300*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
301*11767SAnurag.Maskey@Sun.COM boolean_t ro;
302*11767SAnurag.Maskey@Sun.COM
303*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL && propname != NULL && value != NULL);
304*11767SAnurag.Maskey@Sun.COM
305*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_validate_prop(enmh, propname, value))
306*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS ||
307*11767SAnurag.Maskey@Sun.COM (err = nwam_enm_prop_read_only(propname, &ro)) != NWAM_SUCCESS)
308*11767SAnurag.Maskey@Sun.COM return (err);
309*11767SAnurag.Maskey@Sun.COM if (ro)
310*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY);
311*11767SAnurag.Maskey@Sun.COM
312*11767SAnurag.Maskey@Sun.COM return (nwam_set_prop_value(enmh->nwh_data, propname, value));
313*11767SAnurag.Maskey@Sun.COM }
314*11767SAnurag.Maskey@Sun.COM
315*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_get_prop_value(nwam_enm_handle_t enmh,const char * propname,nwam_value_t * valuep)316*11767SAnurag.Maskey@Sun.COM nwam_enm_get_prop_value(nwam_enm_handle_t enmh, const char *propname,
317*11767SAnurag.Maskey@Sun.COM nwam_value_t *valuep)
318*11767SAnurag.Maskey@Sun.COM {
319*11767SAnurag.Maskey@Sun.COM return (nwam_get_prop_value(enmh->nwh_data, propname, valuep));
320*11767SAnurag.Maskey@Sun.COM }
321*11767SAnurag.Maskey@Sun.COM
322*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_walk_props(nwam_enm_handle_t enmh,int (* cb)(const char *,nwam_value_t,void *),void * data,uint64_t flags,int * retp)323*11767SAnurag.Maskey@Sun.COM nwam_enm_walk_props(nwam_enm_handle_t enmh,
324*11767SAnurag.Maskey@Sun.COM int (*cb)(const char *, nwam_value_t, void *),
325*11767SAnurag.Maskey@Sun.COM void *data, uint64_t flags, int *retp)
326*11767SAnurag.Maskey@Sun.COM {
327*11767SAnurag.Maskey@Sun.COM return (nwam_walk_props(enmh, cb, data, flags, retp));
328*11767SAnurag.Maskey@Sun.COM }
329*11767SAnurag.Maskey@Sun.COM
330*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_commit(nwam_enm_handle_t enmh,uint64_t flags)331*11767SAnurag.Maskey@Sun.COM nwam_enm_commit(nwam_enm_handle_t enmh, uint64_t flags)
332*11767SAnurag.Maskey@Sun.COM {
333*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
334*11767SAnurag.Maskey@Sun.COM
335*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL && enmh->nwh_data != NULL);
336*11767SAnurag.Maskey@Sun.COM
337*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_validate(enmh, NULL)) != NWAM_SUCCESS)
338*11767SAnurag.Maskey@Sun.COM return (err);
339*11767SAnurag.Maskey@Sun.COM
340*11767SAnurag.Maskey@Sun.COM return (nwam_commit(NWAM_ENM_CONF_FILE, enmh, flags));
341*11767SAnurag.Maskey@Sun.COM }
342*11767SAnurag.Maskey@Sun.COM
343*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_destroy(nwam_enm_handle_t enmh,uint64_t flags)344*11767SAnurag.Maskey@Sun.COM nwam_enm_destroy(nwam_enm_handle_t enmh, uint64_t flags)
345*11767SAnurag.Maskey@Sun.COM {
346*11767SAnurag.Maskey@Sun.COM return (nwam_destroy(NWAM_ENM_CONF_FILE, enmh, flags));
347*11767SAnurag.Maskey@Sun.COM }
348*11767SAnurag.Maskey@Sun.COM
349*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_get_prop_description(const char * propname,const char ** descriptionp)350*11767SAnurag.Maskey@Sun.COM nwam_enm_get_prop_description(const char *propname, const char **descriptionp)
351*11767SAnurag.Maskey@Sun.COM {
352*11767SAnurag.Maskey@Sun.COM return (nwam_get_prop_description(enm_prop_table, propname,
353*11767SAnurag.Maskey@Sun.COM descriptionp));
354*11767SAnurag.Maskey@Sun.COM }
355*11767SAnurag.Maskey@Sun.COM
356*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_prop_read_only(const char * propname,boolean_t * readp)357*11767SAnurag.Maskey@Sun.COM nwam_enm_prop_read_only(const char *propname, boolean_t *readp)
358*11767SAnurag.Maskey@Sun.COM {
359*11767SAnurag.Maskey@Sun.COM return (nwam_prop_read_only(enm_prop_table, propname, readp));
360*11767SAnurag.Maskey@Sun.COM }
361*11767SAnurag.Maskey@Sun.COM
362*11767SAnurag.Maskey@Sun.COM /* Property-specific value validation functions follow */
363*11767SAnurag.Maskey@Sun.COM
364*11767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_enm_activation_mode(nwam_value_t value)365*11767SAnurag.Maskey@Sun.COM valid_enm_activation_mode(nwam_value_t value)
366*11767SAnurag.Maskey@Sun.COM {
367*11767SAnurag.Maskey@Sun.COM uint64_t activation_mode;
368*11767SAnurag.Maskey@Sun.COM
369*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(value, &activation_mode) != NWAM_SUCCESS)
370*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
371*11767SAnurag.Maskey@Sun.COM
372*11767SAnurag.Maskey@Sun.COM switch (activation_mode) {
373*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_MANUAL:
374*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY:
375*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL:
376*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
377*11767SAnurag.Maskey@Sun.COM }
378*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
379*11767SAnurag.Maskey@Sun.COM }
380*11767SAnurag.Maskey@Sun.COM
381*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_validate(nwam_enm_handle_t enmh,const char ** errpropp)382*11767SAnurag.Maskey@Sun.COM nwam_enm_validate(nwam_enm_handle_t enmh, const char **errpropp)
383*11767SAnurag.Maskey@Sun.COM {
384*11767SAnurag.Maskey@Sun.COM uint64_t activation;
385*11767SAnurag.Maskey@Sun.COM nwam_value_t activationval, enabledval, fmrival = NULL, startval = NULL;
386*11767SAnurag.Maskey@Sun.COM nwam_value_t conditionval = NULL;
387*11767SAnurag.Maskey@Sun.COM char **conditions, *name;
388*11767SAnurag.Maskey@Sun.COM uint_t i, numvalues;
389*11767SAnurag.Maskey@Sun.COM nwam_condition_object_type_t object_type;
390*11767SAnurag.Maskey@Sun.COM nwam_condition_t condition;
391*11767SAnurag.Maskey@Sun.COM
392*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL);
393*11767SAnurag.Maskey@Sun.COM
394*11767SAnurag.Maskey@Sun.COM /*
395*11767SAnurag.Maskey@Sun.COM * Make sure enm is internally consistent: must have either
396*11767SAnurag.Maskey@Sun.COM * an fmri or a start string; and if activation type is conditional,
397*11767SAnurag.Maskey@Sun.COM * the condition string must be specified.
398*11767SAnurag.Maskey@Sun.COM */
399*11767SAnurag.Maskey@Sun.COM if ((nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_FMRI, &fmrival)
400*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) &&
401*11767SAnurag.Maskey@Sun.COM (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_START, &startval)
402*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)) {
403*11767SAnurag.Maskey@Sun.COM if (fmrival != NULL) {
404*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
405*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_START;
406*11767SAnurag.Maskey@Sun.COM nwam_value_free(fmrival);
407*11767SAnurag.Maskey@Sun.COM } else {
408*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
409*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_FMRI;
410*11767SAnurag.Maskey@Sun.COM }
411*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER);
412*11767SAnurag.Maskey@Sun.COM }
413*11767SAnurag.Maskey@Sun.COM if (fmrival != NULL)
414*11767SAnurag.Maskey@Sun.COM nwam_value_free(fmrival);
415*11767SAnurag.Maskey@Sun.COM if (startval != NULL)
416*11767SAnurag.Maskey@Sun.COM nwam_value_free(startval);
417*11767SAnurag.Maskey@Sun.COM
418*11767SAnurag.Maskey@Sun.COM if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ACTIVATION_MODE,
419*11767SAnurag.Maskey@Sun.COM &activationval) != NWAM_SUCCESS) {
420*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
421*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_ACTIVATION_MODE;
422*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER);
423*11767SAnurag.Maskey@Sun.COM }
424*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(activationval, &activation)
425*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
426*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
427*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_ACTIVATION_MODE;
428*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
429*11767SAnurag.Maskey@Sun.COM }
430*11767SAnurag.Maskey@Sun.COM nwam_value_free(activationval);
431*11767SAnurag.Maskey@Sun.COM
432*11767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ANY ||
433*11767SAnurag.Maskey@Sun.COM activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ALL) {
434*11767SAnurag.Maskey@Sun.COM if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_CONDITIONS,
435*11767SAnurag.Maskey@Sun.COM &conditionval) != NWAM_SUCCESS) {
436*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
437*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_CONDITIONS;
438*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER);
439*11767SAnurag.Maskey@Sun.COM }
440*11767SAnurag.Maskey@Sun.COM /*
441*11767SAnurag.Maskey@Sun.COM * Are conditions self-referential? In other words, do any
442*11767SAnurag.Maskey@Sun.COM * of the activation conditions refer to this ENM?
443*11767SAnurag.Maskey@Sun.COM */
444*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_string_array(conditionval, &conditions,
445*11767SAnurag.Maskey@Sun.COM &numvalues) != NWAM_SUCCESS) {
446*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval);
447*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
448*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_CONDITIONS;
449*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
450*11767SAnurag.Maskey@Sun.COM }
451*11767SAnurag.Maskey@Sun.COM if (nwam_enm_get_name(enmh, &name) != NWAM_SUCCESS) {
452*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval);
453*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
454*11767SAnurag.Maskey@Sun.COM }
455*11767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) {
456*11767SAnurag.Maskey@Sun.COM char *object_name = NULL;
457*11767SAnurag.Maskey@Sun.COM
458*11767SAnurag.Maskey@Sun.COM if (nwam_condition_string_to_condition(conditions[i],
459*11767SAnurag.Maskey@Sun.COM &object_type, &condition, &object_name)
460*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
461*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
462*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_CONDITIONS;
463*11767SAnurag.Maskey@Sun.COM free(name);
464*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval);
465*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
466*11767SAnurag.Maskey@Sun.COM }
467*11767SAnurag.Maskey@Sun.COM if (object_name != NULL &&
468*11767SAnurag.Maskey@Sun.COM object_type == NWAM_CONDITION_OBJECT_TYPE_ENM &&
469*11767SAnurag.Maskey@Sun.COM strcmp(object_name, name) == 0) {
470*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
471*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_CONDITIONS;
472*11767SAnurag.Maskey@Sun.COM free(name);
473*11767SAnurag.Maskey@Sun.COM free(object_name);
474*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval);
475*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
476*11767SAnurag.Maskey@Sun.COM }
477*11767SAnurag.Maskey@Sun.COM free(object_name);
478*11767SAnurag.Maskey@Sun.COM }
479*11767SAnurag.Maskey@Sun.COM free(name);
480*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval);
481*11767SAnurag.Maskey@Sun.COM }
482*11767SAnurag.Maskey@Sun.COM
483*11767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_MANUAL) {
484*11767SAnurag.Maskey@Sun.COM if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ENABLED,
485*11767SAnurag.Maskey@Sun.COM &enabledval) != NWAM_SUCCESS) {
486*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL)
487*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_ENM_PROP_ENABLED;
488*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER);
489*11767SAnurag.Maskey@Sun.COM }
490*11767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval);
491*11767SAnurag.Maskey@Sun.COM }
492*11767SAnurag.Maskey@Sun.COM
493*11767SAnurag.Maskey@Sun.COM return (nwam_validate(enm_prop_table, enmh, errpropp));
494*11767SAnurag.Maskey@Sun.COM }
495*11767SAnurag.Maskey@Sun.COM
496*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_validate_prop(nwam_enm_handle_t enmh,const char * propname,nwam_value_t value)497*11767SAnurag.Maskey@Sun.COM nwam_enm_validate_prop(nwam_enm_handle_t enmh, const char *propname,
498*11767SAnurag.Maskey@Sun.COM nwam_value_t value)
499*11767SAnurag.Maskey@Sun.COM {
500*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL);
501*11767SAnurag.Maskey@Sun.COM
502*11767SAnurag.Maskey@Sun.COM return (nwam_validate_prop(enm_prop_table, enmh, propname, value));
503*11767SAnurag.Maskey@Sun.COM }
504*11767SAnurag.Maskey@Sun.COM
505*11767SAnurag.Maskey@Sun.COM /*
506*11767SAnurag.Maskey@Sun.COM * Given a property, return expected property data type
507*11767SAnurag.Maskey@Sun.COM */
508*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_get_prop_type(const char * propname,nwam_value_type_t * typep)509*11767SAnurag.Maskey@Sun.COM nwam_enm_get_prop_type(const char *propname, nwam_value_type_t *typep)
510*11767SAnurag.Maskey@Sun.COM {
511*11767SAnurag.Maskey@Sun.COM return (nwam_get_prop_type(enm_prop_table, propname, typep));
512*11767SAnurag.Maskey@Sun.COM }
513*11767SAnurag.Maskey@Sun.COM
514*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_prop_multivalued(const char * propname,boolean_t * multip)515*11767SAnurag.Maskey@Sun.COM nwam_enm_prop_multivalued(const char *propname, boolean_t *multip)
516*11767SAnurag.Maskey@Sun.COM {
517*11767SAnurag.Maskey@Sun.COM return (nwam_prop_multivalued(enm_prop_table, propname, multip));
518*11767SAnurag.Maskey@Sun.COM }
519*11767SAnurag.Maskey@Sun.COM
520*11767SAnurag.Maskey@Sun.COM /*
521*11767SAnurag.Maskey@Sun.COM * Determine if the ENM has manual activation-mode or not.
522*11767SAnurag.Maskey@Sun.COM */
523*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_is_manual(nwam_enm_handle_t enmh,boolean_t * manualp)524*11767SAnurag.Maskey@Sun.COM nwam_enm_is_manual(nwam_enm_handle_t enmh, boolean_t *manualp)
525*11767SAnurag.Maskey@Sun.COM {
526*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
527*11767SAnurag.Maskey@Sun.COM nwam_value_t actval;
528*11767SAnurag.Maskey@Sun.COM uint64_t activation;
529*11767SAnurag.Maskey@Sun.COM
530*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL);
531*11767SAnurag.Maskey@Sun.COM
532*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ACTIVATION_MODE,
533*11767SAnurag.Maskey@Sun.COM &actval)) != NWAM_SUCCESS)
534*11767SAnurag.Maskey@Sun.COM return (err);
535*11767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64(actval, &activation);
536*11767SAnurag.Maskey@Sun.COM nwam_value_free(actval);
537*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
538*11767SAnurag.Maskey@Sun.COM return (err);
539*11767SAnurag.Maskey@Sun.COM
540*11767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_MANUAL)
541*11767SAnurag.Maskey@Sun.COM *manualp = B_TRUE;
542*11767SAnurag.Maskey@Sun.COM else
543*11767SAnurag.Maskey@Sun.COM *manualp = B_FALSE;
544*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
545*11767SAnurag.Maskey@Sun.COM }
546*11767SAnurag.Maskey@Sun.COM
547*11767SAnurag.Maskey@Sun.COM /* Determine if ENM is enabled or not */
548*11767SAnurag.Maskey@Sun.COM static nwam_error_t
nwam_enm_is_enabled(nwam_enm_handle_t enmh,boolean_t * enabledp)549*11767SAnurag.Maskey@Sun.COM nwam_enm_is_enabled(nwam_enm_handle_t enmh, boolean_t *enabledp)
550*11767SAnurag.Maskey@Sun.COM {
551*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
552*11767SAnurag.Maskey@Sun.COM nwam_value_t enabledval;
553*11767SAnurag.Maskey@Sun.COM
554*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL);
555*11767SAnurag.Maskey@Sun.COM
556*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ENABLED,
557*11767SAnurag.Maskey@Sun.COM &enabledval)) != NWAM_SUCCESS)
558*11767SAnurag.Maskey@Sun.COM return (err);
559*11767SAnurag.Maskey@Sun.COM err = nwam_value_get_boolean(enabledval, enabledp);
560*11767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval);
561*11767SAnurag.Maskey@Sun.COM return (err);
562*11767SAnurag.Maskey@Sun.COM }
563*11767SAnurag.Maskey@Sun.COM
564*11767SAnurag.Maskey@Sun.COM /* Update the enabled property */
565*11767SAnurag.Maskey@Sun.COM static nwam_error_t
nwam_enm_update_enabled(nwam_enm_handle_t enmh,boolean_t enabled)566*11767SAnurag.Maskey@Sun.COM nwam_enm_update_enabled(nwam_enm_handle_t enmh, boolean_t enabled)
567*11767SAnurag.Maskey@Sun.COM {
568*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
569*11767SAnurag.Maskey@Sun.COM nwam_value_t enabledval;
570*11767SAnurag.Maskey@Sun.COM
571*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_boolean(enabled, &enabledval))
572*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
573*11767SAnurag.Maskey@Sun.COM return (err);
574*11767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value(enmh->nwh_data, NWAM_ENM_PROP_ENABLED,
575*11767SAnurag.Maskey@Sun.COM enabledval);
576*11767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval);
577*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
578*11767SAnurag.Maskey@Sun.COM return (err);
579*11767SAnurag.Maskey@Sun.COM return (nwam_enm_commit(enmh, NWAM_FLAG_ENTITY_ENABLE));
580*11767SAnurag.Maskey@Sun.COM }
581*11767SAnurag.Maskey@Sun.COM
582*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_enable(nwam_enm_handle_t enmh)583*11767SAnurag.Maskey@Sun.COM nwam_enm_enable(nwam_enm_handle_t enmh)
584*11767SAnurag.Maskey@Sun.COM {
585*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
586*11767SAnurag.Maskey@Sun.COM boolean_t manual, enabled;
587*11767SAnurag.Maskey@Sun.COM
588*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL);
589*11767SAnurag.Maskey@Sun.COM
590*11767SAnurag.Maskey@Sun.COM /* Only enms with manual activation-mode can be enabled */
591*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_is_manual(enmh, &manual)) != NWAM_SUCCESS)
592*11767SAnurag.Maskey@Sun.COM return (err);
593*11767SAnurag.Maskey@Sun.COM if (!manual)
594*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_MANUAL);
595*11767SAnurag.Maskey@Sun.COM
596*11767SAnurag.Maskey@Sun.COM /* Make sure ENM is not enabled */
597*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_is_enabled(enmh, &enabled)) != NWAM_SUCCESS)
598*11767SAnurag.Maskey@Sun.COM return (err);
599*11767SAnurag.Maskey@Sun.COM if (enabled)
600*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
601*11767SAnurag.Maskey@Sun.COM
602*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_update_enabled(enmh, B_TRUE)) != NWAM_SUCCESS)
603*11767SAnurag.Maskey@Sun.COM return (err);
604*11767SAnurag.Maskey@Sun.COM
605*11767SAnurag.Maskey@Sun.COM err = nwam_enable(NULL, enmh);
606*11767SAnurag.Maskey@Sun.COM
607*11767SAnurag.Maskey@Sun.COM /* nwamd may not be running, that's okay. */
608*11767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND)
609*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
610*11767SAnurag.Maskey@Sun.COM else
611*11767SAnurag.Maskey@Sun.COM return (err);
612*11767SAnurag.Maskey@Sun.COM }
613*11767SAnurag.Maskey@Sun.COM
614*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_disable(nwam_enm_handle_t enmh)615*11767SAnurag.Maskey@Sun.COM nwam_enm_disable(nwam_enm_handle_t enmh)
616*11767SAnurag.Maskey@Sun.COM {
617*11767SAnurag.Maskey@Sun.COM nwam_error_t err;
618*11767SAnurag.Maskey@Sun.COM boolean_t manual, enabled;
619*11767SAnurag.Maskey@Sun.COM
620*11767SAnurag.Maskey@Sun.COM assert(enmh != NULL);
621*11767SAnurag.Maskey@Sun.COM
622*11767SAnurag.Maskey@Sun.COM /* Only enms with manual activation-mode can be disabled */
623*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_is_manual(enmh, &manual)) != NWAM_SUCCESS)
624*11767SAnurag.Maskey@Sun.COM return (err);
625*11767SAnurag.Maskey@Sun.COM if (!manual)
626*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_MANUAL);
627*11767SAnurag.Maskey@Sun.COM
628*11767SAnurag.Maskey@Sun.COM /* Make sure ENM is enabled */
629*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_is_enabled(enmh, &enabled)) != NWAM_SUCCESS)
630*11767SAnurag.Maskey@Sun.COM return (err);
631*11767SAnurag.Maskey@Sun.COM if (!enabled)
632*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
633*11767SAnurag.Maskey@Sun.COM
634*11767SAnurag.Maskey@Sun.COM if ((err = nwam_enm_update_enabled(enmh, B_FALSE)) != NWAM_SUCCESS)
635*11767SAnurag.Maskey@Sun.COM return (err);
636*11767SAnurag.Maskey@Sun.COM
637*11767SAnurag.Maskey@Sun.COM err = nwam_disable(NULL, enmh);
638*11767SAnurag.Maskey@Sun.COM
639*11767SAnurag.Maskey@Sun.COM /* nwamd may not be running, that's okay. */
640*11767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND)
641*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
642*11767SAnurag.Maskey@Sun.COM else
643*11767SAnurag.Maskey@Sun.COM return (err);
644*11767SAnurag.Maskey@Sun.COM }
645*11767SAnurag.Maskey@Sun.COM
646*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_get_default_proplist(const char *** prop_list,uint_t * numvaluesp)647*11767SAnurag.Maskey@Sun.COM nwam_enm_get_default_proplist(const char ***prop_list, uint_t *numvaluesp)
648*11767SAnurag.Maskey@Sun.COM {
649*11767SAnurag.Maskey@Sun.COM return (nwam_get_default_proplist(enm_prop_table,
650*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY, prop_list, numvaluesp));
651*11767SAnurag.Maskey@Sun.COM }
652*11767SAnurag.Maskey@Sun.COM
653*11767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_enm_get_state(nwam_enm_handle_t enmh,nwam_state_t * statep,nwam_aux_state_t * auxp)654*11767SAnurag.Maskey@Sun.COM nwam_enm_get_state(nwam_enm_handle_t enmh, nwam_state_t *statep,
655*11767SAnurag.Maskey@Sun.COM nwam_aux_state_t *auxp)
656*11767SAnurag.Maskey@Sun.COM {
657*11767SAnurag.Maskey@Sun.COM return (nwam_get_state(NULL, enmh, statep, auxp));
658*11767SAnurag.Maskey@Sun.COM }
659