16ba597c5SAnurag S. Maskey /* 26ba597c5SAnurag S. Maskey * CDDL HEADER START 36ba597c5SAnurag S. Maskey * 46ba597c5SAnurag S. Maskey * The contents of this file are subject to the terms of the 56ba597c5SAnurag S. Maskey * Common Development and Distribution License (the "License"). 66ba597c5SAnurag S. Maskey * You may not use this file except in compliance with the License. 76ba597c5SAnurag S. Maskey * 86ba597c5SAnurag S. Maskey * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 96ba597c5SAnurag S. Maskey * or http://www.opensolaris.org/os/licensing. 106ba597c5SAnurag S. Maskey * See the License for the specific language governing permissions 116ba597c5SAnurag S. Maskey * and limitations under the License. 126ba597c5SAnurag S. Maskey * 136ba597c5SAnurag S. Maskey * When distributing Covered Code, include this CDDL HEADER in each 146ba597c5SAnurag S. Maskey * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 156ba597c5SAnurag S. Maskey * If applicable, add the following below this CDDL HEADER, with the 166ba597c5SAnurag S. Maskey * fields enclosed by brackets "[]" replaced with your own identifying 176ba597c5SAnurag S. Maskey * information: Portions Copyright [yyyy] [name of copyright owner] 186ba597c5SAnurag S. Maskey * 196ba597c5SAnurag S. Maskey * CDDL HEADER END 206ba597c5SAnurag S. Maskey */ 216ba597c5SAnurag S. Maskey 226ba597c5SAnurag S. Maskey /* 2348fff0e3SRenee Danson Sommerfeld * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 24*33f5ff17SMilan Jurik * Copyright 2012 Milan Jurik. All rights reserved. 256ba597c5SAnurag S. Maskey */ 266ba597c5SAnurag S. Maskey 276ba597c5SAnurag S. Maskey #include <assert.h> 286ba597c5SAnurag S. Maskey #include <stdio.h> 296ba597c5SAnurag S. Maskey #include <stdlib.h> 306ba597c5SAnurag S. Maskey #include <string.h> 316ba597c5SAnurag S. Maskey #include <sys/types.h> 326ba597c5SAnurag S. Maskey #include <libdlwlan.h> 336ba597c5SAnurag S. Maskey #include <libnvpair.h> 346ba597c5SAnurag S. Maskey 356ba597c5SAnurag S. Maskey #include "libnwam_impl.h" 366ba597c5SAnurag S. Maskey #include <libnwam_priv.h> 376ba597c5SAnurag S. Maskey #include <libnwam.h> 386ba597c5SAnurag S. Maskey 396ba597c5SAnurag S. Maskey /* 406ba597c5SAnurag S. Maskey * Internal implementation of libnwam in-memory objects and values. Objects 416ba597c5SAnurag S. Maskey * are nvlists. 426ba597c5SAnurag S. Maskey */ 436ba597c5SAnurag S. Maskey 446ba597c5SAnurag S. Maskey void 456ba597c5SAnurag S. Maskey nwam_value_free(nwam_value_t value) 466ba597c5SAnurag S. Maskey { 476ba597c5SAnurag S. Maskey uint_t i; 486ba597c5SAnurag S. Maskey 496ba597c5SAnurag S. Maskey if (value == NULL) 506ba597c5SAnurag S. Maskey return; 516ba597c5SAnurag S. Maskey 526ba597c5SAnurag S. Maskey switch (value->nwv_value_type) { 536ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_BOOLEAN: 546ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_boolean); 556ba597c5SAnurag S. Maskey break; 566ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_INT64: 576ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_int64); 586ba597c5SAnurag S. Maskey break; 596ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_UINT64: 606ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_uint64); 616ba597c5SAnurag S. Maskey break; 626ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_STRING: 636ba597c5SAnurag S. Maskey for (i = 0; i < value->nwv_value_numvalues; i++) 646ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_string[i]); 656ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_string); 666ba597c5SAnurag S. Maskey break; 676ba597c5SAnurag S. Maskey } 686ba597c5SAnurag S. Maskey free(value); 696ba597c5SAnurag S. Maskey } 706ba597c5SAnurag S. Maskey 716ba597c5SAnurag S. Maskey nwam_error_t 726ba597c5SAnurag S. Maskey nwam_value_create(nwam_value_type_t value_type, void *values, uint_t numvalues, 736ba597c5SAnurag S. Maskey nwam_value_t *valuep) 746ba597c5SAnurag S. Maskey { 756ba597c5SAnurag S. Maskey nwam_value_t newvalue; 766ba597c5SAnurag S. Maskey boolean_t *values_boolean; 776ba597c5SAnurag S. Maskey int64_t *values_int64; 786ba597c5SAnurag S. Maskey uint64_t *values_uint64; 796ba597c5SAnurag S. Maskey char **values_string; 806ba597c5SAnurag S. Maskey int i, j; 816ba597c5SAnurag S. Maskey nwam_error_t err = NWAM_SUCCESS; 826ba597c5SAnurag S. Maskey 836ba597c5SAnurag S. Maskey *valuep = NULL; 846ba597c5SAnurag S. Maskey 856ba597c5SAnurag S. Maskey if ((newvalue = calloc(1, sizeof (struct nwam_value))) == NULL) 866ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 876ba597c5SAnurag S. Maskey 886ba597c5SAnurag S. Maskey newvalue->nwv_value_type = value_type; 896ba597c5SAnurag S. Maskey newvalue->nwv_value_numvalues = numvalues; 906ba597c5SAnurag S. Maskey 916ba597c5SAnurag S. Maskey switch (value_type) { 926ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_BOOLEAN: 936ba597c5SAnurag S. Maskey values_boolean = values; 946ba597c5SAnurag S. Maskey if ((newvalue->nwv_values.nwv_boolean = 956ba597c5SAnurag S. Maskey calloc(numvalues, sizeof (boolean_t))) == NULL) { 966ba597c5SAnurag S. Maskey free(newvalue); 976ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 986ba597c5SAnurag S. Maskey } 996ba597c5SAnurag S. Maskey for (i = 0; i < numvalues; i++) 1006ba597c5SAnurag S. Maskey newvalue->nwv_values.nwv_boolean[i] = values_boolean[i]; 1016ba597c5SAnurag S. Maskey break; 1026ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_INT64: 1036ba597c5SAnurag S. Maskey values_int64 = values; 1046ba597c5SAnurag S. Maskey if ((newvalue->nwv_values.nwv_int64 = 1056ba597c5SAnurag S. Maskey calloc(numvalues, sizeof (int64_t))) == NULL) { 1066ba597c5SAnurag S. Maskey free(newvalue); 1076ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 1086ba597c5SAnurag S. Maskey } 1096ba597c5SAnurag S. Maskey for (i = 0; i < numvalues; i++) 1106ba597c5SAnurag S. Maskey newvalue->nwv_values.nwv_int64[i] = values_int64[i]; 1116ba597c5SAnurag S. Maskey break; 1126ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_UINT64: 1136ba597c5SAnurag S. Maskey values_uint64 = values; 1146ba597c5SAnurag S. Maskey if ((newvalue->nwv_values.nwv_uint64 = 1156ba597c5SAnurag S. Maskey calloc(numvalues, sizeof (uint64_t))) == NULL) { 1166ba597c5SAnurag S. Maskey free(newvalue); 1176ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 1186ba597c5SAnurag S. Maskey } 1196ba597c5SAnurag S. Maskey for (i = 0; i < numvalues; i++) 1206ba597c5SAnurag S. Maskey newvalue->nwv_values.nwv_uint64[i] = values_uint64[i]; 1216ba597c5SAnurag S. Maskey break; 1226ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_STRING: 1236ba597c5SAnurag S. Maskey values_string = values; 1246ba597c5SAnurag S. Maskey if ((newvalue->nwv_values.nwv_string = 1256ba597c5SAnurag S. Maskey calloc(numvalues, sizeof (char *))) == NULL) { 1266ba597c5SAnurag S. Maskey free(newvalue); 1276ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 1286ba597c5SAnurag S. Maskey } 1296ba597c5SAnurag S. Maskey for (i = 0; i < numvalues; i++) { 1306ba597c5SAnurag S. Maskey if (strnlen(values_string[i], NWAM_MAX_VALUE_LEN) == 1316ba597c5SAnurag S. Maskey NWAM_MAX_VALUE_LEN) { 1326ba597c5SAnurag S. Maskey err = NWAM_ENTITY_INVALID_VALUE; 1336ba597c5SAnurag S. Maskey } else if ((newvalue->nwv_values.nwv_string[i] = 1346ba597c5SAnurag S. Maskey strdup(values_string[i])) == NULL) { 1356ba597c5SAnurag S. Maskey err = NWAM_NO_MEMORY; 1366ba597c5SAnurag S. Maskey } 1376ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) { 1386ba597c5SAnurag S. Maskey for (j = 0; j < i; j++) 1396ba597c5SAnurag S. Maskey free( 1406ba597c5SAnurag S. Maskey newvalue->nwv_values.nwv_string[i]); 1416ba597c5SAnurag S. Maskey free(newvalue->nwv_values.nwv_string); 1426ba597c5SAnurag S. Maskey free(newvalue); 1436ba597c5SAnurag S. Maskey return (err); 1446ba597c5SAnurag S. Maskey } 1456ba597c5SAnurag S. Maskey } 1466ba597c5SAnurag S. Maskey break; 1476ba597c5SAnurag S. Maskey default: 1486ba597c5SAnurag S. Maskey break; 1496ba597c5SAnurag S. Maskey } 1506ba597c5SAnurag S. Maskey 1516ba597c5SAnurag S. Maskey *valuep = newvalue; 1526ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 1536ba597c5SAnurag S. Maskey } 1546ba597c5SAnurag S. Maskey 1556ba597c5SAnurag S. Maskey nwam_error_t 1566ba597c5SAnurag S. Maskey nwam_value_copy(nwam_value_t old, nwam_value_t *newp) 1576ba597c5SAnurag S. Maskey { 1586ba597c5SAnurag S. Maskey void *values; 1596ba597c5SAnurag S. Maskey 1606ba597c5SAnurag S. Maskey assert(old != NULL && newp != NULL); 1616ba597c5SAnurag S. Maskey 1626ba597c5SAnurag S. Maskey switch (old->nwv_value_type) { 1636ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_BOOLEAN: 1646ba597c5SAnurag S. Maskey values = old->nwv_values.nwv_boolean; 1656ba597c5SAnurag S. Maskey break; 1666ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_INT64: 1676ba597c5SAnurag S. Maskey values = old->nwv_values.nwv_int64; 1686ba597c5SAnurag S. Maskey break; 1696ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_UINT64: 1706ba597c5SAnurag S. Maskey values = old->nwv_values.nwv_uint64; 1716ba597c5SAnurag S. Maskey break; 1726ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_STRING: 1736ba597c5SAnurag S. Maskey values = old->nwv_values.nwv_string; 1746ba597c5SAnurag S. Maskey break; 1756ba597c5SAnurag S. Maskey default: 1766ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 1776ba597c5SAnurag S. Maskey } 1786ba597c5SAnurag S. Maskey return (nwam_value_create(old->nwv_value_type, values, 1796ba597c5SAnurag S. Maskey old->nwv_value_numvalues, newp)); 1806ba597c5SAnurag S. Maskey } 1816ba597c5SAnurag S. Maskey nwam_error_t 1826ba597c5SAnurag S. Maskey nwam_value_create_boolean_array(boolean_t *values, uint_t numvalues, 1836ba597c5SAnurag S. Maskey nwam_value_t *valuep) 1846ba597c5SAnurag S. Maskey { 1856ba597c5SAnurag S. Maskey return (nwam_value_create(NWAM_VALUE_TYPE_BOOLEAN, values, numvalues, 1866ba597c5SAnurag S. Maskey valuep)); 1876ba597c5SAnurag S. Maskey } 1886ba597c5SAnurag S. Maskey 1896ba597c5SAnurag S. Maskey nwam_error_t 1906ba597c5SAnurag S. Maskey nwam_value_create_boolean(boolean_t value, nwam_value_t *valuep) 1916ba597c5SAnurag S. Maskey { 1926ba597c5SAnurag S. Maskey return (nwam_value_create_boolean_array(&value, 1, valuep)); 1936ba597c5SAnurag S. Maskey } 1946ba597c5SAnurag S. Maskey 1956ba597c5SAnurag S. Maskey nwam_error_t 1966ba597c5SAnurag S. Maskey nwam_value_create_int64_array(int64_t *values, uint_t numvalues, 1976ba597c5SAnurag S. Maskey nwam_value_t *valuep) 1986ba597c5SAnurag S. Maskey { 1996ba597c5SAnurag S. Maskey return (nwam_value_create(NWAM_VALUE_TYPE_INT64, values, numvalues, 2006ba597c5SAnurag S. Maskey valuep)); 2016ba597c5SAnurag S. Maskey } 2026ba597c5SAnurag S. Maskey 2036ba597c5SAnurag S. Maskey nwam_error_t 2046ba597c5SAnurag S. Maskey nwam_value_create_int64(int64_t value, nwam_value_t *valuep) 2056ba597c5SAnurag S. Maskey { 2066ba597c5SAnurag S. Maskey return (nwam_value_create_int64_array(&value, 1, valuep)); 2076ba597c5SAnurag S. Maskey } 2086ba597c5SAnurag S. Maskey 2096ba597c5SAnurag S. Maskey nwam_error_t 2106ba597c5SAnurag S. Maskey nwam_value_create_uint64_array(uint64_t *values, uint_t numvalues, 2116ba597c5SAnurag S. Maskey nwam_value_t *valuep) 2126ba597c5SAnurag S. Maskey { 2136ba597c5SAnurag S. Maskey return (nwam_value_create(NWAM_VALUE_TYPE_UINT64, values, numvalues, 2146ba597c5SAnurag S. Maskey valuep)); 2156ba597c5SAnurag S. Maskey } 2166ba597c5SAnurag S. Maskey 2176ba597c5SAnurag S. Maskey nwam_error_t 2186ba597c5SAnurag S. Maskey nwam_value_create_uint64(uint64_t value, nwam_value_t *valuep) 2196ba597c5SAnurag S. Maskey { 2206ba597c5SAnurag S. Maskey return (nwam_value_create_uint64_array(&value, 1, valuep)); 2216ba597c5SAnurag S. Maskey } 2226ba597c5SAnurag S. Maskey 2236ba597c5SAnurag S. Maskey nwam_error_t 2246ba597c5SAnurag S. Maskey nwam_value_create_string_array(char **values, uint_t numvalues, 2256ba597c5SAnurag S. Maskey nwam_value_t *valuep) 2266ba597c5SAnurag S. Maskey { 2276ba597c5SAnurag S. Maskey return (nwam_value_create(NWAM_VALUE_TYPE_STRING, values, numvalues, 2286ba597c5SAnurag S. Maskey valuep)); 2296ba597c5SAnurag S. Maskey } 2306ba597c5SAnurag S. Maskey 2316ba597c5SAnurag S. Maskey nwam_error_t 2326ba597c5SAnurag S. Maskey nwam_value_create_string(char *value, nwam_value_t *valuep) 2336ba597c5SAnurag S. Maskey { 2346ba597c5SAnurag S. Maskey return (nwam_value_create_string_array(&value, 1, valuep)); 2356ba597c5SAnurag S. Maskey } 2366ba597c5SAnurag S. Maskey 2376ba597c5SAnurag S. Maskey nwam_error_t 2386ba597c5SAnurag S. Maskey nwam_value_get_boolean_array(nwam_value_t value, boolean_t **valuesp, 2396ba597c5SAnurag S. Maskey uint_t *numvaluesp) 2406ba597c5SAnurag S. Maskey { 2416ba597c5SAnurag S. Maskey assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 2426ba597c5SAnurag S. Maskey 2436ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 2446ba597c5SAnurag S. Maskey *valuesp = value->nwv_values.nwv_boolean; 2456ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 2466ba597c5SAnurag S. Maskey } 2476ba597c5SAnurag S. Maskey 2486ba597c5SAnurag S. Maskey nwam_error_t 2496ba597c5SAnurag S. Maskey nwam_value_get_boolean(nwam_value_t value, boolean_t *valuep) 2506ba597c5SAnurag S. Maskey { 2516ba597c5SAnurag S. Maskey uint_t numvalues; 2526ba597c5SAnurag S. Maskey boolean_t *myvaluesp; 2536ba597c5SAnurag S. Maskey nwam_error_t err; 2546ba597c5SAnurag S. Maskey 2556ba597c5SAnurag S. Maskey err = nwam_value_get_boolean_array(value, &myvaluesp, &numvalues); 2566ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) 2576ba597c5SAnurag S. Maskey return (err); 2586ba597c5SAnurag S. Maskey if (numvalues != 1) 2596ba597c5SAnurag S. Maskey return (NWAM_ENTITY_MULTIPLE_VALUES); 2606ba597c5SAnurag S. Maskey 2616ba597c5SAnurag S. Maskey *valuep = myvaluesp[0]; 2626ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 2636ba597c5SAnurag S. Maskey } 2646ba597c5SAnurag S. Maskey 2656ba597c5SAnurag S. Maskey nwam_error_t 2666ba597c5SAnurag S. Maskey nwam_value_get_int64_array(nwam_value_t value, int64_t **valuesp, 2676ba597c5SAnurag S. Maskey uint_t *numvaluesp) 2686ba597c5SAnurag S. Maskey { 2696ba597c5SAnurag S. Maskey assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 2706ba597c5SAnurag S. Maskey 2716ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 2726ba597c5SAnurag S. Maskey *valuesp = value->nwv_values.nwv_int64; 2736ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 2746ba597c5SAnurag S. Maskey } 2756ba597c5SAnurag S. Maskey 2766ba597c5SAnurag S. Maskey nwam_error_t 2776ba597c5SAnurag S. Maskey nwam_value_get_int64(nwam_value_t value, int64_t *valuep) 2786ba597c5SAnurag S. Maskey { 2796ba597c5SAnurag S. Maskey uint_t numvalues; 2806ba597c5SAnurag S. Maskey int64_t *myvaluesp; 2816ba597c5SAnurag S. Maskey nwam_error_t err; 2826ba597c5SAnurag S. Maskey 2836ba597c5SAnurag S. Maskey err = nwam_value_get_int64_array(value, &myvaluesp, &numvalues); 2846ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) 2856ba597c5SAnurag S. Maskey return (err); 2866ba597c5SAnurag S. Maskey if (numvalues != 1) 2876ba597c5SAnurag S. Maskey return (NWAM_ENTITY_MULTIPLE_VALUES); 2886ba597c5SAnurag S. Maskey 2896ba597c5SAnurag S. Maskey *valuep = myvaluesp[0]; 2906ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 2916ba597c5SAnurag S. Maskey } 2926ba597c5SAnurag S. Maskey 2936ba597c5SAnurag S. Maskey nwam_error_t 2946ba597c5SAnurag S. Maskey nwam_value_get_uint64_array(nwam_value_t value, uint64_t **valuesp, 2956ba597c5SAnurag S. Maskey uint_t *numvaluesp) 2966ba597c5SAnurag S. Maskey { 2976ba597c5SAnurag S. Maskey assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 2986ba597c5SAnurag S. Maskey 2996ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 3006ba597c5SAnurag S. Maskey *valuesp = value->nwv_values.nwv_uint64; 3016ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3026ba597c5SAnurag S. Maskey } 3036ba597c5SAnurag S. Maskey 3046ba597c5SAnurag S. Maskey nwam_error_t 3056ba597c5SAnurag S. Maskey nwam_value_get_uint64(nwam_value_t value, uint64_t *valuep) 3066ba597c5SAnurag S. Maskey { 3076ba597c5SAnurag S. Maskey uint_t numvalues; 3086ba597c5SAnurag S. Maskey uint64_t *myvaluesp; 3096ba597c5SAnurag S. Maskey nwam_error_t err; 3106ba597c5SAnurag S. Maskey 3116ba597c5SAnurag S. Maskey err = nwam_value_get_uint64_array(value, &myvaluesp, &numvalues); 3126ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) 3136ba597c5SAnurag S. Maskey return (err); 3146ba597c5SAnurag S. Maskey if (numvalues != 1) 3156ba597c5SAnurag S. Maskey return (NWAM_ENTITY_MULTIPLE_VALUES); 3166ba597c5SAnurag S. Maskey 3176ba597c5SAnurag S. Maskey *valuep = myvaluesp[0]; 3186ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3196ba597c5SAnurag S. Maskey } 3206ba597c5SAnurag S. Maskey 3216ba597c5SAnurag S. Maskey nwam_error_t 3226ba597c5SAnurag S. Maskey nwam_value_get_string_array(nwam_value_t value, char ***valuesp, 3236ba597c5SAnurag S. Maskey uint_t *numvaluesp) 3246ba597c5SAnurag S. Maskey { 3256ba597c5SAnurag S. Maskey assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 3266ba597c5SAnurag S. Maskey 3276ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 3286ba597c5SAnurag S. Maskey *valuesp = value->nwv_values.nwv_string; 3296ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3306ba597c5SAnurag S. Maskey } 3316ba597c5SAnurag S. Maskey 3326ba597c5SAnurag S. Maskey nwam_error_t 3336ba597c5SAnurag S. Maskey nwam_value_get_string(nwam_value_t value, char **valuep) 3346ba597c5SAnurag S. Maskey { 3356ba597c5SAnurag S. Maskey uint_t numvalues; 3366ba597c5SAnurag S. Maskey char **myvaluesp; 3376ba597c5SAnurag S. Maskey nwam_error_t err; 3386ba597c5SAnurag S. Maskey 3396ba597c5SAnurag S. Maskey err = nwam_value_get_string_array(value, &myvaluesp, &numvalues); 3406ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) 3416ba597c5SAnurag S. Maskey return (err); 3426ba597c5SAnurag S. Maskey if (numvalues != 1) 3436ba597c5SAnurag S. Maskey return (NWAM_ENTITY_MULTIPLE_VALUES); 3446ba597c5SAnurag S. Maskey 3456ba597c5SAnurag S. Maskey *valuep = myvaluesp[0]; 3466ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3476ba597c5SAnurag S. Maskey } 3486ba597c5SAnurag S. Maskey 3496ba597c5SAnurag S. Maskey nwam_error_t 3506ba597c5SAnurag S. Maskey nwam_value_get_type(nwam_value_t value, nwam_value_type_t *typep) 3516ba597c5SAnurag S. Maskey { 3526ba597c5SAnurag S. Maskey *typep = value->nwv_value_type; 3536ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3546ba597c5SAnurag S. Maskey } 3556ba597c5SAnurag S. Maskey 3566ba597c5SAnurag S. Maskey nwam_error_t 3576ba597c5SAnurag S. Maskey nwam_value_get_numvalues(nwam_value_t value, uint_t *numvaluesp) 3586ba597c5SAnurag S. Maskey { 3596ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 3606ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3616ba597c5SAnurag S. Maskey } 3626ba597c5SAnurag S. Maskey 3636ba597c5SAnurag S. Maskey /* 3646ba597c5SAnurag S. Maskey * Generic object data functions. We hide nvlist implementation 3656ba597c5SAnurag S. Maskey * from NCP, ENM and location implementations. 3666ba597c5SAnurag S. Maskey */ 3676ba597c5SAnurag S. Maskey nwam_error_t 3686ba597c5SAnurag S. Maskey nwam_alloc_object_list(void *list) 3696ba597c5SAnurag S. Maskey { 3706ba597c5SAnurag S. Maskey int nverr; 3716ba597c5SAnurag S. Maskey 3726ba597c5SAnurag S. Maskey assert(list != NULL); 3736ba597c5SAnurag S. Maskey 3746ba597c5SAnurag S. Maskey if ((nverr = nvlist_alloc((nvlist_t **)list, NV_UNIQUE_NAME, 0)) != 0) 3756ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 3766ba597c5SAnurag S. Maskey 3776ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3786ba597c5SAnurag S. Maskey } 3796ba597c5SAnurag S. Maskey 3806ba597c5SAnurag S. Maskey void 3816ba597c5SAnurag S. Maskey nwam_free_object_list(void *list) 3826ba597c5SAnurag S. Maskey { 3836ba597c5SAnurag S. Maskey if (list != NULL) 3846ba597c5SAnurag S. Maskey nvlist_free(list); 3856ba597c5SAnurag S. Maskey } 3866ba597c5SAnurag S. Maskey 3876ba597c5SAnurag S. Maskey nwam_error_t 3886ba597c5SAnurag S. Maskey nwam_dup_object_list(void *oldlist, void *newlist) 3896ba597c5SAnurag S. Maskey { 3906ba597c5SAnurag S. Maskey int nverr; 3916ba597c5SAnurag S. Maskey 3926ba597c5SAnurag S. Maskey assert(oldlist != NULL && newlist != NULL); 3936ba597c5SAnurag S. Maskey 3946ba597c5SAnurag S. Maskey if ((nverr = nvlist_dup(oldlist, newlist, 0)) != 0) 3956ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 3966ba597c5SAnurag S. Maskey 3976ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3986ba597c5SAnurag S. Maskey } 3996ba597c5SAnurag S. Maskey 4006ba597c5SAnurag S. Maskey /* Add child object list to parent object list using property name childname */ 4016ba597c5SAnurag S. Maskey nwam_error_t 4026ba597c5SAnurag S. Maskey nwam_object_list_add_object_list(void *parentlist, char *childname, 4036ba597c5SAnurag S. Maskey void *childlist) 4046ba597c5SAnurag S. Maskey { 4056ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nvlist_add_nvlist(parentlist, 4066ba597c5SAnurag S. Maskey childname, childlist))); 4076ba597c5SAnurag S. Maskey } 4086ba597c5SAnurag S. Maskey 4096ba597c5SAnurag S. Maskey /* Remove object list from parent object list */ 4106ba597c5SAnurag S. Maskey nwam_error_t 4116ba597c5SAnurag S. Maskey nwam_object_list_remove_object_list(void *parentlist, char *childname) 4126ba597c5SAnurag S. Maskey { 4136ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nvlist_remove_all(parentlist, 4146ba597c5SAnurag S. Maskey childname))); 4156ba597c5SAnurag S. Maskey } 4166ba597c5SAnurag S. Maskey 4176ba597c5SAnurag S. Maskey /* 4186ba597c5SAnurag S. Maskey * Get next object list (nvlist) after lastname. Used to walk NCUs, ENMs and 4196ba597c5SAnurag S. Maskey * locations, each of which is internally represented as an nvlist. 4206ba597c5SAnurag S. Maskey */ 4216ba597c5SAnurag S. Maskey nwam_error_t 4226ba597c5SAnurag S. Maskey nwam_next_object_list(void *parentlist, char *lastname, char **childnamep, 4236ba597c5SAnurag S. Maskey void *childlistp) 4246ba597c5SAnurag S. Maskey { 4256ba597c5SAnurag S. Maskey nvpair_t *last = NULL, *next; 4266ba597c5SAnurag S. Maskey int nverr; 4276ba597c5SAnurag S. Maskey 4286ba597c5SAnurag S. Maskey if (lastname != NULL) { 4296ba597c5SAnurag S. Maskey if ((nverr = nvlist_lookup_nvpair(parentlist, lastname, &last)) 4306ba597c5SAnurag S. Maskey != 0) 4316ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 4326ba597c5SAnurag S. Maskey } 4336ba597c5SAnurag S. Maskey if ((next = nvlist_next_nvpair(parentlist, last)) == NULL) 4346ba597c5SAnurag S. Maskey return (NWAM_LIST_END); 4356ba597c5SAnurag S. Maskey 4366ba597c5SAnurag S. Maskey *childnamep = nvpair_name(next); 4376ba597c5SAnurag S. Maskey 4386ba597c5SAnurag S. Maskey if (nvpair_type(next) != DATA_TYPE_NVLIST) 4396ba597c5SAnurag S. Maskey return (NWAM_ERROR_INTERNAL); 4406ba597c5SAnurag S. Maskey 4416ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_nvlist(next, childlistp)) != NWAM_SUCCESS) 4426ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 4436ba597c5SAnurag S. Maskey 4446ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 4456ba597c5SAnurag S. Maskey } 4466ba597c5SAnurag S. Maskey 4476ba597c5SAnurag S. Maskey /* 4486ba597c5SAnurag S. Maskey * Pack nvlist into contiguous memory. If packed_listp is NULL, we just 4496ba597c5SAnurag S. Maskey * return the size of the memory needed to do so. 4506ba597c5SAnurag S. Maskey */ 4516ba597c5SAnurag S. Maskey nwam_error_t 4526ba597c5SAnurag S. Maskey nwam_pack_object_list(void *list, char **packed_listp, size_t *packed_sizep) 4536ba597c5SAnurag S. Maskey { 4546ba597c5SAnurag S. Maskey int nverr; 4556ba597c5SAnurag S. Maskey 4566ba597c5SAnurag S. Maskey assert(list != NULL && packed_sizep != NULL); 4576ba597c5SAnurag S. Maskey 4586ba597c5SAnurag S. Maskey if (packed_listp == NULL) { 4596ba597c5SAnurag S. Maskey nverr = nvlist_size(list, packed_sizep, NV_ENCODE_XDR); 4606ba597c5SAnurag S. Maskey } else { 4616ba597c5SAnurag S. Maskey nverr = nvlist_pack(list, packed_listp, packed_sizep, 4626ba597c5SAnurag S. Maskey NV_ENCODE_XDR, 0); 4636ba597c5SAnurag S. Maskey } 4646ba597c5SAnurag S. Maskey 4656ba597c5SAnurag S. Maskey if (nverr != 0) 4666ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 4676ba597c5SAnurag S. Maskey 4686ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 4696ba597c5SAnurag S. Maskey } 4706ba597c5SAnurag S. Maskey 4716ba597c5SAnurag S. Maskey nwam_error_t 4726ba597c5SAnurag S. Maskey nwam_unpack_object_list(char *packed_list, size_t packed_size, 4736ba597c5SAnurag S. Maskey void *list) 4746ba597c5SAnurag S. Maskey { 4756ba597c5SAnurag S. Maskey int nverr; 4766ba597c5SAnurag S. Maskey 4776ba597c5SAnurag S. Maskey assert(packed_list != NULL && list != NULL); 4786ba597c5SAnurag S. Maskey 4796ba597c5SAnurag S. Maskey *((nvlist_t **)list) = NULL; 4806ba597c5SAnurag S. Maskey 4816ba597c5SAnurag S. Maskey nverr = nvlist_unpack(packed_list, packed_size, (nvlist_t **)list, 0); 4826ba597c5SAnurag S. Maskey 4836ba597c5SAnurag S. Maskey if (nverr != 0) 4846ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 4856ba597c5SAnurag S. Maskey 4866ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 4876ba597c5SAnurag S. Maskey } 4886ba597c5SAnurag S. Maskey 4896ba597c5SAnurag S. Maskey /* 4906ba597c5SAnurag S. Maskey * Functions to walk, set and get properties in nvlist, translating 4916ba597c5SAnurag S. Maskey * between nwam_value_t and nvlist/nvpair representations. 4926ba597c5SAnurag S. Maskey */ 4936ba597c5SAnurag S. Maskey nwam_error_t 4946ba597c5SAnurag S. Maskey nwam_next_object_prop(void *list, char *lastname, char **namep, 4956ba597c5SAnurag S. Maskey nwam_value_t *valuep) 4966ba597c5SAnurag S. Maskey { 4976ba597c5SAnurag S. Maskey nvpair_t *last = NULL, *next; 4986ba597c5SAnurag S. Maskey int nverr; 4996ba597c5SAnurag S. Maskey 5006ba597c5SAnurag S. Maskey if (lastname != NULL) { 5016ba597c5SAnurag S. Maskey if ((nverr = nvlist_lookup_nvpair(list, lastname, &last)) != 0) 5026ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5036ba597c5SAnurag S. Maskey } 5046ba597c5SAnurag S. Maskey if ((next = nvlist_next_nvpair(list, last)) == NULL) 5056ba597c5SAnurag S. Maskey return (NWAM_LIST_END); 5066ba597c5SAnurag S. Maskey 5076ba597c5SAnurag S. Maskey *namep = nvpair_name(next); 5086ba597c5SAnurag S. Maskey 5096ba597c5SAnurag S. Maskey return (nwam_get_prop_value(list, (const char *)*namep, valuep)); 5106ba597c5SAnurag S. Maskey } 5116ba597c5SAnurag S. Maskey 5126ba597c5SAnurag S. Maskey nwam_error_t 5136ba597c5SAnurag S. Maskey nwam_get_prop_value(void *list, const char *name, nwam_value_t *valuep) 5146ba597c5SAnurag S. Maskey { 5156ba597c5SAnurag S. Maskey nvpair_t *prop; 5166ba597c5SAnurag S. Maskey nwam_error_t err; 5176ba597c5SAnurag S. Maskey int nverr; 5186ba597c5SAnurag S. Maskey boolean_t *valbool; 5196ba597c5SAnurag S. Maskey int64_t *valint64; 5206ba597c5SAnurag S. Maskey uint64_t *valuint64; 5216ba597c5SAnurag S. Maskey char **valstr; 5226ba597c5SAnurag S. Maskey uint_t numvalues; 5236ba597c5SAnurag S. Maskey 5246ba597c5SAnurag S. Maskey assert(valuep != NULL); 5256ba597c5SAnurag S. Maskey 5266ba597c5SAnurag S. Maskey *valuep = NULL; 5276ba597c5SAnurag S. Maskey 5286ba597c5SAnurag S. Maskey if ((nverr = nvlist_lookup_nvpair(list, name, &prop)) != 0) { 5296ba597c5SAnurag S. Maskey /* convert EINVAL to NOT_FOUND */ 5306ba597c5SAnurag S. Maskey if (nverr == EINVAL) 5316ba597c5SAnurag S. Maskey return (NWAM_ENTITY_NOT_FOUND); 5326ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5336ba597c5SAnurag S. Maskey } 5346ba597c5SAnurag S. Maskey 5356ba597c5SAnurag S. Maskey switch (nvpair_type(prop)) { 5366ba597c5SAnurag S. Maskey case DATA_TYPE_BOOLEAN_ARRAY: 5376ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_boolean_array(prop, 5386ba597c5SAnurag S. Maskey &valbool, &numvalues)) != 0) 5396ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5406ba597c5SAnurag S. Maskey if ((err = nwam_value_create_boolean_array(valbool, numvalues, 5416ba597c5SAnurag S. Maskey valuep)) != NWAM_SUCCESS) 5426ba597c5SAnurag S. Maskey return (err); 5436ba597c5SAnurag S. Maskey break; 5446ba597c5SAnurag S. Maskey case DATA_TYPE_INT64_ARRAY: 5456ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_int64_array(prop, 5466ba597c5SAnurag S. Maskey &valint64, &numvalues)) != 0) 5476ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5486ba597c5SAnurag S. Maskey if ((err = nwam_value_create_int64_array(valint64, numvalues, 5496ba597c5SAnurag S. Maskey valuep)) != NWAM_SUCCESS) 5506ba597c5SAnurag S. Maskey return (err); 5516ba597c5SAnurag S. Maskey break; 5526ba597c5SAnurag S. Maskey case DATA_TYPE_UINT64_ARRAY: 5536ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_uint64_array(prop, 5546ba597c5SAnurag S. Maskey &valuint64, &numvalues)) != 0) 5556ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5566ba597c5SAnurag S. Maskey if ((err = nwam_value_create_uint64_array(valuint64, numvalues, 5576ba597c5SAnurag S. Maskey valuep)) != NWAM_SUCCESS) 5586ba597c5SAnurag S. Maskey return (err); 5596ba597c5SAnurag S. Maskey break; 5606ba597c5SAnurag S. Maskey case DATA_TYPE_STRING_ARRAY: 5616ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_string_array(prop, 5626ba597c5SAnurag S. Maskey &valstr, &numvalues)) != 0) 5636ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5646ba597c5SAnurag S. Maskey if ((err = nwam_value_create_string_array(valstr, numvalues, 5656ba597c5SAnurag S. Maskey valuep)) != NWAM_SUCCESS) 5666ba597c5SAnurag S. Maskey return (err); 5676ba597c5SAnurag S. Maskey break; 5686ba597c5SAnurag S. Maskey default: 5696ba597c5SAnurag S. Maskey /* Should not happen */ 5706ba597c5SAnurag S. Maskey return (NWAM_ERROR_INTERNAL); 5716ba597c5SAnurag S. Maskey } 5726ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 5736ba597c5SAnurag S. Maskey } 5746ba597c5SAnurag S. Maskey 5756ba597c5SAnurag S. Maskey nwam_error_t 5766ba597c5SAnurag S. Maskey nwam_delete_prop(void *list, const char *name) 5776ba597c5SAnurag S. Maskey { 5786ba597c5SAnurag S. Maskey int nverr; 5796ba597c5SAnurag S. Maskey 5806ba597c5SAnurag S. Maskey if ((nverr = nvlist_remove_all(list, name)) != 0) 5816ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5826ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 5836ba597c5SAnurag S. Maskey } 5846ba597c5SAnurag S. Maskey 5856ba597c5SAnurag S. Maskey nwam_error_t 5866ba597c5SAnurag S. Maskey nwam_set_prop_value(void *list, const char *propname, nwam_value_t value) 5876ba597c5SAnurag S. Maskey { 5886ba597c5SAnurag S. Maskey int nverr; 5896ba597c5SAnurag S. Maskey nwam_error_t err; 5906ba597c5SAnurag S. Maskey nwam_value_type_t type; 5916ba597c5SAnurag S. Maskey uint_t numvalues; 5926ba597c5SAnurag S. Maskey boolean_t *valbool; 5936ba597c5SAnurag S. Maskey int64_t *valint64; 5946ba597c5SAnurag S. Maskey uint64_t *valuint64; 5956ba597c5SAnurag S. Maskey char **valstr; 5966ba597c5SAnurag S. Maskey 5976ba597c5SAnurag S. Maskey assert(list != NULL && value != NULL); 5986ba597c5SAnurag S. Maskey 5996ba597c5SAnurag S. Maskey if ((err = nwam_value_get_type(value, &type)) != NWAM_SUCCESS) 6006ba597c5SAnurag S. Maskey return (err); 6016ba597c5SAnurag S. Maskey 6026ba597c5SAnurag S. Maskey switch (type) { 6036ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_BOOLEAN: 6046ba597c5SAnurag S. Maskey if ((err = nwam_value_get_boolean_array(value, &valbool, 6056ba597c5SAnurag S. Maskey &numvalues)) != NWAM_SUCCESS) 6066ba597c5SAnurag S. Maskey return (err); 6076ba597c5SAnurag S. Maskey if ((nverr = nvlist_add_boolean_array(list, propname, 6086ba597c5SAnurag S. Maskey valbool, numvalues)) != 0) 6096ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 6106ba597c5SAnurag S. Maskey break; 6116ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_INT64: 6126ba597c5SAnurag S. Maskey if ((err = nwam_value_get_int64_array(value, &valint64, 6136ba597c5SAnurag S. Maskey &numvalues)) != NWAM_SUCCESS) 6146ba597c5SAnurag S. Maskey return (err); 6156ba597c5SAnurag S. Maskey if ((nverr = nvlist_add_int64_array(list, propname, 6166ba597c5SAnurag S. Maskey valint64, numvalues)) != 0) 6176ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 6186ba597c5SAnurag S. Maskey break; 6196ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_UINT64: 6206ba597c5SAnurag S. Maskey if ((err = nwam_value_get_uint64_array(value, &valuint64, 6216ba597c5SAnurag S. Maskey &numvalues)) != NWAM_SUCCESS) 6226ba597c5SAnurag S. Maskey return (err); 6236ba597c5SAnurag S. Maskey if ((nverr = nvlist_add_uint64_array(list, propname, 6246ba597c5SAnurag S. Maskey valuint64, numvalues)) != 0) 6256ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 6266ba597c5SAnurag S. Maskey break; 6276ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_STRING: 6286ba597c5SAnurag S. Maskey if ((err = nwam_value_get_string_array(value, &valstr, 6296ba597c5SAnurag S. Maskey &numvalues)) != NWAM_SUCCESS) 6306ba597c5SAnurag S. Maskey return (err); 6316ba597c5SAnurag S. Maskey if ((nverr = nvlist_add_string_array(list, propname, 6326ba597c5SAnurag S. Maskey valstr, numvalues)) != 0) 6336ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 6346ba597c5SAnurag S. Maskey break; 6356ba597c5SAnurag S. Maskey default: 6366ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 6376ba597c5SAnurag S. Maskey } 6386ba597c5SAnurag S. Maskey 6396ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 6406ba597c5SAnurag S. Maskey } 6416ba597c5SAnurag S. Maskey 6426ba597c5SAnurag S. Maskey /* Map uint64 values to their string counterparts */ 6436ba597c5SAnurag S. Maskey 6446ba597c5SAnurag S. Maskey struct nwam_value_entry { 6456ba597c5SAnurag S. Maskey const char *value_string; 6466ba597c5SAnurag S. Maskey uint64_t value; 6476ba597c5SAnurag S. Maskey }; 6486ba597c5SAnurag S. Maskey 6496ba597c5SAnurag S. Maskey struct nwam_value_entry prop_activation_mode_value_entries[] = 6506ba597c5SAnurag S. Maskey { 6516ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_MANUAL_STRING, NWAM_ACTIVATION_MODE_MANUAL }, 6526ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_SYSTEM_STRING, NWAM_ACTIVATION_MODE_SYSTEM }, 6536ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_CONDITIONAL_ANY_STRING, 6546ba597c5SAnurag S. Maskey NWAM_ACTIVATION_MODE_CONDITIONAL_ANY }, 6556ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_CONDITIONAL_ALL_STRING, 6566ba597c5SAnurag S. Maskey NWAM_ACTIVATION_MODE_CONDITIONAL_ALL }, 6576ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_PRIORITIZED_STRING, 6586ba597c5SAnurag S. Maskey NWAM_ACTIVATION_MODE_PRIORITIZED }, 6596ba597c5SAnurag S. Maskey { NULL, 0 } 6606ba597c5SAnurag S. Maskey }; 6616ba597c5SAnurag S. Maskey 6626ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_type_entries[] = 6636ba597c5SAnurag S. Maskey { 6646ba597c5SAnurag S. Maskey { NWAM_NCU_TYPE_LINK_STRING, NWAM_NCU_TYPE_LINK }, 6656ba597c5SAnurag S. Maskey { NWAM_NCU_TYPE_INTERFACE_STRING, NWAM_NCU_TYPE_INTERFACE }, 6666ba597c5SAnurag S. Maskey { NULL, 0 } 6676ba597c5SAnurag S. Maskey }; 6686ba597c5SAnurag S. Maskey 6696ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_class_entries[] = 6706ba597c5SAnurag S. Maskey { 6716ba597c5SAnurag S. Maskey { NWAM_NCU_CLASS_PHYS_STRING, NWAM_NCU_CLASS_PHYS }, 6726ba597c5SAnurag S. Maskey { NWAM_NCU_CLASS_IP_STRING, NWAM_NCU_CLASS_IP }, 6736ba597c5SAnurag S. Maskey { NULL, 0 } 6746ba597c5SAnurag S. Maskey }; 6756ba597c5SAnurag S. Maskey 6766ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ip_version_entries[] = 6776ba597c5SAnurag S. Maskey { 6786ba597c5SAnurag S. Maskey { NWAM_IP_VERSION_IPV4_STRING, IPV4_VERSION }, 6796ba597c5SAnurag S. Maskey { NWAM_IP_VERSION_IPV6_STRING, IPV6_VERSION }, 6806ba597c5SAnurag S. Maskey { NULL, 0 } 6816ba597c5SAnurag S. Maskey }; 6826ba597c5SAnurag S. Maskey 6836ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ipv4_addrsrc_entries[] = 6846ba597c5SAnurag S. Maskey { 6856ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP }, 6866ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC }, 6876ba597c5SAnurag S. Maskey { NULL, 0 } 6886ba597c5SAnurag S. Maskey }; 6896ba597c5SAnurag S. Maskey 6906ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ipv6_addrsrc_entries[] = 6916ba597c5SAnurag S. Maskey { 6926ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP }, 6936ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC }, 6946ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_AUTOCONF_STRING, NWAM_ADDRSRC_AUTOCONF }, 6956ba597c5SAnurag S. Maskey { NULL, 0 } 6966ba597c5SAnurag S. Maskey }; 6976ba597c5SAnurag S. Maskey 6986ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_priority_mode_entries[] = 6996ba597c5SAnurag S. Maskey { 7006ba597c5SAnurag S. Maskey { NWAM_PRIORITY_MODE_EXCLUSIVE_STRING, NWAM_PRIORITY_MODE_EXCLUSIVE }, 7016ba597c5SAnurag S. Maskey { NWAM_PRIORITY_MODE_SHARED_STRING, NWAM_PRIORITY_MODE_SHARED }, 7026ba597c5SAnurag S. Maskey { NWAM_PRIORITY_MODE_ALL_STRING, NWAM_PRIORITY_MODE_ALL }, 7036ba597c5SAnurag S. Maskey { NULL, 0 } 7046ba597c5SAnurag S. Maskey }; 7056ba597c5SAnurag S. Maskey 7066ba597c5SAnurag S. Maskey struct nwam_value_entry loc_prop_nameservices_entries[] = 7076ba597c5SAnurag S. Maskey { 7086ba597c5SAnurag S. Maskey { NWAM_NAMESERVICES_DNS_STRING, NWAM_NAMESERVICES_DNS }, 7096ba597c5SAnurag S. Maskey { NWAM_NAMESERVICES_FILES_STRING, NWAM_NAMESERVICES_FILES }, 7106ba597c5SAnurag S. Maskey { NWAM_NAMESERVICES_NIS_STRING, NWAM_NAMESERVICES_NIS }, 7116ba597c5SAnurag S. Maskey { NWAM_NAMESERVICES_LDAP_STRING, NWAM_NAMESERVICES_LDAP }, 7126ba597c5SAnurag S. Maskey { NULL, 0 } 7136ba597c5SAnurag S. Maskey }; 7146ba597c5SAnurag S. Maskey 7156ba597c5SAnurag S. Maskey struct nwam_value_entry loc_prop_nameservice_configsrc_entries[] = 7166ba597c5SAnurag S. Maskey { 7176ba597c5SAnurag S. Maskey { NWAM_CONFIGSRC_MANUAL_STRING, NWAM_CONFIGSRC_MANUAL }, 7186ba597c5SAnurag S. Maskey { NWAM_CONFIGSRC_DHCP_STRING, NWAM_CONFIGSRC_DHCP }, 7196ba597c5SAnurag S. Maskey { NULL, 0 } 7206ba597c5SAnurag S. Maskey }; 7216ba597c5SAnurag S. Maskey 7226ba597c5SAnurag S. Maskey struct nwam_value_entry known_wlan_prop_security_mode_entries[] = 7236ba597c5SAnurag S. Maskey { 7246ba597c5SAnurag S. Maskey { "none", DLADM_WLAN_SECMODE_NONE }, 7256ba597c5SAnurag S. Maskey { "wep", DLADM_WLAN_SECMODE_WEP }, 7266ba597c5SAnurag S. Maskey { "wpa", DLADM_WLAN_SECMODE_WPA }, 7276ba597c5SAnurag S. Maskey { NULL, 0 } 7286ba597c5SAnurag S. Maskey }; 7296ba597c5SAnurag S. Maskey 7306ba597c5SAnurag S. Maskey struct nwam_prop_value_entry { 7316ba597c5SAnurag S. Maskey const char *prop_name; 7326ba597c5SAnurag S. Maskey struct nwam_value_entry *value_entries; 7336ba597c5SAnurag S. Maskey } prop_value_entry_table[] = 7346ba597c5SAnurag S. Maskey { 7356ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 7366ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_TYPE, ncu_prop_type_entries }, 7376ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_CLASS, ncu_prop_class_entries }, 7386ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_IP_VERSION, ncu_prop_ip_version_entries }, 7396ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_IPV4_ADDRSRC, ncu_prop_ipv4_addrsrc_entries }, 7406ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_IPV6_ADDRSRC, ncu_prop_ipv6_addrsrc_entries }, 7416ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_PRIORITY_MODE, ncu_prop_priority_mode_entries }, 7426ba597c5SAnurag S. Maskey { NWAM_ENM_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 7436ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 7446ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_NAMESERVICES, loc_prop_nameservices_entries }, 7456ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, 7466ba597c5SAnurag S. Maskey loc_prop_nameservice_configsrc_entries }, 7476ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, 7486ba597c5SAnurag S. Maskey loc_prop_nameservice_configsrc_entries }, 7496ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, 7506ba597c5SAnurag S. Maskey loc_prop_nameservice_configsrc_entries }, 7516ba597c5SAnurag S. Maskey { NWAM_KNOWN_WLAN_PROP_SECURITY_MODE, 7526ba597c5SAnurag S. Maskey known_wlan_prop_security_mode_entries }, 7536ba597c5SAnurag S. Maskey { NULL, NULL } 7546ba597c5SAnurag S. Maskey }; 7556ba597c5SAnurag S. Maskey 7566ba597c5SAnurag S. Maskey /* 7576ba597c5SAnurag S. Maskey * Convert uint64 values for property propname into a string representing 7586ba597c5SAnurag S. Maskey * that value. Used by enum values. 7596ba597c5SAnurag S. Maskey */ 7606ba597c5SAnurag S. Maskey nwam_error_t 7616ba597c5SAnurag S. Maskey nwam_uint64_get_value_string(const char *propname, uint64_t val, 7626ba597c5SAnurag S. Maskey const char **valstrp) 7636ba597c5SAnurag S. Maskey { 7646ba597c5SAnurag S. Maskey int i, j; 7656ba597c5SAnurag S. Maskey int max = 0; /* largest enum value seen so far */ 7666ba597c5SAnurag S. Maskey struct nwam_value_entry *value_entries; 7676ba597c5SAnurag S. Maskey 7686ba597c5SAnurag S. Maskey assert(propname != NULL && valstrp != NULL); 7696ba597c5SAnurag S. Maskey 7706ba597c5SAnurag S. Maskey for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) { 7716ba597c5SAnurag S. Maskey if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0) 7726ba597c5SAnurag S. Maskey continue; 7736ba597c5SAnurag S. Maskey 7746ba597c5SAnurag S. Maskey value_entries = prop_value_entry_table[i].value_entries; 7756ba597c5SAnurag S. Maskey 7766ba597c5SAnurag S. Maskey for (j = 0; value_entries[j].value_string != NULL; j++) { 7776ba597c5SAnurag S. Maskey if (value_entries[j].value == val) { 7786ba597c5SAnurag S. Maskey *valstrp = value_entries[j].value_string; 7796ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 7806ba597c5SAnurag S. Maskey } 7816ba597c5SAnurag S. Maskey max = value_entries[j].value > max ? 7826ba597c5SAnurag S. Maskey value_entries[j].value : max; 7836ba597c5SAnurag S. Maskey } 7846ba597c5SAnurag S. Maskey /* 7856ba597c5SAnurag S. Maskey * If trying to get the string for an enum value that doesn't 7866ba597c5SAnurag S. Maskey * exist, return NWAM_LIST_END. Otherwise, the input enum 7876ba597c5SAnurag S. Maskey * value doesn't exist for the given property. 7886ba597c5SAnurag S. Maskey */ 7896ba597c5SAnurag S. Maskey if (val > max) 7906ba597c5SAnurag S. Maskey return (NWAM_LIST_END); 7916ba597c5SAnurag S. Maskey else 7926ba597c5SAnurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE); 7936ba597c5SAnurag S. Maskey } 7946ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 7956ba597c5SAnurag S. Maskey } 7966ba597c5SAnurag S. Maskey 7976ba597c5SAnurag S. Maskey /* 7986ba597c5SAnurag S. Maskey * Convert string to appropriate uint64 value. 7996ba597c5SAnurag S. Maskey */ 8006ba597c5SAnurag S. Maskey nwam_error_t 8016ba597c5SAnurag S. Maskey nwam_value_string_get_uint64(const char *propname, const char *valstr, 8026ba597c5SAnurag S. Maskey uint64_t *valp) 8036ba597c5SAnurag S. Maskey { 8046ba597c5SAnurag S. Maskey int i, j; 8056ba597c5SAnurag S. Maskey struct nwam_value_entry *value_entries; 8066ba597c5SAnurag S. Maskey 8076ba597c5SAnurag S. Maskey assert(propname != NULL && valstr != NULL && valp != NULL); 8086ba597c5SAnurag S. Maskey 8096ba597c5SAnurag S. Maskey for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) { 8106ba597c5SAnurag S. Maskey if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0) 8116ba597c5SAnurag S. Maskey continue; 8126ba597c5SAnurag S. Maskey 8136ba597c5SAnurag S. Maskey value_entries = prop_value_entry_table[i].value_entries; 8146ba597c5SAnurag S. Maskey 8156ba597c5SAnurag S. Maskey for (j = 0; value_entries[j].value_string != NULL; j++) { 8166ba597c5SAnurag S. Maskey if (strcasecmp(value_entries[j].value_string, valstr) 8176ba597c5SAnurag S. Maskey == 0) { 8186ba597c5SAnurag S. Maskey *valp = value_entries[j].value; 8196ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 8206ba597c5SAnurag S. Maskey } 8216ba597c5SAnurag S. Maskey } 8226ba597c5SAnurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE); 8236ba597c5SAnurag S. Maskey } 8246ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8256ba597c5SAnurag S. Maskey } 8266ba597c5SAnurag S. Maskey 8276ba597c5SAnurag S. Maskey /* Conditional activation functions */ 8286ba597c5SAnurag S. Maskey 8296ba597c5SAnurag S. Maskey nwam_error_t 8306ba597c5SAnurag S. Maskey nwam_condition_to_condition_string(nwam_condition_object_type_t object_type, 8316ba597c5SAnurag S. Maskey nwam_condition_t condition, const char *object_name, char **stringp) 8326ba597c5SAnurag S. Maskey { 8336ba597c5SAnurag S. Maskey char *object_type_string, *condition_string; 8346ba597c5SAnurag S. Maskey char *string; 8356ba597c5SAnurag S. Maskey 8366ba597c5SAnurag S. Maskey assert(stringp != NULL); 8376ba597c5SAnurag S. Maskey 8386ba597c5SAnurag S. Maskey *stringp = NULL; 8396ba597c5SAnurag S. Maskey 8406ba597c5SAnurag S. Maskey switch (object_type) { 8416ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_NCP: 8426ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCP_STRING; 8436ba597c5SAnurag S. Maskey break; 8446ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_NCU: 8456ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCU_STRING; 8466ba597c5SAnurag S. Maskey break; 8476ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ENM: 8486ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_ENM_STRING; 8496ba597c5SAnurag S. Maskey break; 8506ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_LOC: 8516ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_LOC_STRING; 8526ba597c5SAnurag S. Maskey break; 8536ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS: 8546ba597c5SAnurag S. Maskey object_type_string = 8556ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING; 8566ba597c5SAnurag S. Maskey break; 8576ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN: 8586ba597c5SAnurag S. Maskey object_type_string = 8596ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING; 8606ba597c5SAnurag S. Maskey break; 8616ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN: 8626ba597c5SAnurag S. Maskey object_type_string = 8636ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING; 8646ba597c5SAnurag S. Maskey break; 8656ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ESSID: 8666ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING; 8676ba597c5SAnurag S. Maskey break; 8686ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_BSSID: 8696ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING; 8706ba597c5SAnurag S. Maskey break; 8716ba597c5SAnurag S. Maskey default: 8726ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8736ba597c5SAnurag S. Maskey 8746ba597c5SAnurag S. Maskey } 8756ba597c5SAnurag S. Maskey switch (condition) { 8766ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS: 8776ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_IS_STRING; 8786ba597c5SAnurag S. Maskey break; 8796ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_NOT: 8806ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_IS_NOT_STRING; 8816ba597c5SAnurag S. Maskey break; 8826ba597c5SAnurag S. Maskey case NWAM_CONDITION_CONTAINS: 8836ba597c5SAnurag S. Maskey if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN && 8846ba597c5SAnurag S. Maskey object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN && 8856ba597c5SAnurag S. Maskey object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID) 8866ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8876ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_CONTAINS_STRING; 8886ba597c5SAnurag S. Maskey break; 8896ba597c5SAnurag S. Maskey case NWAM_CONDITION_DOES_NOT_CONTAIN: 8906ba597c5SAnurag S. Maskey if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN && 8916ba597c5SAnurag S. Maskey object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN && 8926ba597c5SAnurag S. Maskey object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID) 8936ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8946ba597c5SAnurag S. Maskey 8956ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_DOES_NOT_CONTAIN_STRING; 8966ba597c5SAnurag S. Maskey break; 8976ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_IN_RANGE: 8986ba597c5SAnurag S. Maskey if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) 8996ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 9006ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_IS_IN_RANGE_STRING; 9016ba597c5SAnurag S. Maskey break; 9026ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_NOT_IN_RANGE: 9036ba597c5SAnurag S. Maskey if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) 9046ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 9056ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_IS_NOT_IN_RANGE_STRING; 9066ba597c5SAnurag S. Maskey break; 9076ba597c5SAnurag S. Maskey default: 9086ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 9096ba597c5SAnurag S. Maskey } 9106ba597c5SAnurag S. Maskey if ((string = malloc(NWAM_MAX_VALUE_LEN)) == NULL) 9116ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 9126ba597c5SAnurag S. Maskey switch (object_type) { 9136ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_NCP: 9146ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_NCU: 9156ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ENM: 9166ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_LOC: 9176ba597c5SAnurag S. Maskey (void) snprintf(string, NWAM_MAX_VALUE_LEN, 9186ba597c5SAnurag S. Maskey "%s %s %s active", object_type_string, 9196ba597c5SAnurag S. Maskey object_name, condition_string); 9206ba597c5SAnurag S. Maskey *stringp = string; 9216ba597c5SAnurag S. Maskey break; 9226ba597c5SAnurag S. Maskey 9236ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS: 9246ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN: 9256ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN: 9266ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ESSID: 9276ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_BSSID: 9286ba597c5SAnurag S. Maskey (void) snprintf(string, NWAM_MAX_VALUE_LEN, 9296ba597c5SAnurag S. Maskey "%s %s %s", object_type_string, 9306ba597c5SAnurag S. Maskey condition_string, object_name); 9316ba597c5SAnurag S. Maskey *stringp = string; 9326ba597c5SAnurag S. Maskey break; 9336ba597c5SAnurag S. Maskey 9346ba597c5SAnurag S. Maskey default: 9356ba597c5SAnurag S. Maskey free(string); 9366ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 9376ba597c5SAnurag S. Maskey 9386ba597c5SAnurag S. Maskey } 9396ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 9406ba597c5SAnurag S. Maskey } 9416ba597c5SAnurag S. Maskey 9426ba597c5SAnurag S. Maskey nwam_error_t 9436ba597c5SAnurag S. Maskey nwam_condition_string_to_condition(const char *string, 9446ba597c5SAnurag S. Maskey nwam_condition_object_type_t *object_typep, 9456ba597c5SAnurag S. Maskey nwam_condition_t *conditionp, char **object_namep) 9466ba597c5SAnurag S. Maskey { 9476ba597c5SAnurag S. Maskey char *copy, *lasts; 9486ba597c5SAnurag S. Maskey char *object_type_string, *object_name; 9496ba597c5SAnurag S. Maskey char *condition_string, *active_string; 9506ba597c5SAnurag S. Maskey 9516ba597c5SAnurag S. Maskey assert(string != NULL && object_typep != NULL && conditionp != NULL && 9526ba597c5SAnurag S. Maskey object_namep != NULL); 9536ba597c5SAnurag S. Maskey 9546ba597c5SAnurag S. Maskey if ((copy = strdup(string)) == NULL) 9556ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 9566ba597c5SAnurag S. Maskey 9576ba597c5SAnurag S. Maskey if ((object_type_string = strtok_r(copy, " \t", &lasts)) == NULL) { 9586ba597c5SAnurag S. Maskey free(copy); 9596ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 9606ba597c5SAnurag S. Maskey } 9616ba597c5SAnurag S. Maskey 9626ba597c5SAnurag S. Maskey if (strcmp(object_type_string, NWAM_CONDITION_OBJECT_TYPE_NCP_STRING) 9636ba597c5SAnurag S. Maskey == 0) 9646ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_NCP; 9656ba597c5SAnurag S. Maskey else if (strcmp(object_type_string, 9666ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_NCU_STRING) == 0) 9676ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_NCU; 9686ba597c5SAnurag S. Maskey else if (strcmp(object_type_string, 9696ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_ENM_STRING) == 0) 9706ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_ENM; 9716ba597c5SAnurag S. Maskey else if (strcmp(object_type_string, 9726ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_LOC_STRING) == 0) 9736ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_LOC; 9746ba597c5SAnurag S. Maskey else if (strcmp(object_type_string, 9756ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING) == 0) 9766ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS; 9776ba597c5SAnurag S. Maskey else if (strcmp(object_type_string, 9786ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING) == 0) 9796ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN; 9806ba597c5SAnurag S. Maskey else if (strcmp(object_type_string, 9816ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING) == 0) 9826ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN; 9836ba597c5SAnurag S. Maskey else if (strcmp(object_type_string, 9846ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING) == 0) 9856ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_ESSID; 9866ba597c5SAnurag S. Maskey else if (strcmp(object_type_string, 9876ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING) == 0) 9886ba597c5SAnurag S. Maskey *object_typep = NWAM_CONDITION_OBJECT_TYPE_BSSID; 9896ba597c5SAnurag S. Maskey else { 9906ba597c5SAnurag S. Maskey free(copy); 9916ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 9926ba597c5SAnurag S. Maskey } 9936ba597c5SAnurag S. Maskey 9946ba597c5SAnurag S. Maskey if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP || 9956ba597c5SAnurag S. Maskey *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU || 9966ba597c5SAnurag S. Maskey *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM || 9976ba597c5SAnurag S. Maskey *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) { 9986ba597c5SAnurag S. Maskey if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) { 9996ba597c5SAnurag S. Maskey free(copy); 10006ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 10016ba597c5SAnurag S. Maskey } 10026ba597c5SAnurag S. Maskey if ((*object_namep = strdup(object_name)) == NULL) { 10036ba597c5SAnurag S. Maskey free(copy); 10046ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 10056ba597c5SAnurag S. Maskey } 10066ba597c5SAnurag S. Maskey 10076ba597c5SAnurag S. Maskey } 10086ba597c5SAnurag S. Maskey 10096ba597c5SAnurag S. Maskey if ((condition_string = strtok_r(NULL, " \t", &lasts)) == NULL) { 10106ba597c5SAnurag S. Maskey free(copy); 10116ba597c5SAnurag S. Maskey if (*object_namep != NULL) 10126ba597c5SAnurag S. Maskey free(*object_namep); 10136ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 10146ba597c5SAnurag S. Maskey } 10156ba597c5SAnurag S. Maskey if (strcmp(condition_string, NWAM_CONDITION_IS_STRING) == 0) 10166ba597c5SAnurag S. Maskey *conditionp = NWAM_CONDITION_IS; 10176ba597c5SAnurag S. Maskey else if (strcmp(condition_string, NWAM_CONDITION_IS_NOT_STRING) == 0) 10186ba597c5SAnurag S. Maskey *conditionp = NWAM_CONDITION_IS_NOT; 10196ba597c5SAnurag S. Maskey else if (strcmp(condition_string, NWAM_CONDITION_CONTAINS_STRING) == 0) 10206ba597c5SAnurag S. Maskey *conditionp = NWAM_CONDITION_CONTAINS; 10216ba597c5SAnurag S. Maskey else if (strcmp(condition_string, 10226ba597c5SAnurag S. Maskey NWAM_CONDITION_DOES_NOT_CONTAIN_STRING) == 0) 10236ba597c5SAnurag S. Maskey *conditionp = NWAM_CONDITION_DOES_NOT_CONTAIN; 10246ba597c5SAnurag S. Maskey else if (strcmp(condition_string, 10256ba597c5SAnurag S. Maskey NWAM_CONDITION_IS_IN_RANGE_STRING) == 0) 10266ba597c5SAnurag S. Maskey *conditionp = NWAM_CONDITION_IS_IN_RANGE; 10276ba597c5SAnurag S. Maskey else if (strcmp(condition_string, 10286ba597c5SAnurag S. Maskey NWAM_CONDITION_IS_NOT_IN_RANGE_STRING) == 0) 10296ba597c5SAnurag S. Maskey *conditionp = NWAM_CONDITION_IS_NOT_IN_RANGE; 10306ba597c5SAnurag S. Maskey else { 10316ba597c5SAnurag S. Maskey free(copy); 10326ba597c5SAnurag S. Maskey if (*object_namep != NULL) 10336ba597c5SAnurag S. Maskey free(*object_namep); 10346ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 10356ba597c5SAnurag S. Maskey } 10366ba597c5SAnurag S. Maskey 10376ba597c5SAnurag S. Maskey if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP || 10386ba597c5SAnurag S. Maskey *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU || 10396ba597c5SAnurag S. Maskey *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM || 10406ba597c5SAnurag S. Maskey *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) { 10416ba597c5SAnurag S. Maskey if ((*conditionp != NWAM_CONDITION_IS && 10426ba597c5SAnurag S. Maskey *conditionp != NWAM_CONDITION_IS_NOT) || 10436ba597c5SAnurag S. Maskey (active_string = strtok_r(NULL, " \t", &lasts)) == NULL || 10446ba597c5SAnurag S. Maskey strcmp(active_string, NWAM_CONDITION_ACTIVE_STRING) != 0) { 10456ba597c5SAnurag S. Maskey free(copy); 10466ba597c5SAnurag S. Maskey free(*object_namep); 10476ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 10486ba597c5SAnurag S. Maskey } 10496ba597c5SAnurag S. Maskey } else { 10506ba597c5SAnurag S. Maskey switch (*conditionp) { 10516ba597c5SAnurag S. Maskey case NWAM_CONDITION_CONTAINS: 10526ba597c5SAnurag S. Maskey case NWAM_CONDITION_DOES_NOT_CONTAIN: 10536ba597c5SAnurag S. Maskey if (*object_typep != 10546ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN && 10556ba597c5SAnurag S. Maskey *object_typep != 10566ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN && 10576ba597c5SAnurag S. Maskey *object_typep != NWAM_CONDITION_OBJECT_TYPE_ESSID) { 10586ba597c5SAnurag S. Maskey free(copy); 10596ba597c5SAnurag S. Maskey free(*object_namep); 10606ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 10616ba597c5SAnurag S. Maskey } 10626ba597c5SAnurag S. Maskey break; 10636ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_IN_RANGE: 10646ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_NOT_IN_RANGE: 10656ba597c5SAnurag S. Maskey if (*object_typep != 10666ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) { 10676ba597c5SAnurag S. Maskey free(copy); 10686ba597c5SAnurag S. Maskey free(*object_namep); 10696ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 10706ba597c5SAnurag S. Maskey } 10716ba597c5SAnurag S. Maskey break; 10726ba597c5SAnurag S. Maskey } 10736ba597c5SAnurag S. Maskey 10746ba597c5SAnurag S. Maskey if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) { 10756ba597c5SAnurag S. Maskey free(copy); 10766ba597c5SAnurag S. Maskey free(*object_namep); 10776ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 10786ba597c5SAnurag S. Maskey } 10796ba597c5SAnurag S. Maskey if ((*object_namep = strdup(object_name)) == NULL) { 10806ba597c5SAnurag S. Maskey free(copy); 10816ba597c5SAnurag S. Maskey free(*object_namep); 10826ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 10836ba597c5SAnurag S. Maskey } 10846ba597c5SAnurag S. Maskey } 10856ba597c5SAnurag S. Maskey 10866ba597c5SAnurag S. Maskey free(copy); 10876ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 10886ba597c5SAnurag S. Maskey } 10896ba597c5SAnurag S. Maskey 10906ba597c5SAnurag S. Maskey nwam_error_t 10916ba597c5SAnurag S. Maskey nwam_condition_rate(nwam_condition_object_type_t object_type, 10926ba597c5SAnurag S. Maskey nwam_condition_t condition, uint64_t *ratep) 10936ba597c5SAnurag S. Maskey { 10946ba597c5SAnurag S. Maskey assert(ratep != NULL); 10956ba597c5SAnurag S. Maskey 10966ba597c5SAnurag S. Maskey *ratep = 0; 10976ba597c5SAnurag S. Maskey 10986ba597c5SAnurag S. Maskey switch (object_type) { 10996ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_NCP: 11006ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_NCU: 11016ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ENM: 11026ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_LOC: 11036ba597c5SAnurag S. Maskey (*ratep)++; 11046ba597c5SAnurag S. Maskey /* FALLTHRU */ 11056ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN: 11066ba597c5SAnurag S. Maskey (*ratep)++; 11076ba597c5SAnurag S. Maskey /* FALLTHRU */ 11086ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN: 11096ba597c5SAnurag S. Maskey (*ratep)++; 11106ba597c5SAnurag S. Maskey /* FALLTHRU */ 11116ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS: 11126ba597c5SAnurag S. Maskey (*ratep)++; 11136ba597c5SAnurag S. Maskey /* FALLTHRU */ 11146ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_BSSID: 11156ba597c5SAnurag S. Maskey (*ratep)++; 11166ba597c5SAnurag S. Maskey /* FALLTHRU */ 11176ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ESSID: 11186ba597c5SAnurag S. Maskey (*ratep)++; 11196ba597c5SAnurag S. Maskey break; 11206ba597c5SAnurag S. Maskey default: 11216ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 11226ba597c5SAnurag S. Maskey } 11236ba597c5SAnurag S. Maskey 11246ba597c5SAnurag S. Maskey switch (condition) { 11256ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS: 11266ba597c5SAnurag S. Maskey (*ratep)++; 11276ba597c5SAnurag S. Maskey /* FALLTHRU */ 11286ba597c5SAnurag S. Maskey case NWAM_CONDITION_CONTAINS: 11296ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_IN_RANGE: 11306ba597c5SAnurag S. Maskey (*ratep)++; 11316ba597c5SAnurag S. Maskey /* FALLTHRU */ 11326ba597c5SAnurag S. Maskey case NWAM_CONDITION_DOES_NOT_CONTAIN: 11336ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_NOT_IN_RANGE: 11346ba597c5SAnurag S. Maskey (*ratep)++; 11356ba597c5SAnurag S. Maskey /* FALLTHRU */ 11366ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_NOT: 11376ba597c5SAnurag S. Maskey (*ratep)++; 11386ba597c5SAnurag S. Maskey break; 11396ba597c5SAnurag S. Maskey default: 11406ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 11416ba597c5SAnurag S. Maskey } 11426ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 11436ba597c5SAnurag S. Maskey } 1144