xref: /illumos-gate/usr/src/lib/libnwam/common/libnwam_values.c (revision 6ba597c56d749c61b4f783157f63196d7b2445f0)
1*6ba597c5SAnurag S. Maskey /*
2*6ba597c5SAnurag S. Maskey  * CDDL HEADER START
3*6ba597c5SAnurag S. Maskey  *
4*6ba597c5SAnurag S. Maskey  * The contents of this file are subject to the terms of the
5*6ba597c5SAnurag S. Maskey  * Common Development and Distribution License (the "License").
6*6ba597c5SAnurag S. Maskey  * You may not use this file except in compliance with the License.
7*6ba597c5SAnurag S. Maskey  *
8*6ba597c5SAnurag S. Maskey  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*6ba597c5SAnurag S. Maskey  * or http://www.opensolaris.org/os/licensing.
10*6ba597c5SAnurag S. Maskey  * See the License for the specific language governing permissions
11*6ba597c5SAnurag S. Maskey  * and limitations under the License.
12*6ba597c5SAnurag S. Maskey  *
13*6ba597c5SAnurag S. Maskey  * When distributing Covered Code, include this CDDL HEADER in each
14*6ba597c5SAnurag S. Maskey  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*6ba597c5SAnurag S. Maskey  * If applicable, add the following below this CDDL HEADER, with the
16*6ba597c5SAnurag S. Maskey  * fields enclosed by brackets "[]" replaced with your own identifying
17*6ba597c5SAnurag S. Maskey  * information: Portions Copyright [yyyy] [name of copyright owner]
18*6ba597c5SAnurag S. Maskey  *
19*6ba597c5SAnurag S. Maskey  * CDDL HEADER END
20*6ba597c5SAnurag S. Maskey  */
21*6ba597c5SAnurag S. Maskey 
22*6ba597c5SAnurag S. Maskey /*
23*6ba597c5SAnurag S. Maskey  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
24*6ba597c5SAnurag S. Maskey  * Use is subject to license terms.
25*6ba597c5SAnurag S. Maskey  */
26*6ba597c5SAnurag S. Maskey 
27*6ba597c5SAnurag S. Maskey #include <assert.h>
28*6ba597c5SAnurag S. Maskey #include <stdio.h>
29*6ba597c5SAnurag S. Maskey #include <stdlib.h>
30*6ba597c5SAnurag S. Maskey #include <string.h>
31*6ba597c5SAnurag S. Maskey #include <sys/types.h>
32*6ba597c5SAnurag S. Maskey #include <libdlwlan.h>
33*6ba597c5SAnurag S. Maskey #include <libnvpair.h>
34*6ba597c5SAnurag S. Maskey 
35*6ba597c5SAnurag S. Maskey #include "libnwam_impl.h"
36*6ba597c5SAnurag S. Maskey #include <libnwam_priv.h>
37*6ba597c5SAnurag S. Maskey #include <libnwam.h>
38*6ba597c5SAnurag S. Maskey 
39*6ba597c5SAnurag S. Maskey /*
40*6ba597c5SAnurag S. Maskey  * Internal implementation of libnwam in-memory objects and values.  Objects
41*6ba597c5SAnurag S. Maskey  * are nvlists.
42*6ba597c5SAnurag S. Maskey  */
43*6ba597c5SAnurag S. Maskey 
44*6ba597c5SAnurag S. Maskey void
45*6ba597c5SAnurag S. Maskey nwam_value_free(nwam_value_t value)
46*6ba597c5SAnurag S. Maskey {
47*6ba597c5SAnurag S. Maskey 	uint_t i;
48*6ba597c5SAnurag S. Maskey 
49*6ba597c5SAnurag S. Maskey 	if (value == NULL)
50*6ba597c5SAnurag S. Maskey 		return;
51*6ba597c5SAnurag S. Maskey 
52*6ba597c5SAnurag S. Maskey 	switch (value->nwv_value_type) {
53*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
54*6ba597c5SAnurag S. Maskey 		free(value->nwv_values.nwv_boolean);
55*6ba597c5SAnurag S. Maskey 		break;
56*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
57*6ba597c5SAnurag S. Maskey 		free(value->nwv_values.nwv_int64);
58*6ba597c5SAnurag S. Maskey 		break;
59*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
60*6ba597c5SAnurag S. Maskey 		free(value->nwv_values.nwv_uint64);
61*6ba597c5SAnurag S. Maskey 		break;
62*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
63*6ba597c5SAnurag S. Maskey 		for (i = 0; i < value->nwv_value_numvalues; i++)
64*6ba597c5SAnurag S. Maskey 			free(value->nwv_values.nwv_string[i]);
65*6ba597c5SAnurag S. Maskey 		free(value->nwv_values.nwv_string);
66*6ba597c5SAnurag S. Maskey 		break;
67*6ba597c5SAnurag S. Maskey 	}
68*6ba597c5SAnurag S. Maskey 	free(value);
69*6ba597c5SAnurag S. Maskey }
70*6ba597c5SAnurag S. Maskey 
71*6ba597c5SAnurag S. Maskey nwam_error_t
72*6ba597c5SAnurag S. Maskey nwam_value_create(nwam_value_type_t value_type, void *values, uint_t numvalues,
73*6ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
74*6ba597c5SAnurag S. Maskey {
75*6ba597c5SAnurag S. Maskey 	nwam_value_t newvalue;
76*6ba597c5SAnurag S. Maskey 	boolean_t *values_boolean;
77*6ba597c5SAnurag S. Maskey 	int64_t *values_int64;
78*6ba597c5SAnurag S. Maskey 	uint64_t *values_uint64;
79*6ba597c5SAnurag S. Maskey 	char **values_string;
80*6ba597c5SAnurag S. Maskey 	int i, j;
81*6ba597c5SAnurag S. Maskey 	nwam_error_t err = NWAM_SUCCESS;
82*6ba597c5SAnurag S. Maskey 
83*6ba597c5SAnurag S. Maskey 	*valuep = NULL;
84*6ba597c5SAnurag S. Maskey 
85*6ba597c5SAnurag S. Maskey 	if (numvalues > NWAM_MAX_NUM_VALUES)
86*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
87*6ba597c5SAnurag S. Maskey 
88*6ba597c5SAnurag S. Maskey 	if ((newvalue = calloc(1, sizeof (struct nwam_value))) == NULL)
89*6ba597c5SAnurag S. Maskey 		return (NWAM_NO_MEMORY);
90*6ba597c5SAnurag S. Maskey 
91*6ba597c5SAnurag S. Maskey 	newvalue->nwv_value_type = value_type;
92*6ba597c5SAnurag S. Maskey 	newvalue->nwv_value_numvalues = numvalues;
93*6ba597c5SAnurag S. Maskey 
94*6ba597c5SAnurag S. Maskey 	switch (value_type) {
95*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
96*6ba597c5SAnurag S. Maskey 		values_boolean = values;
97*6ba597c5SAnurag S. Maskey 		if ((newvalue->nwv_values.nwv_boolean =
98*6ba597c5SAnurag S. Maskey 		    calloc(numvalues, sizeof (boolean_t))) == NULL) {
99*6ba597c5SAnurag S. Maskey 			free(newvalue);
100*6ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
101*6ba597c5SAnurag S. Maskey 		}
102*6ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++)
103*6ba597c5SAnurag S. Maskey 			newvalue->nwv_values.nwv_boolean[i] = values_boolean[i];
104*6ba597c5SAnurag S. Maskey 		break;
105*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
106*6ba597c5SAnurag S. Maskey 		values_int64 = values;
107*6ba597c5SAnurag S. Maskey 		if ((newvalue->nwv_values.nwv_int64 =
108*6ba597c5SAnurag S. Maskey 		    calloc(numvalues, sizeof (int64_t))) == NULL) {
109*6ba597c5SAnurag S. Maskey 			free(newvalue);
110*6ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
111*6ba597c5SAnurag S. Maskey 		}
112*6ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++)
113*6ba597c5SAnurag S. Maskey 			newvalue->nwv_values.nwv_int64[i] = values_int64[i];
114*6ba597c5SAnurag S. Maskey 		break;
115*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
116*6ba597c5SAnurag S. Maskey 		values_uint64 = values;
117*6ba597c5SAnurag S. Maskey 		if ((newvalue->nwv_values.nwv_uint64 =
118*6ba597c5SAnurag S. Maskey 		    calloc(numvalues, sizeof (uint64_t))) == NULL) {
119*6ba597c5SAnurag S. Maskey 			free(newvalue);
120*6ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
121*6ba597c5SAnurag S. Maskey 		}
122*6ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++)
123*6ba597c5SAnurag S. Maskey 			newvalue->nwv_values.nwv_uint64[i] = values_uint64[i];
124*6ba597c5SAnurag S. Maskey 		break;
125*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
126*6ba597c5SAnurag S. Maskey 		values_string = values;
127*6ba597c5SAnurag S. Maskey 		if ((newvalue->nwv_values.nwv_string =
128*6ba597c5SAnurag S. Maskey 		    calloc(numvalues, sizeof (char *))) == NULL) {
129*6ba597c5SAnurag S. Maskey 			free(newvalue);
130*6ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
131*6ba597c5SAnurag S. Maskey 		}
132*6ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++) {
133*6ba597c5SAnurag S. Maskey 			if (strnlen(values_string[i], NWAM_MAX_VALUE_LEN) ==
134*6ba597c5SAnurag S. Maskey 			    NWAM_MAX_VALUE_LEN) {
135*6ba597c5SAnurag S. Maskey 				err = NWAM_ENTITY_INVALID_VALUE;
136*6ba597c5SAnurag S. Maskey 			} else if ((newvalue->nwv_values.nwv_string[i] =
137*6ba597c5SAnurag S. Maskey 			    strdup(values_string[i])) == NULL) {
138*6ba597c5SAnurag S. Maskey 				err = NWAM_NO_MEMORY;
139*6ba597c5SAnurag S. Maskey 			}
140*6ba597c5SAnurag S. Maskey 			if (err != NWAM_SUCCESS) {
141*6ba597c5SAnurag S. Maskey 				for (j = 0; j < i; j++)
142*6ba597c5SAnurag S. Maskey 					free(
143*6ba597c5SAnurag S. Maskey 					    newvalue->nwv_values.nwv_string[i]);
144*6ba597c5SAnurag S. Maskey 				free(newvalue->nwv_values.nwv_string);
145*6ba597c5SAnurag S. Maskey 				free(newvalue);
146*6ba597c5SAnurag S. Maskey 				return (err);
147*6ba597c5SAnurag S. Maskey 			}
148*6ba597c5SAnurag S. Maskey 		}
149*6ba597c5SAnurag S. Maskey 		break;
150*6ba597c5SAnurag S. Maskey 	default:
151*6ba597c5SAnurag S. Maskey 		break;
152*6ba597c5SAnurag S. Maskey 	}
153*6ba597c5SAnurag S. Maskey 
154*6ba597c5SAnurag S. Maskey 	*valuep = newvalue;
155*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
156*6ba597c5SAnurag S. Maskey }
157*6ba597c5SAnurag S. Maskey 
158*6ba597c5SAnurag S. Maskey nwam_error_t
159*6ba597c5SAnurag S. Maskey nwam_value_copy(nwam_value_t old, nwam_value_t *newp)
160*6ba597c5SAnurag S. Maskey {
161*6ba597c5SAnurag S. Maskey 	void *values;
162*6ba597c5SAnurag S. Maskey 
163*6ba597c5SAnurag S. Maskey 	assert(old != NULL && newp != NULL);
164*6ba597c5SAnurag S. Maskey 
165*6ba597c5SAnurag S. Maskey 	switch (old->nwv_value_type) {
166*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
167*6ba597c5SAnurag S. Maskey 		values = old->nwv_values.nwv_boolean;
168*6ba597c5SAnurag S. Maskey 		break;
169*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
170*6ba597c5SAnurag S. Maskey 		values = old->nwv_values.nwv_int64;
171*6ba597c5SAnurag S. Maskey 		break;
172*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
173*6ba597c5SAnurag S. Maskey 		values = old->nwv_values.nwv_uint64;
174*6ba597c5SAnurag S. Maskey 		break;
175*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
176*6ba597c5SAnurag S. Maskey 		values = old->nwv_values.nwv_string;
177*6ba597c5SAnurag S. Maskey 		break;
178*6ba597c5SAnurag S. Maskey 	default:
179*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
180*6ba597c5SAnurag S. Maskey 	}
181*6ba597c5SAnurag S. Maskey 	return (nwam_value_create(old->nwv_value_type, values,
182*6ba597c5SAnurag S. Maskey 	    old->nwv_value_numvalues, newp));
183*6ba597c5SAnurag S. Maskey }
184*6ba597c5SAnurag S. Maskey nwam_error_t
185*6ba597c5SAnurag S. Maskey nwam_value_create_boolean_array(boolean_t *values, uint_t numvalues,
186*6ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
187*6ba597c5SAnurag S. Maskey {
188*6ba597c5SAnurag S. Maskey 	return (nwam_value_create(NWAM_VALUE_TYPE_BOOLEAN, values, numvalues,
189*6ba597c5SAnurag S. Maskey 	    valuep));
190*6ba597c5SAnurag S. Maskey }
191*6ba597c5SAnurag S. Maskey 
192*6ba597c5SAnurag S. Maskey nwam_error_t
193*6ba597c5SAnurag S. Maskey nwam_value_create_boolean(boolean_t value, nwam_value_t *valuep)
194*6ba597c5SAnurag S. Maskey {
195*6ba597c5SAnurag S. Maskey 	return (nwam_value_create_boolean_array(&value, 1, valuep));
196*6ba597c5SAnurag S. Maskey }
197*6ba597c5SAnurag S. Maskey 
198*6ba597c5SAnurag S. Maskey nwam_error_t
199*6ba597c5SAnurag S. Maskey nwam_value_create_int64_array(int64_t *values, uint_t numvalues,
200*6ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
201*6ba597c5SAnurag S. Maskey {
202*6ba597c5SAnurag S. Maskey 	return (nwam_value_create(NWAM_VALUE_TYPE_INT64, values, numvalues,
203*6ba597c5SAnurag S. Maskey 	    valuep));
204*6ba597c5SAnurag S. Maskey }
205*6ba597c5SAnurag S. Maskey 
206*6ba597c5SAnurag S. Maskey nwam_error_t
207*6ba597c5SAnurag S. Maskey nwam_value_create_int64(int64_t value, nwam_value_t *valuep)
208*6ba597c5SAnurag S. Maskey {
209*6ba597c5SAnurag S. Maskey 	return (nwam_value_create_int64_array(&value, 1, valuep));
210*6ba597c5SAnurag S. Maskey }
211*6ba597c5SAnurag S. Maskey 
212*6ba597c5SAnurag S. Maskey nwam_error_t
213*6ba597c5SAnurag S. Maskey nwam_value_create_uint64_array(uint64_t *values, uint_t numvalues,
214*6ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
215*6ba597c5SAnurag S. Maskey {
216*6ba597c5SAnurag S. Maskey 	return (nwam_value_create(NWAM_VALUE_TYPE_UINT64, values, numvalues,
217*6ba597c5SAnurag S. Maskey 	    valuep));
218*6ba597c5SAnurag S. Maskey }
219*6ba597c5SAnurag S. Maskey 
220*6ba597c5SAnurag S. Maskey nwam_error_t
221*6ba597c5SAnurag S. Maskey nwam_value_create_uint64(uint64_t value, nwam_value_t *valuep)
222*6ba597c5SAnurag S. Maskey {
223*6ba597c5SAnurag S. Maskey 	return (nwam_value_create_uint64_array(&value, 1, valuep));
224*6ba597c5SAnurag S. Maskey }
225*6ba597c5SAnurag S. Maskey 
226*6ba597c5SAnurag S. Maskey nwam_error_t
227*6ba597c5SAnurag S. Maskey nwam_value_create_string_array(char **values, uint_t numvalues,
228*6ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
229*6ba597c5SAnurag S. Maskey {
230*6ba597c5SAnurag S. Maskey 	return (nwam_value_create(NWAM_VALUE_TYPE_STRING, values, numvalues,
231*6ba597c5SAnurag S. Maskey 	    valuep));
232*6ba597c5SAnurag S. Maskey }
233*6ba597c5SAnurag S. Maskey 
234*6ba597c5SAnurag S. Maskey nwam_error_t
235*6ba597c5SAnurag S. Maskey nwam_value_create_string(char *value, nwam_value_t *valuep)
236*6ba597c5SAnurag S. Maskey {
237*6ba597c5SAnurag S. Maskey 	return (nwam_value_create_string_array(&value, 1, valuep));
238*6ba597c5SAnurag S. Maskey }
239*6ba597c5SAnurag S. Maskey 
240*6ba597c5SAnurag S. Maskey nwam_error_t
241*6ba597c5SAnurag S. Maskey nwam_value_get_boolean_array(nwam_value_t value, boolean_t **valuesp,
242*6ba597c5SAnurag S. Maskey     uint_t *numvaluesp)
243*6ba597c5SAnurag S. Maskey {
244*6ba597c5SAnurag S. Maskey 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
245*6ba597c5SAnurag S. Maskey 
246*6ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
247*6ba597c5SAnurag S. Maskey 	*valuesp = value->nwv_values.nwv_boolean;
248*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
249*6ba597c5SAnurag S. Maskey }
250*6ba597c5SAnurag S. Maskey 
251*6ba597c5SAnurag S. Maskey nwam_error_t
252*6ba597c5SAnurag S. Maskey nwam_value_get_boolean(nwam_value_t value, boolean_t *valuep)
253*6ba597c5SAnurag S. Maskey {
254*6ba597c5SAnurag S. Maskey 	uint_t numvalues;
255*6ba597c5SAnurag S. Maskey 	boolean_t *myvaluesp;
256*6ba597c5SAnurag S. Maskey 	nwam_error_t err;
257*6ba597c5SAnurag S. Maskey 
258*6ba597c5SAnurag S. Maskey 	err = nwam_value_get_boolean_array(value, &myvaluesp, &numvalues);
259*6ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
260*6ba597c5SAnurag S. Maskey 		return (err);
261*6ba597c5SAnurag S. Maskey 	if (numvalues != 1)
262*6ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MULTIPLE_VALUES);
263*6ba597c5SAnurag S. Maskey 
264*6ba597c5SAnurag S. Maskey 	*valuep = myvaluesp[0];
265*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
266*6ba597c5SAnurag S. Maskey }
267*6ba597c5SAnurag S. Maskey 
268*6ba597c5SAnurag S. Maskey nwam_error_t
269*6ba597c5SAnurag S. Maskey nwam_value_get_int64_array(nwam_value_t value, int64_t **valuesp,
270*6ba597c5SAnurag S. Maskey     uint_t *numvaluesp)
271*6ba597c5SAnurag S. Maskey {
272*6ba597c5SAnurag S. Maskey 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
273*6ba597c5SAnurag S. Maskey 
274*6ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
275*6ba597c5SAnurag S. Maskey 	*valuesp = value->nwv_values.nwv_int64;
276*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
277*6ba597c5SAnurag S. Maskey }
278*6ba597c5SAnurag S. Maskey 
279*6ba597c5SAnurag S. Maskey nwam_error_t
280*6ba597c5SAnurag S. Maskey nwam_value_get_int64(nwam_value_t value, int64_t *valuep)
281*6ba597c5SAnurag S. Maskey {
282*6ba597c5SAnurag S. Maskey 	uint_t numvalues;
283*6ba597c5SAnurag S. Maskey 	int64_t *myvaluesp;
284*6ba597c5SAnurag S. Maskey 	nwam_error_t err;
285*6ba597c5SAnurag S. Maskey 
286*6ba597c5SAnurag S. Maskey 	err = nwam_value_get_int64_array(value, &myvaluesp, &numvalues);
287*6ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
288*6ba597c5SAnurag S. Maskey 		return (err);
289*6ba597c5SAnurag S. Maskey 	if (numvalues != 1)
290*6ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MULTIPLE_VALUES);
291*6ba597c5SAnurag S. Maskey 
292*6ba597c5SAnurag S. Maskey 	*valuep = myvaluesp[0];
293*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
294*6ba597c5SAnurag S. Maskey }
295*6ba597c5SAnurag S. Maskey 
296*6ba597c5SAnurag S. Maskey nwam_error_t
297*6ba597c5SAnurag S. Maskey nwam_value_get_uint64_array(nwam_value_t value, uint64_t **valuesp,
298*6ba597c5SAnurag S. Maskey     uint_t *numvaluesp)
299*6ba597c5SAnurag S. Maskey {
300*6ba597c5SAnurag S. Maskey 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
301*6ba597c5SAnurag S. Maskey 
302*6ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
303*6ba597c5SAnurag S. Maskey 	*valuesp = value->nwv_values.nwv_uint64;
304*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
305*6ba597c5SAnurag S. Maskey }
306*6ba597c5SAnurag S. Maskey 
307*6ba597c5SAnurag S. Maskey nwam_error_t
308*6ba597c5SAnurag S. Maskey nwam_value_get_uint64(nwam_value_t value, uint64_t *valuep)
309*6ba597c5SAnurag S. Maskey {
310*6ba597c5SAnurag S. Maskey 	uint_t numvalues;
311*6ba597c5SAnurag S. Maskey 	uint64_t *myvaluesp;
312*6ba597c5SAnurag S. Maskey 	nwam_error_t err;
313*6ba597c5SAnurag S. Maskey 
314*6ba597c5SAnurag S. Maskey 	err = nwam_value_get_uint64_array(value, &myvaluesp, &numvalues);
315*6ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
316*6ba597c5SAnurag S. Maskey 		return (err);
317*6ba597c5SAnurag S. Maskey 	if (numvalues != 1)
318*6ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MULTIPLE_VALUES);
319*6ba597c5SAnurag S. Maskey 
320*6ba597c5SAnurag S. Maskey 	*valuep = myvaluesp[0];
321*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
322*6ba597c5SAnurag S. Maskey }
323*6ba597c5SAnurag S. Maskey 
324*6ba597c5SAnurag S. Maskey nwam_error_t
325*6ba597c5SAnurag S. Maskey nwam_value_get_string_array(nwam_value_t value, char ***valuesp,
326*6ba597c5SAnurag S. Maskey     uint_t *numvaluesp)
327*6ba597c5SAnurag S. Maskey {
328*6ba597c5SAnurag S. Maskey 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
329*6ba597c5SAnurag S. Maskey 
330*6ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
331*6ba597c5SAnurag S. Maskey 	*valuesp = value->nwv_values.nwv_string;
332*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
333*6ba597c5SAnurag S. Maskey }
334*6ba597c5SAnurag S. Maskey 
335*6ba597c5SAnurag S. Maskey nwam_error_t
336*6ba597c5SAnurag S. Maskey nwam_value_get_string(nwam_value_t value, char **valuep)
337*6ba597c5SAnurag S. Maskey {
338*6ba597c5SAnurag S. Maskey 	uint_t numvalues;
339*6ba597c5SAnurag S. Maskey 	char **myvaluesp;
340*6ba597c5SAnurag S. Maskey 	nwam_error_t err;
341*6ba597c5SAnurag S. Maskey 
342*6ba597c5SAnurag S. Maskey 	err = nwam_value_get_string_array(value, &myvaluesp, &numvalues);
343*6ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
344*6ba597c5SAnurag S. Maskey 		return (err);
345*6ba597c5SAnurag S. Maskey 	if (numvalues != 1)
346*6ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MULTIPLE_VALUES);
347*6ba597c5SAnurag S. Maskey 
348*6ba597c5SAnurag S. Maskey 	*valuep = myvaluesp[0];
349*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
350*6ba597c5SAnurag S. Maskey }
351*6ba597c5SAnurag S. Maskey 
352*6ba597c5SAnurag S. Maskey nwam_error_t
353*6ba597c5SAnurag S. Maskey nwam_value_get_type(nwam_value_t value, nwam_value_type_t *typep)
354*6ba597c5SAnurag S. Maskey {
355*6ba597c5SAnurag S. Maskey 	*typep = value->nwv_value_type;
356*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
357*6ba597c5SAnurag S. Maskey }
358*6ba597c5SAnurag S. Maskey 
359*6ba597c5SAnurag S. Maskey nwam_error_t
360*6ba597c5SAnurag S. Maskey nwam_value_get_numvalues(nwam_value_t value, uint_t *numvaluesp)
361*6ba597c5SAnurag S. Maskey {
362*6ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
363*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
364*6ba597c5SAnurag S. Maskey }
365*6ba597c5SAnurag S. Maskey 
366*6ba597c5SAnurag S. Maskey /*
367*6ba597c5SAnurag S. Maskey  * Generic object data functions. We hide nvlist implementation
368*6ba597c5SAnurag S. Maskey  * from NCP, ENM and location implementations.
369*6ba597c5SAnurag S. Maskey  */
370*6ba597c5SAnurag S. Maskey nwam_error_t
371*6ba597c5SAnurag S. Maskey nwam_alloc_object_list(void *list)
372*6ba597c5SAnurag S. Maskey {
373*6ba597c5SAnurag S. Maskey 	int nverr;
374*6ba597c5SAnurag S. Maskey 
375*6ba597c5SAnurag S. Maskey 	assert(list != NULL);
376*6ba597c5SAnurag S. Maskey 
377*6ba597c5SAnurag S. Maskey 	if ((nverr = nvlist_alloc((nvlist_t **)list, NV_UNIQUE_NAME, 0)) != 0)
378*6ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
379*6ba597c5SAnurag S. Maskey 
380*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
381*6ba597c5SAnurag S. Maskey }
382*6ba597c5SAnurag S. Maskey 
383*6ba597c5SAnurag S. Maskey void
384*6ba597c5SAnurag S. Maskey nwam_free_object_list(void *list)
385*6ba597c5SAnurag S. Maskey {
386*6ba597c5SAnurag S. Maskey 	if (list != NULL)
387*6ba597c5SAnurag S. Maskey 		nvlist_free(list);
388*6ba597c5SAnurag S. Maskey }
389*6ba597c5SAnurag S. Maskey 
390*6ba597c5SAnurag S. Maskey nwam_error_t
391*6ba597c5SAnurag S. Maskey nwam_dup_object_list(void *oldlist, void *newlist)
392*6ba597c5SAnurag S. Maskey {
393*6ba597c5SAnurag S. Maskey 	int nverr;
394*6ba597c5SAnurag S. Maskey 
395*6ba597c5SAnurag S. Maskey 	assert(oldlist != NULL && newlist != NULL);
396*6ba597c5SAnurag S. Maskey 
397*6ba597c5SAnurag S. Maskey 	if ((nverr = nvlist_dup(oldlist, newlist, 0)) != 0)
398*6ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
399*6ba597c5SAnurag S. Maskey 
400*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
401*6ba597c5SAnurag S. Maskey }
402*6ba597c5SAnurag S. Maskey 
403*6ba597c5SAnurag S. Maskey /* Add child object list to parent object list using property name childname */
404*6ba597c5SAnurag S. Maskey nwam_error_t
405*6ba597c5SAnurag S. Maskey nwam_object_list_add_object_list(void *parentlist, char *childname,
406*6ba597c5SAnurag S. Maskey     void *childlist)
407*6ba597c5SAnurag S. Maskey {
408*6ba597c5SAnurag S. Maskey 	return (nwam_errno_to_nwam_error(nvlist_add_nvlist(parentlist,
409*6ba597c5SAnurag S. Maskey 	    childname, childlist)));
410*6ba597c5SAnurag S. Maskey }
411*6ba597c5SAnurag S. Maskey 
412*6ba597c5SAnurag S. Maskey /* Remove object list from parent object list */
413*6ba597c5SAnurag S. Maskey nwam_error_t
414*6ba597c5SAnurag S. Maskey nwam_object_list_remove_object_list(void *parentlist, char *childname)
415*6ba597c5SAnurag S. Maskey {
416*6ba597c5SAnurag S. Maskey 	return (nwam_errno_to_nwam_error(nvlist_remove_all(parentlist,
417*6ba597c5SAnurag S. Maskey 	    childname)));
418*6ba597c5SAnurag S. Maskey }
419*6ba597c5SAnurag S. Maskey 
420*6ba597c5SAnurag S. Maskey /*
421*6ba597c5SAnurag S. Maskey  * Get next object list (nvlist) after lastname.  Used to walk NCUs, ENMs and
422*6ba597c5SAnurag S. Maskey  * locations, each of which is internally represented as an nvlist.
423*6ba597c5SAnurag S. Maskey  */
424*6ba597c5SAnurag S. Maskey nwam_error_t
425*6ba597c5SAnurag S. Maskey nwam_next_object_list(void *parentlist, char *lastname, char **childnamep,
426*6ba597c5SAnurag S. Maskey     void *childlistp)
427*6ba597c5SAnurag S. Maskey {
428*6ba597c5SAnurag S. Maskey 	nvpair_t *last = NULL, *next;
429*6ba597c5SAnurag S. Maskey 	int nverr;
430*6ba597c5SAnurag S. Maskey 
431*6ba597c5SAnurag S. Maskey 	if (lastname != NULL) {
432*6ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_lookup_nvpair(parentlist, lastname, &last))
433*6ba597c5SAnurag S. Maskey 		    != 0)
434*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
435*6ba597c5SAnurag S. Maskey 	}
436*6ba597c5SAnurag S. Maskey 	if ((next = nvlist_next_nvpair(parentlist, last)) == NULL)
437*6ba597c5SAnurag S. Maskey 		return (NWAM_LIST_END);
438*6ba597c5SAnurag S. Maskey 
439*6ba597c5SAnurag S. Maskey 	*childnamep = nvpair_name(next);
440*6ba597c5SAnurag S. Maskey 
441*6ba597c5SAnurag S. Maskey 	if (nvpair_type(next) != DATA_TYPE_NVLIST)
442*6ba597c5SAnurag S. Maskey 		return (NWAM_ERROR_INTERNAL);
443*6ba597c5SAnurag S. Maskey 
444*6ba597c5SAnurag S. Maskey 	if ((nverr = nvpair_value_nvlist(next, childlistp)) != NWAM_SUCCESS)
445*6ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
446*6ba597c5SAnurag S. Maskey 
447*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
448*6ba597c5SAnurag S. Maskey }
449*6ba597c5SAnurag S. Maskey 
450*6ba597c5SAnurag S. Maskey /*
451*6ba597c5SAnurag S. Maskey  * Pack nvlist into contiguous memory. If packed_listp is NULL, we just
452*6ba597c5SAnurag S. Maskey  * return the size of the memory needed to do so.
453*6ba597c5SAnurag S. Maskey  */
454*6ba597c5SAnurag S. Maskey nwam_error_t
455*6ba597c5SAnurag S. Maskey nwam_pack_object_list(void *list, char **packed_listp, size_t *packed_sizep)
456*6ba597c5SAnurag S. Maskey {
457*6ba597c5SAnurag S. Maskey 	int nverr;
458*6ba597c5SAnurag S. Maskey 
459*6ba597c5SAnurag S. Maskey 	assert(list != NULL && packed_sizep != NULL);
460*6ba597c5SAnurag S. Maskey 
461*6ba597c5SAnurag S. Maskey 	if (packed_listp == NULL) {
462*6ba597c5SAnurag S. Maskey 		nverr = nvlist_size(list, packed_sizep, NV_ENCODE_XDR);
463*6ba597c5SAnurag S. Maskey 	} else {
464*6ba597c5SAnurag S. Maskey 		nverr = nvlist_pack(list, packed_listp, packed_sizep,
465*6ba597c5SAnurag S. Maskey 		    NV_ENCODE_XDR, 0);
466*6ba597c5SAnurag S. Maskey 	}
467*6ba597c5SAnurag S. Maskey 
468*6ba597c5SAnurag S. Maskey 	if (nverr != 0)
469*6ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
470*6ba597c5SAnurag S. Maskey 
471*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
472*6ba597c5SAnurag S. Maskey }
473*6ba597c5SAnurag S. Maskey 
474*6ba597c5SAnurag S. Maskey nwam_error_t
475*6ba597c5SAnurag S. Maskey nwam_unpack_object_list(char *packed_list, size_t packed_size,
476*6ba597c5SAnurag S. Maskey     void *list)
477*6ba597c5SAnurag S. Maskey {
478*6ba597c5SAnurag S. Maskey 	int nverr;
479*6ba597c5SAnurag S. Maskey 
480*6ba597c5SAnurag S. Maskey 	assert(packed_list != NULL && list != NULL);
481*6ba597c5SAnurag S. Maskey 
482*6ba597c5SAnurag S. Maskey 	*((nvlist_t **)list) = NULL;
483*6ba597c5SAnurag S. Maskey 
484*6ba597c5SAnurag S. Maskey 	nverr = nvlist_unpack(packed_list, packed_size, (nvlist_t **)list, 0);
485*6ba597c5SAnurag S. Maskey 
486*6ba597c5SAnurag S. Maskey 	if (nverr != 0)
487*6ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
488*6ba597c5SAnurag S. Maskey 
489*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
490*6ba597c5SAnurag S. Maskey }
491*6ba597c5SAnurag S. Maskey 
492*6ba597c5SAnurag S. Maskey /*
493*6ba597c5SAnurag S. Maskey  * Functions to walk, set and get properties in nvlist, translating
494*6ba597c5SAnurag S. Maskey  * between nwam_value_t and nvlist/nvpair representations.
495*6ba597c5SAnurag S. Maskey  */
496*6ba597c5SAnurag S. Maskey nwam_error_t
497*6ba597c5SAnurag S. Maskey nwam_next_object_prop(void *list, char *lastname, char **namep,
498*6ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
499*6ba597c5SAnurag S. Maskey {
500*6ba597c5SAnurag S. Maskey 	nvpair_t *last = NULL, *next;
501*6ba597c5SAnurag S. Maskey 	int nverr;
502*6ba597c5SAnurag S. Maskey 
503*6ba597c5SAnurag S. Maskey 	if (lastname != NULL) {
504*6ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_lookup_nvpair(list, lastname, &last)) != 0)
505*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
506*6ba597c5SAnurag S. Maskey 	}
507*6ba597c5SAnurag S. Maskey 	if ((next = nvlist_next_nvpair(list, last)) == NULL)
508*6ba597c5SAnurag S. Maskey 		return (NWAM_LIST_END);
509*6ba597c5SAnurag S. Maskey 
510*6ba597c5SAnurag S. Maskey 	*namep = nvpair_name(next);
511*6ba597c5SAnurag S. Maskey 
512*6ba597c5SAnurag S. Maskey 	return (nwam_get_prop_value(list, (const char *)*namep, valuep));
513*6ba597c5SAnurag S. Maskey }
514*6ba597c5SAnurag S. Maskey 
515*6ba597c5SAnurag S. Maskey nwam_error_t
516*6ba597c5SAnurag S. Maskey nwam_get_prop_value(void *list, const char *name, nwam_value_t *valuep)
517*6ba597c5SAnurag S. Maskey {
518*6ba597c5SAnurag S. Maskey 	nvpair_t *prop;
519*6ba597c5SAnurag S. Maskey 	nwam_error_t err;
520*6ba597c5SAnurag S. Maskey 	int nverr;
521*6ba597c5SAnurag S. Maskey 	boolean_t *valbool;
522*6ba597c5SAnurag S. Maskey 	int64_t *valint64;
523*6ba597c5SAnurag S. Maskey 	uint64_t *valuint64;
524*6ba597c5SAnurag S. Maskey 	char **valstr;
525*6ba597c5SAnurag S. Maskey 	uint_t numvalues;
526*6ba597c5SAnurag S. Maskey 
527*6ba597c5SAnurag S. Maskey 	assert(valuep != NULL);
528*6ba597c5SAnurag S. Maskey 
529*6ba597c5SAnurag S. Maskey 	*valuep = NULL;
530*6ba597c5SAnurag S. Maskey 
531*6ba597c5SAnurag S. Maskey 	if ((nverr = nvlist_lookup_nvpair(list, name, &prop)) != 0) {
532*6ba597c5SAnurag S. Maskey 		/* convert EINVAL to NOT_FOUND */
533*6ba597c5SAnurag S. Maskey 		if (nverr == EINVAL)
534*6ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_NOT_FOUND);
535*6ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
536*6ba597c5SAnurag S. Maskey 	}
537*6ba597c5SAnurag S. Maskey 
538*6ba597c5SAnurag S. Maskey 	switch (nvpair_type(prop)) {
539*6ba597c5SAnurag S. Maskey 	case DATA_TYPE_BOOLEAN_ARRAY:
540*6ba597c5SAnurag S. Maskey 		if ((nverr = nvpair_value_boolean_array(prop,
541*6ba597c5SAnurag S. Maskey 		    &valbool, &numvalues)) != 0)
542*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
543*6ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_boolean_array(valbool, numvalues,
544*6ba597c5SAnurag S. Maskey 		    valuep)) != NWAM_SUCCESS)
545*6ba597c5SAnurag S. Maskey 			return (err);
546*6ba597c5SAnurag S. Maskey 		break;
547*6ba597c5SAnurag S. Maskey 	case DATA_TYPE_INT64_ARRAY:
548*6ba597c5SAnurag S. Maskey 		if ((nverr = nvpair_value_int64_array(prop,
549*6ba597c5SAnurag S. Maskey 		    &valint64, &numvalues)) != 0)
550*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
551*6ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_int64_array(valint64, numvalues,
552*6ba597c5SAnurag S. Maskey 		    valuep)) != NWAM_SUCCESS)
553*6ba597c5SAnurag S. Maskey 			return (err);
554*6ba597c5SAnurag S. Maskey 		break;
555*6ba597c5SAnurag S. Maskey 	case DATA_TYPE_UINT64_ARRAY:
556*6ba597c5SAnurag S. Maskey 		if ((nverr = nvpair_value_uint64_array(prop,
557*6ba597c5SAnurag S. Maskey 		    &valuint64, &numvalues)) != 0)
558*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
559*6ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_uint64_array(valuint64, numvalues,
560*6ba597c5SAnurag S. Maskey 		    valuep)) != NWAM_SUCCESS)
561*6ba597c5SAnurag S. Maskey 			return (err);
562*6ba597c5SAnurag S. Maskey 		break;
563*6ba597c5SAnurag S. Maskey 	case DATA_TYPE_STRING_ARRAY:
564*6ba597c5SAnurag S. Maskey 		if ((nverr = nvpair_value_string_array(prop,
565*6ba597c5SAnurag S. Maskey 		    &valstr, &numvalues)) != 0)
566*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
567*6ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_string_array(valstr, numvalues,
568*6ba597c5SAnurag S. Maskey 		    valuep)) != NWAM_SUCCESS)
569*6ba597c5SAnurag S. Maskey 			return (err);
570*6ba597c5SAnurag S. Maskey 		break;
571*6ba597c5SAnurag S. Maskey 	default:
572*6ba597c5SAnurag S. Maskey 		/* Should not happen */
573*6ba597c5SAnurag S. Maskey 		return (NWAM_ERROR_INTERNAL);
574*6ba597c5SAnurag S. Maskey 	}
575*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
576*6ba597c5SAnurag S. Maskey }
577*6ba597c5SAnurag S. Maskey 
578*6ba597c5SAnurag S. Maskey nwam_error_t
579*6ba597c5SAnurag S. Maskey nwam_delete_prop(void *list, const char *name)
580*6ba597c5SAnurag S. Maskey {
581*6ba597c5SAnurag S. Maskey 	int nverr;
582*6ba597c5SAnurag S. Maskey 
583*6ba597c5SAnurag S. Maskey 	if ((nverr = nvlist_remove_all(list, name)) != 0)
584*6ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
585*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
586*6ba597c5SAnurag S. Maskey }
587*6ba597c5SAnurag S. Maskey 
588*6ba597c5SAnurag S. Maskey nwam_error_t
589*6ba597c5SAnurag S. Maskey nwam_set_prop_value(void *list, const char *propname, nwam_value_t value)
590*6ba597c5SAnurag S. Maskey {
591*6ba597c5SAnurag S. Maskey 	int nverr;
592*6ba597c5SAnurag S. Maskey 	nwam_error_t err;
593*6ba597c5SAnurag S. Maskey 	nwam_value_type_t type;
594*6ba597c5SAnurag S. Maskey 	uint_t numvalues;
595*6ba597c5SAnurag S. Maskey 	boolean_t *valbool;
596*6ba597c5SAnurag S. Maskey 	int64_t *valint64;
597*6ba597c5SAnurag S. Maskey 	uint64_t *valuint64;
598*6ba597c5SAnurag S. Maskey 	char **valstr;
599*6ba597c5SAnurag S. Maskey 
600*6ba597c5SAnurag S. Maskey 	assert(list != NULL && value != NULL);
601*6ba597c5SAnurag S. Maskey 
602*6ba597c5SAnurag S. Maskey 	if ((err = nwam_value_get_type(value, &type)) != NWAM_SUCCESS)
603*6ba597c5SAnurag S. Maskey 		return (err);
604*6ba597c5SAnurag S. Maskey 
605*6ba597c5SAnurag S. Maskey 	switch (type) {
606*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
607*6ba597c5SAnurag S. Maskey 		if ((err = nwam_value_get_boolean_array(value, &valbool,
608*6ba597c5SAnurag S. Maskey 		    &numvalues)) != NWAM_SUCCESS)
609*6ba597c5SAnurag S. Maskey 			return (err);
610*6ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_add_boolean_array(list, propname,
611*6ba597c5SAnurag S. Maskey 		    valbool, numvalues)) != 0)
612*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
613*6ba597c5SAnurag S. Maskey 		break;
614*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
615*6ba597c5SAnurag S. Maskey 		if ((err = nwam_value_get_int64_array(value, &valint64,
616*6ba597c5SAnurag S. Maskey 		    &numvalues)) != NWAM_SUCCESS)
617*6ba597c5SAnurag S. Maskey 			return (err);
618*6ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_add_int64_array(list, propname,
619*6ba597c5SAnurag S. Maskey 		    valint64, numvalues)) != 0)
620*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
621*6ba597c5SAnurag S. Maskey 		break;
622*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
623*6ba597c5SAnurag S. Maskey 		if ((err = nwam_value_get_uint64_array(value, &valuint64,
624*6ba597c5SAnurag S. Maskey 		    &numvalues)) != NWAM_SUCCESS)
625*6ba597c5SAnurag S. Maskey 			return (err);
626*6ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_add_uint64_array(list, propname,
627*6ba597c5SAnurag S. Maskey 		    valuint64, numvalues)) != 0)
628*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
629*6ba597c5SAnurag S. Maskey 		break;
630*6ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
631*6ba597c5SAnurag S. Maskey 		if ((err = nwam_value_get_string_array(value, &valstr,
632*6ba597c5SAnurag S. Maskey 		    &numvalues)) != NWAM_SUCCESS)
633*6ba597c5SAnurag S. Maskey 			return (err);
634*6ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_add_string_array(list, propname,
635*6ba597c5SAnurag S. Maskey 		    valstr, numvalues)) != 0)
636*6ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
637*6ba597c5SAnurag S. Maskey 		break;
638*6ba597c5SAnurag S. Maskey 	default:
639*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
640*6ba597c5SAnurag S. Maskey 	}
641*6ba597c5SAnurag S. Maskey 
642*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
643*6ba597c5SAnurag S. Maskey }
644*6ba597c5SAnurag S. Maskey 
645*6ba597c5SAnurag S. Maskey /* Map uint64 values to their string counterparts */
646*6ba597c5SAnurag S. Maskey 
647*6ba597c5SAnurag S. Maskey struct nwam_value_entry {
648*6ba597c5SAnurag S. Maskey 	const char	*value_string;
649*6ba597c5SAnurag S. Maskey 	uint64_t		value;
650*6ba597c5SAnurag S. Maskey };
651*6ba597c5SAnurag S. Maskey 
652*6ba597c5SAnurag S. Maskey struct nwam_value_entry prop_activation_mode_value_entries[] =
653*6ba597c5SAnurag S. Maskey {
654*6ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_MANUAL_STRING, NWAM_ACTIVATION_MODE_MANUAL },
655*6ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_SYSTEM_STRING, NWAM_ACTIVATION_MODE_SYSTEM },
656*6ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_CONDITIONAL_ANY_STRING,
657*6ba597c5SAnurag S. Maskey 	NWAM_ACTIVATION_MODE_CONDITIONAL_ANY },
658*6ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_CONDITIONAL_ALL_STRING,
659*6ba597c5SAnurag S. Maskey 	NWAM_ACTIVATION_MODE_CONDITIONAL_ALL },
660*6ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_PRIORITIZED_STRING,
661*6ba597c5SAnurag S. Maskey 	NWAM_ACTIVATION_MODE_PRIORITIZED },
662*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
663*6ba597c5SAnurag S. Maskey };
664*6ba597c5SAnurag S. Maskey 
665*6ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_type_entries[] =
666*6ba597c5SAnurag S. Maskey {
667*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_TYPE_LINK_STRING, NWAM_NCU_TYPE_LINK },
668*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_TYPE_INTERFACE_STRING, NWAM_NCU_TYPE_INTERFACE },
669*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
670*6ba597c5SAnurag S. Maskey };
671*6ba597c5SAnurag S. Maskey 
672*6ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_class_entries[] =
673*6ba597c5SAnurag S. Maskey {
674*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_CLASS_PHYS_STRING, NWAM_NCU_CLASS_PHYS },
675*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_CLASS_IP_STRING, NWAM_NCU_CLASS_IP },
676*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
677*6ba597c5SAnurag S. Maskey };
678*6ba597c5SAnurag S. Maskey 
679*6ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ip_version_entries[] =
680*6ba597c5SAnurag S. Maskey {
681*6ba597c5SAnurag S. Maskey 	{ NWAM_IP_VERSION_IPV4_STRING, IPV4_VERSION },
682*6ba597c5SAnurag S. Maskey 	{ NWAM_IP_VERSION_IPV6_STRING, IPV6_VERSION },
683*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
684*6ba597c5SAnurag S. Maskey };
685*6ba597c5SAnurag S. Maskey 
686*6ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ipv4_addrsrc_entries[] =
687*6ba597c5SAnurag S. Maskey {
688*6ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP },
689*6ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC },
690*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
691*6ba597c5SAnurag S. Maskey };
692*6ba597c5SAnurag S. Maskey 
693*6ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ipv6_addrsrc_entries[] =
694*6ba597c5SAnurag S. Maskey {
695*6ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP },
696*6ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC },
697*6ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_AUTOCONF_STRING, NWAM_ADDRSRC_AUTOCONF },
698*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
699*6ba597c5SAnurag S. Maskey };
700*6ba597c5SAnurag S. Maskey 
701*6ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_priority_mode_entries[] =
702*6ba597c5SAnurag S. Maskey {
703*6ba597c5SAnurag S. Maskey 	{ NWAM_PRIORITY_MODE_EXCLUSIVE_STRING, NWAM_PRIORITY_MODE_EXCLUSIVE },
704*6ba597c5SAnurag S. Maskey 	{ NWAM_PRIORITY_MODE_SHARED_STRING, NWAM_PRIORITY_MODE_SHARED },
705*6ba597c5SAnurag S. Maskey 	{ NWAM_PRIORITY_MODE_ALL_STRING, NWAM_PRIORITY_MODE_ALL },
706*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
707*6ba597c5SAnurag S. Maskey };
708*6ba597c5SAnurag S. Maskey 
709*6ba597c5SAnurag S. Maskey struct nwam_value_entry loc_prop_nameservices_entries[] =
710*6ba597c5SAnurag S. Maskey {
711*6ba597c5SAnurag S. Maskey 	{ NWAM_NAMESERVICES_DNS_STRING, NWAM_NAMESERVICES_DNS },
712*6ba597c5SAnurag S. Maskey 	{ NWAM_NAMESERVICES_FILES_STRING, NWAM_NAMESERVICES_FILES },
713*6ba597c5SAnurag S. Maskey 	{ NWAM_NAMESERVICES_NIS_STRING, NWAM_NAMESERVICES_NIS },
714*6ba597c5SAnurag S. Maskey 	{ NWAM_NAMESERVICES_LDAP_STRING, NWAM_NAMESERVICES_LDAP },
715*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
716*6ba597c5SAnurag S. Maskey };
717*6ba597c5SAnurag S. Maskey 
718*6ba597c5SAnurag S. Maskey struct nwam_value_entry loc_prop_nameservice_configsrc_entries[] =
719*6ba597c5SAnurag S. Maskey {
720*6ba597c5SAnurag S. Maskey 	{ NWAM_CONFIGSRC_MANUAL_STRING, NWAM_CONFIGSRC_MANUAL },
721*6ba597c5SAnurag S. Maskey 	{ NWAM_CONFIGSRC_DHCP_STRING, NWAM_CONFIGSRC_DHCP },
722*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
723*6ba597c5SAnurag S. Maskey };
724*6ba597c5SAnurag S. Maskey 
725*6ba597c5SAnurag S. Maskey struct nwam_value_entry known_wlan_prop_security_mode_entries[] =
726*6ba597c5SAnurag S. Maskey {
727*6ba597c5SAnurag S. Maskey 	{ "none", DLADM_WLAN_SECMODE_NONE },
728*6ba597c5SAnurag S. Maskey 	{ "wep", DLADM_WLAN_SECMODE_WEP },
729*6ba597c5SAnurag S. Maskey 	{ "wpa", DLADM_WLAN_SECMODE_WPA },
730*6ba597c5SAnurag S. Maskey 	{ NULL, 0 }
731*6ba597c5SAnurag S. Maskey };
732*6ba597c5SAnurag S. Maskey 
733*6ba597c5SAnurag S. Maskey struct nwam_prop_value_entry {
734*6ba597c5SAnurag S. Maskey 	const char		*prop_name;
735*6ba597c5SAnurag S. Maskey 	struct nwam_value_entry	*value_entries;
736*6ba597c5SAnurag S. Maskey } prop_value_entry_table[] =
737*6ba597c5SAnurag S. Maskey {
738*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
739*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_TYPE, ncu_prop_type_entries },
740*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_CLASS, ncu_prop_class_entries },
741*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IP_VERSION, ncu_prop_ip_version_entries },
742*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV4_ADDRSRC, ncu_prop_ipv4_addrsrc_entries },
743*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV6_ADDRSRC, ncu_prop_ipv6_addrsrc_entries },
744*6ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_PRIORITY_MODE, ncu_prop_priority_mode_entries },
745*6ba597c5SAnurag S. Maskey 	{ NWAM_ENM_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
746*6ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
747*6ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_NAMESERVICES, loc_prop_nameservices_entries },
748*6ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
749*6ba597c5SAnurag S. Maskey 	    loc_prop_nameservice_configsrc_entries },
750*6ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC,
751*6ba597c5SAnurag S. Maskey 	    loc_prop_nameservice_configsrc_entries },
752*6ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC,
753*6ba597c5SAnurag S. Maskey 	    loc_prop_nameservice_configsrc_entries },
754*6ba597c5SAnurag S. Maskey 	{ NWAM_KNOWN_WLAN_PROP_SECURITY_MODE,
755*6ba597c5SAnurag S. Maskey 	    known_wlan_prop_security_mode_entries },
756*6ba597c5SAnurag S. Maskey 	{ NULL, NULL }
757*6ba597c5SAnurag S. Maskey };
758*6ba597c5SAnurag S. Maskey 
759*6ba597c5SAnurag S. Maskey /*
760*6ba597c5SAnurag S. Maskey  * Convert uint64 values for property propname into a string representing
761*6ba597c5SAnurag S. Maskey  * that value. Used by enum values.
762*6ba597c5SAnurag S. Maskey  */
763*6ba597c5SAnurag S. Maskey nwam_error_t
764*6ba597c5SAnurag S. Maskey nwam_uint64_get_value_string(const char *propname, uint64_t val,
765*6ba597c5SAnurag S. Maskey     const char **valstrp)
766*6ba597c5SAnurag S. Maskey {
767*6ba597c5SAnurag S. Maskey 	int i, j;
768*6ba597c5SAnurag S. Maskey 	int max = 0; /* largest enum value seen so far */
769*6ba597c5SAnurag S. Maskey 	struct nwam_value_entry *value_entries;
770*6ba597c5SAnurag S. Maskey 
771*6ba597c5SAnurag S. Maskey 	assert(propname != NULL && valstrp != NULL);
772*6ba597c5SAnurag S. Maskey 
773*6ba597c5SAnurag S. Maskey 	for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) {
774*6ba597c5SAnurag S. Maskey 		if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0)
775*6ba597c5SAnurag S. Maskey 			continue;
776*6ba597c5SAnurag S. Maskey 
777*6ba597c5SAnurag S. Maskey 		value_entries = prop_value_entry_table[i].value_entries;
778*6ba597c5SAnurag S. Maskey 
779*6ba597c5SAnurag S. Maskey 		for (j = 0; value_entries[j].value_string != NULL; j++) {
780*6ba597c5SAnurag S. Maskey 			if (value_entries[j].value == val) {
781*6ba597c5SAnurag S. Maskey 				*valstrp = value_entries[j].value_string;
782*6ba597c5SAnurag S. Maskey 				return (NWAM_SUCCESS);
783*6ba597c5SAnurag S. Maskey 			}
784*6ba597c5SAnurag S. Maskey 			max = value_entries[j].value > max ?
785*6ba597c5SAnurag S. Maskey 			    value_entries[j].value : max;
786*6ba597c5SAnurag S. Maskey 		}
787*6ba597c5SAnurag S. Maskey 		/*
788*6ba597c5SAnurag S. Maskey 		 * If trying to get the string for an enum value that doesn't
789*6ba597c5SAnurag S. Maskey 		 * exist, return NWAM_LIST_END.  Otherwise, the input enum
790*6ba597c5SAnurag S. Maskey 		 * value doesn't exist for the given property.
791*6ba597c5SAnurag S. Maskey 		 */
792*6ba597c5SAnurag S. Maskey 		if (val > max)
793*6ba597c5SAnurag S. Maskey 			return (NWAM_LIST_END);
794*6ba597c5SAnurag S. Maskey 		else
795*6ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
796*6ba597c5SAnurag S. Maskey 	}
797*6ba597c5SAnurag S. Maskey 	return (NWAM_INVALID_ARG);
798*6ba597c5SAnurag S. Maskey }
799*6ba597c5SAnurag S. Maskey 
800*6ba597c5SAnurag S. Maskey /*
801*6ba597c5SAnurag S. Maskey  * Convert string to appropriate uint64 value.
802*6ba597c5SAnurag S. Maskey  */
803*6ba597c5SAnurag S. Maskey nwam_error_t
804*6ba597c5SAnurag S. Maskey nwam_value_string_get_uint64(const char *propname, const char *valstr,
805*6ba597c5SAnurag S. Maskey     uint64_t *valp)
806*6ba597c5SAnurag S. Maskey {
807*6ba597c5SAnurag S. Maskey 	int i, j;
808*6ba597c5SAnurag S. Maskey 	struct nwam_value_entry *value_entries;
809*6ba597c5SAnurag S. Maskey 
810*6ba597c5SAnurag S. Maskey 	assert(propname != NULL && valstr != NULL && valp != NULL);
811*6ba597c5SAnurag S. Maskey 
812*6ba597c5SAnurag S. Maskey 	for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) {
813*6ba597c5SAnurag S. Maskey 		if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0)
814*6ba597c5SAnurag S. Maskey 			continue;
815*6ba597c5SAnurag S. Maskey 
816*6ba597c5SAnurag S. Maskey 		value_entries = prop_value_entry_table[i].value_entries;
817*6ba597c5SAnurag S. Maskey 
818*6ba597c5SAnurag S. Maskey 		for (j = 0; value_entries[j].value_string != NULL; j++) {
819*6ba597c5SAnurag S. Maskey 			if (strcasecmp(value_entries[j].value_string, valstr)
820*6ba597c5SAnurag S. Maskey 			    == 0) {
821*6ba597c5SAnurag S. Maskey 				*valp = value_entries[j].value;
822*6ba597c5SAnurag S. Maskey 				return (NWAM_SUCCESS);
823*6ba597c5SAnurag S. Maskey 			}
824*6ba597c5SAnurag S. Maskey 		}
825*6ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_INVALID_VALUE);
826*6ba597c5SAnurag S. Maskey 	}
827*6ba597c5SAnurag S. Maskey 	return (NWAM_INVALID_ARG);
828*6ba597c5SAnurag S. Maskey }
829*6ba597c5SAnurag S. Maskey 
830*6ba597c5SAnurag S. Maskey /* Conditional activation functions */
831*6ba597c5SAnurag S. Maskey 
832*6ba597c5SAnurag S. Maskey nwam_error_t
833*6ba597c5SAnurag S. Maskey nwam_condition_to_condition_string(nwam_condition_object_type_t object_type,
834*6ba597c5SAnurag S. Maskey     nwam_condition_t condition, const char *object_name, char **stringp)
835*6ba597c5SAnurag S. Maskey {
836*6ba597c5SAnurag S. Maskey 	char *object_type_string, *condition_string;
837*6ba597c5SAnurag S. Maskey 	char *string;
838*6ba597c5SAnurag S. Maskey 
839*6ba597c5SAnurag S. Maskey 	assert(stringp != NULL);
840*6ba597c5SAnurag S. Maskey 
841*6ba597c5SAnurag S. Maskey 	*stringp = NULL;
842*6ba597c5SAnurag S. Maskey 
843*6ba597c5SAnurag S. Maskey 	switch (object_type) {
844*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
845*6ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCP_STRING;
846*6ba597c5SAnurag S. Maskey 		break;
847*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
848*6ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCU_STRING;
849*6ba597c5SAnurag S. Maskey 		break;
850*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
851*6ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_ENM_STRING;
852*6ba597c5SAnurag S. Maskey 		break;
853*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
854*6ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_LOC_STRING;
855*6ba597c5SAnurag S. Maskey 		break;
856*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
857*6ba597c5SAnurag S. Maskey 		object_type_string =
858*6ba597c5SAnurag S. Maskey 		    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING;
859*6ba597c5SAnurag S. Maskey 		break;
860*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
861*6ba597c5SAnurag S. Maskey 		object_type_string =
862*6ba597c5SAnurag S. Maskey 		    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING;
863*6ba597c5SAnurag S. Maskey 		break;
864*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
865*6ba597c5SAnurag S. Maskey 		object_type_string =
866*6ba597c5SAnurag S. Maskey 		    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING;
867*6ba597c5SAnurag S. Maskey 		break;
868*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
869*6ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING;
870*6ba597c5SAnurag S. Maskey 		break;
871*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
872*6ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING;
873*6ba597c5SAnurag S. Maskey 		break;
874*6ba597c5SAnurag S. Maskey 	default:
875*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
876*6ba597c5SAnurag S. Maskey 
877*6ba597c5SAnurag S. Maskey 	}
878*6ba597c5SAnurag S. Maskey 	switch (condition) {
879*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS:
880*6ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_IS_STRING;
881*6ba597c5SAnurag S. Maskey 		break;
882*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_NOT:
883*6ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_IS_NOT_STRING;
884*6ba597c5SAnurag S. Maskey 		break;
885*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_CONTAINS:
886*6ba597c5SAnurag S. Maskey 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
887*6ba597c5SAnurag S. Maskey 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
888*6ba597c5SAnurag S. Maskey 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID)
889*6ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
890*6ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_CONTAINS_STRING;
891*6ba597c5SAnurag S. Maskey 		break;
892*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_DOES_NOT_CONTAIN:
893*6ba597c5SAnurag S. Maskey 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
894*6ba597c5SAnurag S. Maskey 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
895*6ba597c5SAnurag S. Maskey 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID)
896*6ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
897*6ba597c5SAnurag S. Maskey 
898*6ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_DOES_NOT_CONTAIN_STRING;
899*6ba597c5SAnurag S. Maskey 		break;
900*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_IN_RANGE:
901*6ba597c5SAnurag S. Maskey 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS)
902*6ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
903*6ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_IS_IN_RANGE_STRING;
904*6ba597c5SAnurag S. Maskey 		break;
905*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_NOT_IN_RANGE:
906*6ba597c5SAnurag S. Maskey 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS)
907*6ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
908*6ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_IS_NOT_IN_RANGE_STRING;
909*6ba597c5SAnurag S. Maskey 		break;
910*6ba597c5SAnurag S. Maskey 	default:
911*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
912*6ba597c5SAnurag S. Maskey 		break;
913*6ba597c5SAnurag S. Maskey 	}
914*6ba597c5SAnurag S. Maskey 	if ((string = malloc(NWAM_MAX_VALUE_LEN)) == NULL)
915*6ba597c5SAnurag S. Maskey 		return (NWAM_NO_MEMORY);
916*6ba597c5SAnurag S. Maskey 	switch (object_type) {
917*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
918*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
919*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
920*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
921*6ba597c5SAnurag S. Maskey 		(void) snprintf(string, NWAM_MAX_VALUE_LEN,
922*6ba597c5SAnurag S. Maskey 		    "%s %s %s active", object_type_string,
923*6ba597c5SAnurag S. Maskey 		    object_name, condition_string);
924*6ba597c5SAnurag S. Maskey 		*stringp = string;
925*6ba597c5SAnurag S. Maskey 		break;
926*6ba597c5SAnurag S. Maskey 
927*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
928*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
929*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
930*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
931*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
932*6ba597c5SAnurag S. Maskey 		(void) snprintf(string, NWAM_MAX_VALUE_LEN,
933*6ba597c5SAnurag S. Maskey 		    "%s %s %s", object_type_string,
934*6ba597c5SAnurag S. Maskey 		    condition_string, object_name);
935*6ba597c5SAnurag S. Maskey 		*stringp = string;
936*6ba597c5SAnurag S. Maskey 		break;
937*6ba597c5SAnurag S. Maskey 
938*6ba597c5SAnurag S. Maskey 	default:
939*6ba597c5SAnurag S. Maskey 		free(string);
940*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
941*6ba597c5SAnurag S. Maskey 
942*6ba597c5SAnurag S. Maskey 	}
943*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
944*6ba597c5SAnurag S. Maskey }
945*6ba597c5SAnurag S. Maskey 
946*6ba597c5SAnurag S. Maskey nwam_error_t
947*6ba597c5SAnurag S. Maskey nwam_condition_string_to_condition(const char *string,
948*6ba597c5SAnurag S. Maskey     nwam_condition_object_type_t *object_typep,
949*6ba597c5SAnurag S. Maskey     nwam_condition_t *conditionp, char **object_namep)
950*6ba597c5SAnurag S. Maskey {
951*6ba597c5SAnurag S. Maskey 	char *copy, *lasts;
952*6ba597c5SAnurag S. Maskey 	char *object_type_string, *object_name;
953*6ba597c5SAnurag S. Maskey 	char *condition_string, *active_string;
954*6ba597c5SAnurag S. Maskey 
955*6ba597c5SAnurag S. Maskey 	assert(string != NULL && object_typep != NULL && conditionp != NULL &&
956*6ba597c5SAnurag S. Maskey 	    object_namep != NULL);
957*6ba597c5SAnurag S. Maskey 
958*6ba597c5SAnurag S. Maskey 	if ((copy = strdup(string)) == NULL)
959*6ba597c5SAnurag S. Maskey 		return (NWAM_NO_MEMORY);
960*6ba597c5SAnurag S. Maskey 
961*6ba597c5SAnurag S. Maskey 	if ((object_type_string = strtok_r(copy, " \t", &lasts)) == NULL) {
962*6ba597c5SAnurag S. Maskey 		free(copy);
963*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
964*6ba597c5SAnurag S. Maskey 	}
965*6ba597c5SAnurag S. Maskey 
966*6ba597c5SAnurag S. Maskey 	if (strcmp(object_type_string, NWAM_CONDITION_OBJECT_TYPE_NCP_STRING)
967*6ba597c5SAnurag S. Maskey 	    == 0)
968*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_NCP;
969*6ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
970*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_NCU_STRING) == 0)
971*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_NCU;
972*6ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
973*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_ENM_STRING) == 0)
974*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ENM;
975*6ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
976*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_LOC_STRING) == 0)
977*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_LOC;
978*6ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
979*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING) == 0)
980*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS;
981*6ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
982*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING) == 0)
983*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN;
984*6ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
985*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING) == 0)
986*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN;
987*6ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
988*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING) == 0)
989*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ESSID;
990*6ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
991*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING) == 0)
992*6ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_BSSID;
993*6ba597c5SAnurag S. Maskey 	else {
994*6ba597c5SAnurag S. Maskey 		free(copy);
995*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
996*6ba597c5SAnurag S. Maskey 	}
997*6ba597c5SAnurag S. Maskey 
998*6ba597c5SAnurag S. Maskey 	if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP ||
999*6ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU ||
1000*6ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM ||
1001*6ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) {
1002*6ba597c5SAnurag S. Maskey 		if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) {
1003*6ba597c5SAnurag S. Maskey 			free(copy);
1004*6ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
1005*6ba597c5SAnurag S. Maskey 		}
1006*6ba597c5SAnurag S. Maskey 		if ((*object_namep = strdup(object_name)) == NULL) {
1007*6ba597c5SAnurag S. Maskey 			free(copy);
1008*6ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
1009*6ba597c5SAnurag S. Maskey 		}
1010*6ba597c5SAnurag S. Maskey 
1011*6ba597c5SAnurag S. Maskey 	}
1012*6ba597c5SAnurag S. Maskey 
1013*6ba597c5SAnurag S. Maskey 	if ((condition_string = strtok_r(NULL, " \t", &lasts)) == NULL) {
1014*6ba597c5SAnurag S. Maskey 		free(copy);
1015*6ba597c5SAnurag S. Maskey 		if (*object_namep != NULL)
1016*6ba597c5SAnurag S. Maskey 			free(*object_namep);
1017*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
1018*6ba597c5SAnurag S. Maskey 	}
1019*6ba597c5SAnurag S. Maskey 	if (strcmp(condition_string, NWAM_CONDITION_IS_STRING) == 0)
1020*6ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_IS;
1021*6ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string, NWAM_CONDITION_IS_NOT_STRING) == 0)
1022*6ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_IS_NOT;
1023*6ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string, NWAM_CONDITION_CONTAINS_STRING) == 0)
1024*6ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_CONTAINS;
1025*6ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string,
1026*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_DOES_NOT_CONTAIN_STRING) == 0)
1027*6ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_DOES_NOT_CONTAIN;
1028*6ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string,
1029*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_IS_IN_RANGE_STRING) == 0)
1030*6ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_IS_IN_RANGE;
1031*6ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string,
1032*6ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_IS_NOT_IN_RANGE_STRING) == 0)
1033*6ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_IS_NOT_IN_RANGE;
1034*6ba597c5SAnurag S. Maskey 	else {
1035*6ba597c5SAnurag S. Maskey 		free(copy);
1036*6ba597c5SAnurag S. Maskey 		if (*object_namep != NULL)
1037*6ba597c5SAnurag S. Maskey 			free(*object_namep);
1038*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
1039*6ba597c5SAnurag S. Maskey 	}
1040*6ba597c5SAnurag S. Maskey 
1041*6ba597c5SAnurag S. Maskey 	if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP ||
1042*6ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU ||
1043*6ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM ||
1044*6ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) {
1045*6ba597c5SAnurag S. Maskey 		if ((*conditionp != NWAM_CONDITION_IS &&
1046*6ba597c5SAnurag S. Maskey 		    *conditionp != NWAM_CONDITION_IS_NOT) ||
1047*6ba597c5SAnurag S. Maskey 		    (active_string = strtok_r(NULL, " \t", &lasts)) == NULL ||
1048*6ba597c5SAnurag S. Maskey 		    strcmp(active_string, NWAM_CONDITION_ACTIVE_STRING) != 0) {
1049*6ba597c5SAnurag S. Maskey 			free(copy);
1050*6ba597c5SAnurag S. Maskey 			free(*object_namep);
1051*6ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
1052*6ba597c5SAnurag S. Maskey 		}
1053*6ba597c5SAnurag S. Maskey 	} else {
1054*6ba597c5SAnurag S. Maskey 		switch (*conditionp) {
1055*6ba597c5SAnurag S. Maskey 		case NWAM_CONDITION_CONTAINS:
1056*6ba597c5SAnurag S. Maskey 		case NWAM_CONDITION_DOES_NOT_CONTAIN:
1057*6ba597c5SAnurag S. Maskey 			if (*object_typep !=
1058*6ba597c5SAnurag S. Maskey 			    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
1059*6ba597c5SAnurag S. Maskey 			    *object_typep !=
1060*6ba597c5SAnurag S. Maskey 			    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
1061*6ba597c5SAnurag S. Maskey 			    *object_typep != NWAM_CONDITION_OBJECT_TYPE_ESSID) {
1062*6ba597c5SAnurag S. Maskey 				free(copy);
1063*6ba597c5SAnurag S. Maskey 				free(*object_namep);
1064*6ba597c5SAnurag S. Maskey 				return (NWAM_INVALID_ARG);
1065*6ba597c5SAnurag S. Maskey 			}
1066*6ba597c5SAnurag S. Maskey 			break;
1067*6ba597c5SAnurag S. Maskey 		case NWAM_CONDITION_IS_IN_RANGE:
1068*6ba597c5SAnurag S. Maskey 		case NWAM_CONDITION_IS_NOT_IN_RANGE:
1069*6ba597c5SAnurag S. Maskey 			if (*object_typep !=
1070*6ba597c5SAnurag S. Maskey 			    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) {
1071*6ba597c5SAnurag S. Maskey 				free(copy);
1072*6ba597c5SAnurag S. Maskey 				free(*object_namep);
1073*6ba597c5SAnurag S. Maskey 				return (NWAM_INVALID_ARG);
1074*6ba597c5SAnurag S. Maskey 			}
1075*6ba597c5SAnurag S. Maskey 			break;
1076*6ba597c5SAnurag S. Maskey 		}
1077*6ba597c5SAnurag S. Maskey 
1078*6ba597c5SAnurag S. Maskey 		if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) {
1079*6ba597c5SAnurag S. Maskey 			free(copy);
1080*6ba597c5SAnurag S. Maskey 			free(*object_namep);
1081*6ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
1082*6ba597c5SAnurag S. Maskey 		}
1083*6ba597c5SAnurag S. Maskey 		if ((*object_namep = strdup(object_name)) == NULL) {
1084*6ba597c5SAnurag S. Maskey 			free(copy);
1085*6ba597c5SAnurag S. Maskey 			free(*object_namep);
1086*6ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
1087*6ba597c5SAnurag S. Maskey 		}
1088*6ba597c5SAnurag S. Maskey 	}
1089*6ba597c5SAnurag S. Maskey 
1090*6ba597c5SAnurag S. Maskey 	free(copy);
1091*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
1092*6ba597c5SAnurag S. Maskey }
1093*6ba597c5SAnurag S. Maskey 
1094*6ba597c5SAnurag S. Maskey nwam_error_t
1095*6ba597c5SAnurag S. Maskey nwam_condition_rate(nwam_condition_object_type_t object_type,
1096*6ba597c5SAnurag S. Maskey     nwam_condition_t condition, uint64_t *ratep)
1097*6ba597c5SAnurag S. Maskey {
1098*6ba597c5SAnurag S. Maskey 	assert(ratep != NULL);
1099*6ba597c5SAnurag S. Maskey 
1100*6ba597c5SAnurag S. Maskey 	*ratep = 0;
1101*6ba597c5SAnurag S. Maskey 
1102*6ba597c5SAnurag S. Maskey 	switch (object_type) {
1103*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
1104*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
1105*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
1106*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
1107*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1108*6ba597c5SAnurag S. Maskey 		/* FALLTHRU */
1109*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
1110*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1111*6ba597c5SAnurag S. Maskey 		/* FALLTHRU */
1112*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
1113*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1114*6ba597c5SAnurag S. Maskey 		/* FALLTHRU */
1115*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
1116*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1117*6ba597c5SAnurag S. Maskey 		/* FALLTHRU */
1118*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
1119*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1120*6ba597c5SAnurag S. Maskey 		/* FALLTHRU */
1121*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
1122*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1123*6ba597c5SAnurag S. Maskey 		break;
1124*6ba597c5SAnurag S. Maskey 	default:
1125*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
1126*6ba597c5SAnurag S. Maskey 	}
1127*6ba597c5SAnurag S. Maskey 
1128*6ba597c5SAnurag S. Maskey 	switch (condition) {
1129*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS:
1130*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1131*6ba597c5SAnurag S. Maskey 		/* FALLTHRU */
1132*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_CONTAINS:
1133*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_IN_RANGE:
1134*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1135*6ba597c5SAnurag S. Maskey 		/* FALLTHRU */
1136*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_DOES_NOT_CONTAIN:
1137*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_NOT_IN_RANGE:
1138*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1139*6ba597c5SAnurag S. Maskey 		/* FALLTHRU */
1140*6ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_NOT:
1141*6ba597c5SAnurag S. Maskey 		(*ratep)++;
1142*6ba597c5SAnurag S. Maskey 		break;
1143*6ba597c5SAnurag S. Maskey 	default:
1144*6ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
1145*6ba597c5SAnurag S. Maskey 	}
1146*6ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
1147*6ba597c5SAnurag S. Maskey }
1148