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