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 /* 23*48fff0e3SRenee Danson Sommerfeld * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 246ba597c5SAnurag S. Maskey */ 256ba597c5SAnurag S. Maskey 266ba597c5SAnurag S. Maskey #include <assert.h> 276ba597c5SAnurag S. Maskey #include <stdio.h> 286ba597c5SAnurag S. Maskey #include <stdlib.h> 296ba597c5SAnurag S. Maskey #include <string.h> 306ba597c5SAnurag S. Maskey #include <sys/types.h> 316ba597c5SAnurag S. Maskey #include <libdlwlan.h> 326ba597c5SAnurag S. Maskey #include <libnvpair.h> 336ba597c5SAnurag S. Maskey 346ba597c5SAnurag S. Maskey #include "libnwam_impl.h" 356ba597c5SAnurag S. Maskey #include <libnwam_priv.h> 366ba597c5SAnurag S. Maskey #include <libnwam.h> 376ba597c5SAnurag S. Maskey 386ba597c5SAnurag S. Maskey /* 396ba597c5SAnurag S. Maskey * Internal implementation of libnwam in-memory objects and values. Objects 406ba597c5SAnurag S. Maskey * are nvlists. 416ba597c5SAnurag S. Maskey */ 426ba597c5SAnurag S. Maskey 436ba597c5SAnurag S. Maskey void 446ba597c5SAnurag S. Maskey nwam_value_free(nwam_value_t value) 456ba597c5SAnurag S. Maskey { 466ba597c5SAnurag S. Maskey uint_t i; 476ba597c5SAnurag S. Maskey 486ba597c5SAnurag S. Maskey if (value == NULL) 496ba597c5SAnurag S. Maskey return; 506ba597c5SAnurag S. Maskey 516ba597c5SAnurag S. Maskey switch (value->nwv_value_type) { 526ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_BOOLEAN: 536ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_boolean); 546ba597c5SAnurag S. Maskey break; 556ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_INT64: 566ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_int64); 576ba597c5SAnurag S. Maskey break; 586ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_UINT64: 596ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_uint64); 606ba597c5SAnurag S. Maskey break; 616ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_STRING: 626ba597c5SAnurag S. Maskey for (i = 0; i < value->nwv_value_numvalues; i++) 636ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_string[i]); 646ba597c5SAnurag S. Maskey free(value->nwv_values.nwv_string); 656ba597c5SAnurag S. Maskey break; 666ba597c5SAnurag S. Maskey } 676ba597c5SAnurag S. Maskey free(value); 686ba597c5SAnurag S. Maskey } 696ba597c5SAnurag S. Maskey 706ba597c5SAnurag S. Maskey nwam_error_t 716ba597c5SAnurag S. Maskey nwam_value_create(nwam_value_type_t value_type, void *values, uint_t numvalues, 726ba597c5SAnurag S. Maskey nwam_value_t *valuep) 736ba597c5SAnurag S. Maskey { 746ba597c5SAnurag S. Maskey nwam_value_t newvalue; 756ba597c5SAnurag S. Maskey boolean_t *values_boolean; 766ba597c5SAnurag S. Maskey int64_t *values_int64; 776ba597c5SAnurag S. Maskey uint64_t *values_uint64; 786ba597c5SAnurag S. Maskey char **values_string; 796ba597c5SAnurag S. Maskey int i, j; 806ba597c5SAnurag S. Maskey nwam_error_t err = NWAM_SUCCESS; 816ba597c5SAnurag S. Maskey 826ba597c5SAnurag S. Maskey *valuep = NULL; 836ba597c5SAnurag S. Maskey 846ba597c5SAnurag S. Maskey if ((newvalue = calloc(1, sizeof (struct nwam_value))) == NULL) 856ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 866ba597c5SAnurag S. Maskey 876ba597c5SAnurag S. Maskey newvalue->nwv_value_type = value_type; 886ba597c5SAnurag S. Maskey newvalue->nwv_value_numvalues = numvalues; 896ba597c5SAnurag S. Maskey 906ba597c5SAnurag S. Maskey switch (value_type) { 916ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_BOOLEAN: 926ba597c5SAnurag S. Maskey values_boolean = values; 936ba597c5SAnurag S. Maskey if ((newvalue->nwv_values.nwv_boolean = 946ba597c5SAnurag S. Maskey calloc(numvalues, sizeof (boolean_t))) == NULL) { 956ba597c5SAnurag S. Maskey free(newvalue); 966ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 976ba597c5SAnurag S. Maskey } 986ba597c5SAnurag S. Maskey for (i = 0; i < numvalues; i++) 996ba597c5SAnurag S. Maskey newvalue->nwv_values.nwv_boolean[i] = values_boolean[i]; 1006ba597c5SAnurag S. Maskey break; 1016ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_INT64: 1026ba597c5SAnurag S. Maskey values_int64 = values; 1036ba597c5SAnurag S. Maskey if ((newvalue->nwv_values.nwv_int64 = 1046ba597c5SAnurag S. Maskey calloc(numvalues, sizeof (int64_t))) == NULL) { 1056ba597c5SAnurag S. Maskey free(newvalue); 1066ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 1076ba597c5SAnurag S. Maskey } 1086ba597c5SAnurag S. Maskey for (i = 0; i < numvalues; i++) 1096ba597c5SAnurag S. Maskey newvalue->nwv_values.nwv_int64[i] = values_int64[i]; 1106ba597c5SAnurag S. Maskey break; 1116ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_UINT64: 1126ba597c5SAnurag S. Maskey values_uint64 = values; 1136ba597c5SAnurag S. Maskey if ((newvalue->nwv_values.nwv_uint64 = 1146ba597c5SAnurag S. Maskey calloc(numvalues, sizeof (uint64_t))) == NULL) { 1156ba597c5SAnurag S. Maskey free(newvalue); 1166ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 1176ba597c5SAnurag S. Maskey } 1186ba597c5SAnurag S. Maskey for (i = 0; i < numvalues; i++) 1196ba597c5SAnurag S. Maskey newvalue->nwv_values.nwv_uint64[i] = values_uint64[i]; 1206ba597c5SAnurag S. Maskey break; 1216ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_STRING: 1226ba597c5SAnurag S. Maskey values_string = values; 1236ba597c5SAnurag S. Maskey if ((newvalue->nwv_values.nwv_string = 1246ba597c5SAnurag S. Maskey calloc(numvalues, sizeof (char *))) == NULL) { 1256ba597c5SAnurag S. Maskey free(newvalue); 1266ba597c5SAnurag S. Maskey return (NWAM_NO_MEMORY); 1276ba597c5SAnurag S. Maskey } 1286ba597c5SAnurag S. Maskey for (i = 0; i < numvalues; i++) { 1296ba597c5SAnurag S. Maskey if (strnlen(values_string[i], NWAM_MAX_VALUE_LEN) == 1306ba597c5SAnurag S. Maskey NWAM_MAX_VALUE_LEN) { 1316ba597c5SAnurag S. Maskey err = NWAM_ENTITY_INVALID_VALUE; 1326ba597c5SAnurag S. Maskey } else if ((newvalue->nwv_values.nwv_string[i] = 1336ba597c5SAnurag S. Maskey strdup(values_string[i])) == NULL) { 1346ba597c5SAnurag S. Maskey err = NWAM_NO_MEMORY; 1356ba597c5SAnurag S. Maskey } 1366ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) { 1376ba597c5SAnurag S. Maskey for (j = 0; j < i; j++) 1386ba597c5SAnurag S. Maskey free( 1396ba597c5SAnurag S. Maskey newvalue->nwv_values.nwv_string[i]); 1406ba597c5SAnurag S. Maskey free(newvalue->nwv_values.nwv_string); 1416ba597c5SAnurag S. Maskey free(newvalue); 1426ba597c5SAnurag S. Maskey return (err); 1436ba597c5SAnurag S. Maskey } 1446ba597c5SAnurag S. Maskey } 1456ba597c5SAnurag S. Maskey break; 1466ba597c5SAnurag S. Maskey default: 1476ba597c5SAnurag S. Maskey break; 1486ba597c5SAnurag S. Maskey } 1496ba597c5SAnurag S. Maskey 1506ba597c5SAnurag S. Maskey *valuep = newvalue; 1516ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 1526ba597c5SAnurag S. Maskey } 1536ba597c5SAnurag S. Maskey 1546ba597c5SAnurag S. Maskey nwam_error_t 1556ba597c5SAnurag S. Maskey nwam_value_copy(nwam_value_t old, nwam_value_t *newp) 1566ba597c5SAnurag S. Maskey { 1576ba597c5SAnurag S. Maskey void *values; 1586ba597c5SAnurag S. Maskey 1596ba597c5SAnurag S. Maskey assert(old != NULL && newp != NULL); 1606ba597c5SAnurag S. Maskey 1616ba597c5SAnurag S. Maskey switch (old->nwv_value_type) { 1626ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_BOOLEAN: 1636ba597c5SAnurag S. Maskey values = old->nwv_values.nwv_boolean; 1646ba597c5SAnurag S. Maskey break; 1656ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_INT64: 1666ba597c5SAnurag S. Maskey values = old->nwv_values.nwv_int64; 1676ba597c5SAnurag S. Maskey break; 1686ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_UINT64: 1696ba597c5SAnurag S. Maskey values = old->nwv_values.nwv_uint64; 1706ba597c5SAnurag S. Maskey break; 1716ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_STRING: 1726ba597c5SAnurag S. Maskey values = old->nwv_values.nwv_string; 1736ba597c5SAnurag S. Maskey break; 1746ba597c5SAnurag S. Maskey default: 1756ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 1766ba597c5SAnurag S. Maskey } 1776ba597c5SAnurag S. Maskey return (nwam_value_create(old->nwv_value_type, values, 1786ba597c5SAnurag S. Maskey old->nwv_value_numvalues, newp)); 1796ba597c5SAnurag S. Maskey } 1806ba597c5SAnurag S. Maskey nwam_error_t 1816ba597c5SAnurag S. Maskey nwam_value_create_boolean_array(boolean_t *values, uint_t numvalues, 1826ba597c5SAnurag S. Maskey nwam_value_t *valuep) 1836ba597c5SAnurag S. Maskey { 1846ba597c5SAnurag S. Maskey return (nwam_value_create(NWAM_VALUE_TYPE_BOOLEAN, values, numvalues, 1856ba597c5SAnurag S. Maskey valuep)); 1866ba597c5SAnurag S. Maskey } 1876ba597c5SAnurag S. Maskey 1886ba597c5SAnurag S. Maskey nwam_error_t 1896ba597c5SAnurag S. Maskey nwam_value_create_boolean(boolean_t value, nwam_value_t *valuep) 1906ba597c5SAnurag S. Maskey { 1916ba597c5SAnurag S. Maskey return (nwam_value_create_boolean_array(&value, 1, valuep)); 1926ba597c5SAnurag S. Maskey } 1936ba597c5SAnurag S. Maskey 1946ba597c5SAnurag S. Maskey nwam_error_t 1956ba597c5SAnurag S. Maskey nwam_value_create_int64_array(int64_t *values, uint_t numvalues, 1966ba597c5SAnurag S. Maskey nwam_value_t *valuep) 1976ba597c5SAnurag S. Maskey { 1986ba597c5SAnurag S. Maskey return (nwam_value_create(NWAM_VALUE_TYPE_INT64, values, numvalues, 1996ba597c5SAnurag S. Maskey valuep)); 2006ba597c5SAnurag S. Maskey } 2016ba597c5SAnurag S. Maskey 2026ba597c5SAnurag S. Maskey nwam_error_t 2036ba597c5SAnurag S. Maskey nwam_value_create_int64(int64_t value, nwam_value_t *valuep) 2046ba597c5SAnurag S. Maskey { 2056ba597c5SAnurag S. Maskey return (nwam_value_create_int64_array(&value, 1, valuep)); 2066ba597c5SAnurag S. Maskey } 2076ba597c5SAnurag S. Maskey 2086ba597c5SAnurag S. Maskey nwam_error_t 2096ba597c5SAnurag S. Maskey nwam_value_create_uint64_array(uint64_t *values, uint_t numvalues, 2106ba597c5SAnurag S. Maskey nwam_value_t *valuep) 2116ba597c5SAnurag S. Maskey { 2126ba597c5SAnurag S. Maskey return (nwam_value_create(NWAM_VALUE_TYPE_UINT64, values, numvalues, 2136ba597c5SAnurag S. Maskey valuep)); 2146ba597c5SAnurag S. Maskey } 2156ba597c5SAnurag S. Maskey 2166ba597c5SAnurag S. Maskey nwam_error_t 2176ba597c5SAnurag S. Maskey nwam_value_create_uint64(uint64_t value, nwam_value_t *valuep) 2186ba597c5SAnurag S. Maskey { 2196ba597c5SAnurag S. Maskey return (nwam_value_create_uint64_array(&value, 1, valuep)); 2206ba597c5SAnurag S. Maskey } 2216ba597c5SAnurag S. Maskey 2226ba597c5SAnurag S. Maskey nwam_error_t 2236ba597c5SAnurag S. Maskey nwam_value_create_string_array(char **values, uint_t numvalues, 2246ba597c5SAnurag S. Maskey nwam_value_t *valuep) 2256ba597c5SAnurag S. Maskey { 2266ba597c5SAnurag S. Maskey return (nwam_value_create(NWAM_VALUE_TYPE_STRING, values, numvalues, 2276ba597c5SAnurag S. Maskey valuep)); 2286ba597c5SAnurag S. Maskey } 2296ba597c5SAnurag S. Maskey 2306ba597c5SAnurag S. Maskey nwam_error_t 2316ba597c5SAnurag S. Maskey nwam_value_create_string(char *value, nwam_value_t *valuep) 2326ba597c5SAnurag S. Maskey { 2336ba597c5SAnurag S. Maskey return (nwam_value_create_string_array(&value, 1, valuep)); 2346ba597c5SAnurag S. Maskey } 2356ba597c5SAnurag S. Maskey 2366ba597c5SAnurag S. Maskey nwam_error_t 2376ba597c5SAnurag S. Maskey nwam_value_get_boolean_array(nwam_value_t value, boolean_t **valuesp, 2386ba597c5SAnurag S. Maskey uint_t *numvaluesp) 2396ba597c5SAnurag S. Maskey { 2406ba597c5SAnurag S. Maskey assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 2416ba597c5SAnurag S. Maskey 2426ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 2436ba597c5SAnurag S. Maskey *valuesp = value->nwv_values.nwv_boolean; 2446ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 2456ba597c5SAnurag S. Maskey } 2466ba597c5SAnurag S. Maskey 2476ba597c5SAnurag S. Maskey nwam_error_t 2486ba597c5SAnurag S. Maskey nwam_value_get_boolean(nwam_value_t value, boolean_t *valuep) 2496ba597c5SAnurag S. Maskey { 2506ba597c5SAnurag S. Maskey uint_t numvalues; 2516ba597c5SAnurag S. Maskey boolean_t *myvaluesp; 2526ba597c5SAnurag S. Maskey nwam_error_t err; 2536ba597c5SAnurag S. Maskey 2546ba597c5SAnurag S. Maskey err = nwam_value_get_boolean_array(value, &myvaluesp, &numvalues); 2556ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) 2566ba597c5SAnurag S. Maskey return (err); 2576ba597c5SAnurag S. Maskey if (numvalues != 1) 2586ba597c5SAnurag S. Maskey return (NWAM_ENTITY_MULTIPLE_VALUES); 2596ba597c5SAnurag S. Maskey 2606ba597c5SAnurag S. Maskey *valuep = myvaluesp[0]; 2616ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 2626ba597c5SAnurag S. Maskey } 2636ba597c5SAnurag S. Maskey 2646ba597c5SAnurag S. Maskey nwam_error_t 2656ba597c5SAnurag S. Maskey nwam_value_get_int64_array(nwam_value_t value, int64_t **valuesp, 2666ba597c5SAnurag S. Maskey uint_t *numvaluesp) 2676ba597c5SAnurag S. Maskey { 2686ba597c5SAnurag S. Maskey assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 2696ba597c5SAnurag S. Maskey 2706ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 2716ba597c5SAnurag S. Maskey *valuesp = value->nwv_values.nwv_int64; 2726ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 2736ba597c5SAnurag S. Maskey } 2746ba597c5SAnurag S. Maskey 2756ba597c5SAnurag S. Maskey nwam_error_t 2766ba597c5SAnurag S. Maskey nwam_value_get_int64(nwam_value_t value, int64_t *valuep) 2776ba597c5SAnurag S. Maskey { 2786ba597c5SAnurag S. Maskey uint_t numvalues; 2796ba597c5SAnurag S. Maskey int64_t *myvaluesp; 2806ba597c5SAnurag S. Maskey nwam_error_t err; 2816ba597c5SAnurag S. Maskey 2826ba597c5SAnurag S. Maskey err = nwam_value_get_int64_array(value, &myvaluesp, &numvalues); 2836ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) 2846ba597c5SAnurag S. Maskey return (err); 2856ba597c5SAnurag S. Maskey if (numvalues != 1) 2866ba597c5SAnurag S. Maskey return (NWAM_ENTITY_MULTIPLE_VALUES); 2876ba597c5SAnurag S. Maskey 2886ba597c5SAnurag S. Maskey *valuep = myvaluesp[0]; 2896ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 2906ba597c5SAnurag S. Maskey } 2916ba597c5SAnurag S. Maskey 2926ba597c5SAnurag S. Maskey nwam_error_t 2936ba597c5SAnurag S. Maskey nwam_value_get_uint64_array(nwam_value_t value, uint64_t **valuesp, 2946ba597c5SAnurag S. Maskey uint_t *numvaluesp) 2956ba597c5SAnurag S. Maskey { 2966ba597c5SAnurag S. Maskey assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 2976ba597c5SAnurag S. Maskey 2986ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 2996ba597c5SAnurag S. Maskey *valuesp = value->nwv_values.nwv_uint64; 3006ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3016ba597c5SAnurag S. Maskey } 3026ba597c5SAnurag S. Maskey 3036ba597c5SAnurag S. Maskey nwam_error_t 3046ba597c5SAnurag S. Maskey nwam_value_get_uint64(nwam_value_t value, uint64_t *valuep) 3056ba597c5SAnurag S. Maskey { 3066ba597c5SAnurag S. Maskey uint_t numvalues; 3076ba597c5SAnurag S. Maskey uint64_t *myvaluesp; 3086ba597c5SAnurag S. Maskey nwam_error_t err; 3096ba597c5SAnurag S. Maskey 3106ba597c5SAnurag S. Maskey err = nwam_value_get_uint64_array(value, &myvaluesp, &numvalues); 3116ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) 3126ba597c5SAnurag S. Maskey return (err); 3136ba597c5SAnurag S. Maskey if (numvalues != 1) 3146ba597c5SAnurag S. Maskey return (NWAM_ENTITY_MULTIPLE_VALUES); 3156ba597c5SAnurag S. Maskey 3166ba597c5SAnurag S. Maskey *valuep = myvaluesp[0]; 3176ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3186ba597c5SAnurag S. Maskey } 3196ba597c5SAnurag S. Maskey 3206ba597c5SAnurag S. Maskey nwam_error_t 3216ba597c5SAnurag S. Maskey nwam_value_get_string_array(nwam_value_t value, char ***valuesp, 3226ba597c5SAnurag S. Maskey uint_t *numvaluesp) 3236ba597c5SAnurag S. Maskey { 3246ba597c5SAnurag S. Maskey assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 3256ba597c5SAnurag S. Maskey 3266ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 3276ba597c5SAnurag S. Maskey *valuesp = value->nwv_values.nwv_string; 3286ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3296ba597c5SAnurag S. Maskey } 3306ba597c5SAnurag S. Maskey 3316ba597c5SAnurag S. Maskey nwam_error_t 3326ba597c5SAnurag S. Maskey nwam_value_get_string(nwam_value_t value, char **valuep) 3336ba597c5SAnurag S. Maskey { 3346ba597c5SAnurag S. Maskey uint_t numvalues; 3356ba597c5SAnurag S. Maskey char **myvaluesp; 3366ba597c5SAnurag S. Maskey nwam_error_t err; 3376ba597c5SAnurag S. Maskey 3386ba597c5SAnurag S. Maskey err = nwam_value_get_string_array(value, &myvaluesp, &numvalues); 3396ba597c5SAnurag S. Maskey if (err != NWAM_SUCCESS) 3406ba597c5SAnurag S. Maskey return (err); 3416ba597c5SAnurag S. Maskey if (numvalues != 1) 3426ba597c5SAnurag S. Maskey return (NWAM_ENTITY_MULTIPLE_VALUES); 3436ba597c5SAnurag S. Maskey 3446ba597c5SAnurag S. Maskey *valuep = myvaluesp[0]; 3456ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3466ba597c5SAnurag S. Maskey } 3476ba597c5SAnurag S. Maskey 3486ba597c5SAnurag S. Maskey nwam_error_t 3496ba597c5SAnurag S. Maskey nwam_value_get_type(nwam_value_t value, nwam_value_type_t *typep) 3506ba597c5SAnurag S. Maskey { 3516ba597c5SAnurag S. Maskey *typep = value->nwv_value_type; 3526ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3536ba597c5SAnurag S. Maskey } 3546ba597c5SAnurag S. Maskey 3556ba597c5SAnurag S. Maskey nwam_error_t 3566ba597c5SAnurag S. Maskey nwam_value_get_numvalues(nwam_value_t value, uint_t *numvaluesp) 3576ba597c5SAnurag S. Maskey { 3586ba597c5SAnurag S. Maskey *numvaluesp = value->nwv_value_numvalues; 3596ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3606ba597c5SAnurag S. Maskey } 3616ba597c5SAnurag S. Maskey 3626ba597c5SAnurag S. Maskey /* 3636ba597c5SAnurag S. Maskey * Generic object data functions. We hide nvlist implementation 3646ba597c5SAnurag S. Maskey * from NCP, ENM and location implementations. 3656ba597c5SAnurag S. Maskey */ 3666ba597c5SAnurag S. Maskey nwam_error_t 3676ba597c5SAnurag S. Maskey nwam_alloc_object_list(void *list) 3686ba597c5SAnurag S. Maskey { 3696ba597c5SAnurag S. Maskey int nverr; 3706ba597c5SAnurag S. Maskey 3716ba597c5SAnurag S. Maskey assert(list != NULL); 3726ba597c5SAnurag S. Maskey 3736ba597c5SAnurag S. Maskey if ((nverr = nvlist_alloc((nvlist_t **)list, NV_UNIQUE_NAME, 0)) != 0) 3746ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 3756ba597c5SAnurag S. Maskey 3766ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3776ba597c5SAnurag S. Maskey } 3786ba597c5SAnurag S. Maskey 3796ba597c5SAnurag S. Maskey void 3806ba597c5SAnurag S. Maskey nwam_free_object_list(void *list) 3816ba597c5SAnurag S. Maskey { 3826ba597c5SAnurag S. Maskey if (list != NULL) 3836ba597c5SAnurag S. Maskey nvlist_free(list); 3846ba597c5SAnurag S. Maskey } 3856ba597c5SAnurag S. Maskey 3866ba597c5SAnurag S. Maskey nwam_error_t 3876ba597c5SAnurag S. Maskey nwam_dup_object_list(void *oldlist, void *newlist) 3886ba597c5SAnurag S. Maskey { 3896ba597c5SAnurag S. Maskey int nverr; 3906ba597c5SAnurag S. Maskey 3916ba597c5SAnurag S. Maskey assert(oldlist != NULL && newlist != NULL); 3926ba597c5SAnurag S. Maskey 3936ba597c5SAnurag S. Maskey if ((nverr = nvlist_dup(oldlist, newlist, 0)) != 0) 3946ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 3956ba597c5SAnurag S. Maskey 3966ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 3976ba597c5SAnurag S. Maskey } 3986ba597c5SAnurag S. Maskey 3996ba597c5SAnurag S. Maskey /* Add child object list to parent object list using property name childname */ 4006ba597c5SAnurag S. Maskey nwam_error_t 4016ba597c5SAnurag S. Maskey nwam_object_list_add_object_list(void *parentlist, char *childname, 4026ba597c5SAnurag S. Maskey void *childlist) 4036ba597c5SAnurag S. Maskey { 4046ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nvlist_add_nvlist(parentlist, 4056ba597c5SAnurag S. Maskey childname, childlist))); 4066ba597c5SAnurag S. Maskey } 4076ba597c5SAnurag S. Maskey 4086ba597c5SAnurag S. Maskey /* Remove object list from parent object list */ 4096ba597c5SAnurag S. Maskey nwam_error_t 4106ba597c5SAnurag S. Maskey nwam_object_list_remove_object_list(void *parentlist, char *childname) 4116ba597c5SAnurag S. Maskey { 4126ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nvlist_remove_all(parentlist, 4136ba597c5SAnurag S. Maskey childname))); 4146ba597c5SAnurag S. Maskey } 4156ba597c5SAnurag S. Maskey 4166ba597c5SAnurag S. Maskey /* 4176ba597c5SAnurag S. Maskey * Get next object list (nvlist) after lastname. Used to walk NCUs, ENMs and 4186ba597c5SAnurag S. Maskey * locations, each of which is internally represented as an nvlist. 4196ba597c5SAnurag S. Maskey */ 4206ba597c5SAnurag S. Maskey nwam_error_t 4216ba597c5SAnurag S. Maskey nwam_next_object_list(void *parentlist, char *lastname, char **childnamep, 4226ba597c5SAnurag S. Maskey void *childlistp) 4236ba597c5SAnurag S. Maskey { 4246ba597c5SAnurag S. Maskey nvpair_t *last = NULL, *next; 4256ba597c5SAnurag S. Maskey int nverr; 4266ba597c5SAnurag S. Maskey 4276ba597c5SAnurag S. Maskey if (lastname != NULL) { 4286ba597c5SAnurag S. Maskey if ((nverr = nvlist_lookup_nvpair(parentlist, lastname, &last)) 4296ba597c5SAnurag S. Maskey != 0) 4306ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 4316ba597c5SAnurag S. Maskey } 4326ba597c5SAnurag S. Maskey if ((next = nvlist_next_nvpair(parentlist, last)) == NULL) 4336ba597c5SAnurag S. Maskey return (NWAM_LIST_END); 4346ba597c5SAnurag S. Maskey 4356ba597c5SAnurag S. Maskey *childnamep = nvpair_name(next); 4366ba597c5SAnurag S. Maskey 4376ba597c5SAnurag S. Maskey if (nvpair_type(next) != DATA_TYPE_NVLIST) 4386ba597c5SAnurag S. Maskey return (NWAM_ERROR_INTERNAL); 4396ba597c5SAnurag S. Maskey 4406ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_nvlist(next, childlistp)) != NWAM_SUCCESS) 4416ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 4426ba597c5SAnurag S. Maskey 4436ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 4446ba597c5SAnurag S. Maskey } 4456ba597c5SAnurag S. Maskey 4466ba597c5SAnurag S. Maskey /* 4476ba597c5SAnurag S. Maskey * Pack nvlist into contiguous memory. If packed_listp is NULL, we just 4486ba597c5SAnurag S. Maskey * return the size of the memory needed to do so. 4496ba597c5SAnurag S. Maskey */ 4506ba597c5SAnurag S. Maskey nwam_error_t 4516ba597c5SAnurag S. Maskey nwam_pack_object_list(void *list, char **packed_listp, size_t *packed_sizep) 4526ba597c5SAnurag S. Maskey { 4536ba597c5SAnurag S. Maskey int nverr; 4546ba597c5SAnurag S. Maskey 4556ba597c5SAnurag S. Maskey assert(list != NULL && packed_sizep != NULL); 4566ba597c5SAnurag S. Maskey 4576ba597c5SAnurag S. Maskey if (packed_listp == NULL) { 4586ba597c5SAnurag S. Maskey nverr = nvlist_size(list, packed_sizep, NV_ENCODE_XDR); 4596ba597c5SAnurag S. Maskey } else { 4606ba597c5SAnurag S. Maskey nverr = nvlist_pack(list, packed_listp, packed_sizep, 4616ba597c5SAnurag S. Maskey NV_ENCODE_XDR, 0); 4626ba597c5SAnurag S. Maskey } 4636ba597c5SAnurag S. Maskey 4646ba597c5SAnurag S. Maskey if (nverr != 0) 4656ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 4666ba597c5SAnurag S. Maskey 4676ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 4686ba597c5SAnurag S. Maskey } 4696ba597c5SAnurag S. Maskey 4706ba597c5SAnurag S. Maskey nwam_error_t 4716ba597c5SAnurag S. Maskey nwam_unpack_object_list(char *packed_list, size_t packed_size, 4726ba597c5SAnurag S. Maskey void *list) 4736ba597c5SAnurag S. Maskey { 4746ba597c5SAnurag S. Maskey int nverr; 4756ba597c5SAnurag S. Maskey 4766ba597c5SAnurag S. Maskey assert(packed_list != NULL && list != NULL); 4776ba597c5SAnurag S. Maskey 4786ba597c5SAnurag S. Maskey *((nvlist_t **)list) = NULL; 4796ba597c5SAnurag S. Maskey 4806ba597c5SAnurag S. Maskey nverr = nvlist_unpack(packed_list, packed_size, (nvlist_t **)list, 0); 4816ba597c5SAnurag S. Maskey 4826ba597c5SAnurag S. Maskey if (nverr != 0) 4836ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 4846ba597c5SAnurag S. Maskey 4856ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 4866ba597c5SAnurag S. Maskey } 4876ba597c5SAnurag S. Maskey 4886ba597c5SAnurag S. Maskey /* 4896ba597c5SAnurag S. Maskey * Functions to walk, set and get properties in nvlist, translating 4906ba597c5SAnurag S. Maskey * between nwam_value_t and nvlist/nvpair representations. 4916ba597c5SAnurag S. Maskey */ 4926ba597c5SAnurag S. Maskey nwam_error_t 4936ba597c5SAnurag S. Maskey nwam_next_object_prop(void *list, char *lastname, char **namep, 4946ba597c5SAnurag S. Maskey nwam_value_t *valuep) 4956ba597c5SAnurag S. Maskey { 4966ba597c5SAnurag S. Maskey nvpair_t *last = NULL, *next; 4976ba597c5SAnurag S. Maskey int nverr; 4986ba597c5SAnurag S. Maskey 4996ba597c5SAnurag S. Maskey if (lastname != NULL) { 5006ba597c5SAnurag S. Maskey if ((nverr = nvlist_lookup_nvpair(list, lastname, &last)) != 0) 5016ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5026ba597c5SAnurag S. Maskey } 5036ba597c5SAnurag S. Maskey if ((next = nvlist_next_nvpair(list, last)) == NULL) 5046ba597c5SAnurag S. Maskey return (NWAM_LIST_END); 5056ba597c5SAnurag S. Maskey 5066ba597c5SAnurag S. Maskey *namep = nvpair_name(next); 5076ba597c5SAnurag S. Maskey 5086ba597c5SAnurag S. Maskey return (nwam_get_prop_value(list, (const char *)*namep, valuep)); 5096ba597c5SAnurag S. Maskey } 5106ba597c5SAnurag S. Maskey 5116ba597c5SAnurag S. Maskey nwam_error_t 5126ba597c5SAnurag S. Maskey nwam_get_prop_value(void *list, const char *name, nwam_value_t *valuep) 5136ba597c5SAnurag S. Maskey { 5146ba597c5SAnurag S. Maskey nvpair_t *prop; 5156ba597c5SAnurag S. Maskey nwam_error_t err; 5166ba597c5SAnurag S. Maskey int nverr; 5176ba597c5SAnurag S. Maskey boolean_t *valbool; 5186ba597c5SAnurag S. Maskey int64_t *valint64; 5196ba597c5SAnurag S. Maskey uint64_t *valuint64; 5206ba597c5SAnurag S. Maskey char **valstr; 5216ba597c5SAnurag S. Maskey uint_t numvalues; 5226ba597c5SAnurag S. Maskey 5236ba597c5SAnurag S. Maskey assert(valuep != NULL); 5246ba597c5SAnurag S. Maskey 5256ba597c5SAnurag S. Maskey *valuep = NULL; 5266ba597c5SAnurag S. Maskey 5276ba597c5SAnurag S. Maskey if ((nverr = nvlist_lookup_nvpair(list, name, &prop)) != 0) { 5286ba597c5SAnurag S. Maskey /* convert EINVAL to NOT_FOUND */ 5296ba597c5SAnurag S. Maskey if (nverr == EINVAL) 5306ba597c5SAnurag S. Maskey return (NWAM_ENTITY_NOT_FOUND); 5316ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5326ba597c5SAnurag S. Maskey } 5336ba597c5SAnurag S. Maskey 5346ba597c5SAnurag S. Maskey switch (nvpair_type(prop)) { 5356ba597c5SAnurag S. Maskey case DATA_TYPE_BOOLEAN_ARRAY: 5366ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_boolean_array(prop, 5376ba597c5SAnurag S. Maskey &valbool, &numvalues)) != 0) 5386ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5396ba597c5SAnurag S. Maskey if ((err = nwam_value_create_boolean_array(valbool, numvalues, 5406ba597c5SAnurag S. Maskey valuep)) != NWAM_SUCCESS) 5416ba597c5SAnurag S. Maskey return (err); 5426ba597c5SAnurag S. Maskey break; 5436ba597c5SAnurag S. Maskey case DATA_TYPE_INT64_ARRAY: 5446ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_int64_array(prop, 5456ba597c5SAnurag S. Maskey &valint64, &numvalues)) != 0) 5466ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5476ba597c5SAnurag S. Maskey if ((err = nwam_value_create_int64_array(valint64, numvalues, 5486ba597c5SAnurag S. Maskey valuep)) != NWAM_SUCCESS) 5496ba597c5SAnurag S. Maskey return (err); 5506ba597c5SAnurag S. Maskey break; 5516ba597c5SAnurag S. Maskey case DATA_TYPE_UINT64_ARRAY: 5526ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_uint64_array(prop, 5536ba597c5SAnurag S. Maskey &valuint64, &numvalues)) != 0) 5546ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5556ba597c5SAnurag S. Maskey if ((err = nwam_value_create_uint64_array(valuint64, numvalues, 5566ba597c5SAnurag S. Maskey valuep)) != NWAM_SUCCESS) 5576ba597c5SAnurag S. Maskey return (err); 5586ba597c5SAnurag S. Maskey break; 5596ba597c5SAnurag S. Maskey case DATA_TYPE_STRING_ARRAY: 5606ba597c5SAnurag S. Maskey if ((nverr = nvpair_value_string_array(prop, 5616ba597c5SAnurag S. Maskey &valstr, &numvalues)) != 0) 5626ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5636ba597c5SAnurag S. Maskey if ((err = nwam_value_create_string_array(valstr, numvalues, 5646ba597c5SAnurag S. Maskey valuep)) != NWAM_SUCCESS) 5656ba597c5SAnurag S. Maskey return (err); 5666ba597c5SAnurag S. Maskey break; 5676ba597c5SAnurag S. Maskey default: 5686ba597c5SAnurag S. Maskey /* Should not happen */ 5696ba597c5SAnurag S. Maskey return (NWAM_ERROR_INTERNAL); 5706ba597c5SAnurag S. Maskey } 5716ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 5726ba597c5SAnurag S. Maskey } 5736ba597c5SAnurag S. Maskey 5746ba597c5SAnurag S. Maskey nwam_error_t 5756ba597c5SAnurag S. Maskey nwam_delete_prop(void *list, const char *name) 5766ba597c5SAnurag S. Maskey { 5776ba597c5SAnurag S. Maskey int nverr; 5786ba597c5SAnurag S. Maskey 5796ba597c5SAnurag S. Maskey if ((nverr = nvlist_remove_all(list, name)) != 0) 5806ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 5816ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 5826ba597c5SAnurag S. Maskey } 5836ba597c5SAnurag S. Maskey 5846ba597c5SAnurag S. Maskey nwam_error_t 5856ba597c5SAnurag S. Maskey nwam_set_prop_value(void *list, const char *propname, nwam_value_t value) 5866ba597c5SAnurag S. Maskey { 5876ba597c5SAnurag S. Maskey int nverr; 5886ba597c5SAnurag S. Maskey nwam_error_t err; 5896ba597c5SAnurag S. Maskey nwam_value_type_t type; 5906ba597c5SAnurag S. Maskey uint_t numvalues; 5916ba597c5SAnurag S. Maskey boolean_t *valbool; 5926ba597c5SAnurag S. Maskey int64_t *valint64; 5936ba597c5SAnurag S. Maskey uint64_t *valuint64; 5946ba597c5SAnurag S. Maskey char **valstr; 5956ba597c5SAnurag S. Maskey 5966ba597c5SAnurag S. Maskey assert(list != NULL && value != NULL); 5976ba597c5SAnurag S. Maskey 5986ba597c5SAnurag S. Maskey if ((err = nwam_value_get_type(value, &type)) != NWAM_SUCCESS) 5996ba597c5SAnurag S. Maskey return (err); 6006ba597c5SAnurag S. Maskey 6016ba597c5SAnurag S. Maskey switch (type) { 6026ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_BOOLEAN: 6036ba597c5SAnurag S. Maskey if ((err = nwam_value_get_boolean_array(value, &valbool, 6046ba597c5SAnurag S. Maskey &numvalues)) != NWAM_SUCCESS) 6056ba597c5SAnurag S. Maskey return (err); 6066ba597c5SAnurag S. Maskey if ((nverr = nvlist_add_boolean_array(list, propname, 6076ba597c5SAnurag S. Maskey valbool, numvalues)) != 0) 6086ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 6096ba597c5SAnurag S. Maskey break; 6106ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_INT64: 6116ba597c5SAnurag S. Maskey if ((err = nwam_value_get_int64_array(value, &valint64, 6126ba597c5SAnurag S. Maskey &numvalues)) != NWAM_SUCCESS) 6136ba597c5SAnurag S. Maskey return (err); 6146ba597c5SAnurag S. Maskey if ((nverr = nvlist_add_int64_array(list, propname, 6156ba597c5SAnurag S. Maskey valint64, numvalues)) != 0) 6166ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 6176ba597c5SAnurag S. Maskey break; 6186ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_UINT64: 6196ba597c5SAnurag S. Maskey if ((err = nwam_value_get_uint64_array(value, &valuint64, 6206ba597c5SAnurag S. Maskey &numvalues)) != NWAM_SUCCESS) 6216ba597c5SAnurag S. Maskey return (err); 6226ba597c5SAnurag S. Maskey if ((nverr = nvlist_add_uint64_array(list, propname, 6236ba597c5SAnurag S. Maskey valuint64, numvalues)) != 0) 6246ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 6256ba597c5SAnurag S. Maskey break; 6266ba597c5SAnurag S. Maskey case NWAM_VALUE_TYPE_STRING: 6276ba597c5SAnurag S. Maskey if ((err = nwam_value_get_string_array(value, &valstr, 6286ba597c5SAnurag S. Maskey &numvalues)) != NWAM_SUCCESS) 6296ba597c5SAnurag S. Maskey return (err); 6306ba597c5SAnurag S. Maskey if ((nverr = nvlist_add_string_array(list, propname, 6316ba597c5SAnurag S. Maskey valstr, numvalues)) != 0) 6326ba597c5SAnurag S. Maskey return (nwam_errno_to_nwam_error(nverr)); 6336ba597c5SAnurag S. Maskey break; 6346ba597c5SAnurag S. Maskey default: 6356ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 6366ba597c5SAnurag S. Maskey } 6376ba597c5SAnurag S. Maskey 6386ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 6396ba597c5SAnurag S. Maskey } 6406ba597c5SAnurag S. Maskey 6416ba597c5SAnurag S. Maskey /* Map uint64 values to their string counterparts */ 6426ba597c5SAnurag S. Maskey 6436ba597c5SAnurag S. Maskey struct nwam_value_entry { 6446ba597c5SAnurag S. Maskey const char *value_string; 6456ba597c5SAnurag S. Maskey uint64_t value; 6466ba597c5SAnurag S. Maskey }; 6476ba597c5SAnurag S. Maskey 6486ba597c5SAnurag S. Maskey struct nwam_value_entry prop_activation_mode_value_entries[] = 6496ba597c5SAnurag S. Maskey { 6506ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_MANUAL_STRING, NWAM_ACTIVATION_MODE_MANUAL }, 6516ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_SYSTEM_STRING, NWAM_ACTIVATION_MODE_SYSTEM }, 6526ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_CONDITIONAL_ANY_STRING, 6536ba597c5SAnurag S. Maskey NWAM_ACTIVATION_MODE_CONDITIONAL_ANY }, 6546ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_CONDITIONAL_ALL_STRING, 6556ba597c5SAnurag S. Maskey NWAM_ACTIVATION_MODE_CONDITIONAL_ALL }, 6566ba597c5SAnurag S. Maskey { NWAM_ACTIVATION_MODE_PRIORITIZED_STRING, 6576ba597c5SAnurag S. Maskey NWAM_ACTIVATION_MODE_PRIORITIZED }, 6586ba597c5SAnurag S. Maskey { NULL, 0 } 6596ba597c5SAnurag S. Maskey }; 6606ba597c5SAnurag S. Maskey 6616ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_type_entries[] = 6626ba597c5SAnurag S. Maskey { 6636ba597c5SAnurag S. Maskey { NWAM_NCU_TYPE_LINK_STRING, NWAM_NCU_TYPE_LINK }, 6646ba597c5SAnurag S. Maskey { NWAM_NCU_TYPE_INTERFACE_STRING, NWAM_NCU_TYPE_INTERFACE }, 6656ba597c5SAnurag S. Maskey { NULL, 0 } 6666ba597c5SAnurag S. Maskey }; 6676ba597c5SAnurag S. Maskey 6686ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_class_entries[] = 6696ba597c5SAnurag S. Maskey { 6706ba597c5SAnurag S. Maskey { NWAM_NCU_CLASS_PHYS_STRING, NWAM_NCU_CLASS_PHYS }, 6716ba597c5SAnurag S. Maskey { NWAM_NCU_CLASS_IP_STRING, NWAM_NCU_CLASS_IP }, 6726ba597c5SAnurag S. Maskey { NULL, 0 } 6736ba597c5SAnurag S. Maskey }; 6746ba597c5SAnurag S. Maskey 6756ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ip_version_entries[] = 6766ba597c5SAnurag S. Maskey { 6776ba597c5SAnurag S. Maskey { NWAM_IP_VERSION_IPV4_STRING, IPV4_VERSION }, 6786ba597c5SAnurag S. Maskey { NWAM_IP_VERSION_IPV6_STRING, IPV6_VERSION }, 6796ba597c5SAnurag S. Maskey { NULL, 0 } 6806ba597c5SAnurag S. Maskey }; 6816ba597c5SAnurag S. Maskey 6826ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ipv4_addrsrc_entries[] = 6836ba597c5SAnurag S. Maskey { 6846ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP }, 6856ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC }, 6866ba597c5SAnurag S. Maskey { NULL, 0 } 6876ba597c5SAnurag S. Maskey }; 6886ba597c5SAnurag S. Maskey 6896ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ipv6_addrsrc_entries[] = 6906ba597c5SAnurag S. Maskey { 6916ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP }, 6926ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC }, 6936ba597c5SAnurag S. Maskey { NWAM_ADDRSRC_AUTOCONF_STRING, NWAM_ADDRSRC_AUTOCONF }, 6946ba597c5SAnurag S. Maskey { NULL, 0 } 6956ba597c5SAnurag S. Maskey }; 6966ba597c5SAnurag S. Maskey 6976ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_priority_mode_entries[] = 6986ba597c5SAnurag S. Maskey { 6996ba597c5SAnurag S. Maskey { NWAM_PRIORITY_MODE_EXCLUSIVE_STRING, NWAM_PRIORITY_MODE_EXCLUSIVE }, 7006ba597c5SAnurag S. Maskey { NWAM_PRIORITY_MODE_SHARED_STRING, NWAM_PRIORITY_MODE_SHARED }, 7016ba597c5SAnurag S. Maskey { NWAM_PRIORITY_MODE_ALL_STRING, NWAM_PRIORITY_MODE_ALL }, 7026ba597c5SAnurag S. Maskey { NULL, 0 } 7036ba597c5SAnurag S. Maskey }; 7046ba597c5SAnurag S. Maskey 7056ba597c5SAnurag S. Maskey struct nwam_value_entry loc_prop_nameservices_entries[] = 7066ba597c5SAnurag S. Maskey { 7076ba597c5SAnurag S. Maskey { NWAM_NAMESERVICES_DNS_STRING, NWAM_NAMESERVICES_DNS }, 7086ba597c5SAnurag S. Maskey { NWAM_NAMESERVICES_FILES_STRING, NWAM_NAMESERVICES_FILES }, 7096ba597c5SAnurag S. Maskey { NWAM_NAMESERVICES_NIS_STRING, NWAM_NAMESERVICES_NIS }, 7106ba597c5SAnurag S. Maskey { NWAM_NAMESERVICES_LDAP_STRING, NWAM_NAMESERVICES_LDAP }, 7116ba597c5SAnurag S. Maskey { NULL, 0 } 7126ba597c5SAnurag S. Maskey }; 7136ba597c5SAnurag S. Maskey 7146ba597c5SAnurag S. Maskey struct nwam_value_entry loc_prop_nameservice_configsrc_entries[] = 7156ba597c5SAnurag S. Maskey { 7166ba597c5SAnurag S. Maskey { NWAM_CONFIGSRC_MANUAL_STRING, NWAM_CONFIGSRC_MANUAL }, 7176ba597c5SAnurag S. Maskey { NWAM_CONFIGSRC_DHCP_STRING, NWAM_CONFIGSRC_DHCP }, 7186ba597c5SAnurag S. Maskey { NULL, 0 } 7196ba597c5SAnurag S. Maskey }; 7206ba597c5SAnurag S. Maskey 7216ba597c5SAnurag S. Maskey struct nwam_value_entry known_wlan_prop_security_mode_entries[] = 7226ba597c5SAnurag S. Maskey { 7236ba597c5SAnurag S. Maskey { "none", DLADM_WLAN_SECMODE_NONE }, 7246ba597c5SAnurag S. Maskey { "wep", DLADM_WLAN_SECMODE_WEP }, 7256ba597c5SAnurag S. Maskey { "wpa", DLADM_WLAN_SECMODE_WPA }, 7266ba597c5SAnurag S. Maskey { NULL, 0 } 7276ba597c5SAnurag S. Maskey }; 7286ba597c5SAnurag S. Maskey 7296ba597c5SAnurag S. Maskey struct nwam_prop_value_entry { 7306ba597c5SAnurag S. Maskey const char *prop_name; 7316ba597c5SAnurag S. Maskey struct nwam_value_entry *value_entries; 7326ba597c5SAnurag S. Maskey } prop_value_entry_table[] = 7336ba597c5SAnurag S. Maskey { 7346ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 7356ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_TYPE, ncu_prop_type_entries }, 7366ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_CLASS, ncu_prop_class_entries }, 7376ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_IP_VERSION, ncu_prop_ip_version_entries }, 7386ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_IPV4_ADDRSRC, ncu_prop_ipv4_addrsrc_entries }, 7396ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_IPV6_ADDRSRC, ncu_prop_ipv6_addrsrc_entries }, 7406ba597c5SAnurag S. Maskey { NWAM_NCU_PROP_PRIORITY_MODE, ncu_prop_priority_mode_entries }, 7416ba597c5SAnurag S. Maskey { NWAM_ENM_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 7426ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 7436ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_NAMESERVICES, loc_prop_nameservices_entries }, 7446ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, 7456ba597c5SAnurag S. Maskey loc_prop_nameservice_configsrc_entries }, 7466ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, 7476ba597c5SAnurag S. Maskey loc_prop_nameservice_configsrc_entries }, 7486ba597c5SAnurag S. Maskey { NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, 7496ba597c5SAnurag S. Maskey loc_prop_nameservice_configsrc_entries }, 7506ba597c5SAnurag S. Maskey { NWAM_KNOWN_WLAN_PROP_SECURITY_MODE, 7516ba597c5SAnurag S. Maskey known_wlan_prop_security_mode_entries }, 7526ba597c5SAnurag S. Maskey { NULL, NULL } 7536ba597c5SAnurag S. Maskey }; 7546ba597c5SAnurag S. Maskey 7556ba597c5SAnurag S. Maskey /* 7566ba597c5SAnurag S. Maskey * Convert uint64 values for property propname into a string representing 7576ba597c5SAnurag S. Maskey * that value. Used by enum values. 7586ba597c5SAnurag S. Maskey */ 7596ba597c5SAnurag S. Maskey nwam_error_t 7606ba597c5SAnurag S. Maskey nwam_uint64_get_value_string(const char *propname, uint64_t val, 7616ba597c5SAnurag S. Maskey const char **valstrp) 7626ba597c5SAnurag S. Maskey { 7636ba597c5SAnurag S. Maskey int i, j; 7646ba597c5SAnurag S. Maskey int max = 0; /* largest enum value seen so far */ 7656ba597c5SAnurag S. Maskey struct nwam_value_entry *value_entries; 7666ba597c5SAnurag S. Maskey 7676ba597c5SAnurag S. Maskey assert(propname != NULL && valstrp != NULL); 7686ba597c5SAnurag S. Maskey 7696ba597c5SAnurag S. Maskey for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) { 7706ba597c5SAnurag S. Maskey if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0) 7716ba597c5SAnurag S. Maskey continue; 7726ba597c5SAnurag S. Maskey 7736ba597c5SAnurag S. Maskey value_entries = prop_value_entry_table[i].value_entries; 7746ba597c5SAnurag S. Maskey 7756ba597c5SAnurag S. Maskey for (j = 0; value_entries[j].value_string != NULL; j++) { 7766ba597c5SAnurag S. Maskey if (value_entries[j].value == val) { 7776ba597c5SAnurag S. Maskey *valstrp = value_entries[j].value_string; 7786ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 7796ba597c5SAnurag S. Maskey } 7806ba597c5SAnurag S. Maskey max = value_entries[j].value > max ? 7816ba597c5SAnurag S. Maskey value_entries[j].value : max; 7826ba597c5SAnurag S. Maskey } 7836ba597c5SAnurag S. Maskey /* 7846ba597c5SAnurag S. Maskey * If trying to get the string for an enum value that doesn't 7856ba597c5SAnurag S. Maskey * exist, return NWAM_LIST_END. Otherwise, the input enum 7866ba597c5SAnurag S. Maskey * value doesn't exist for the given property. 7876ba597c5SAnurag S. Maskey */ 7886ba597c5SAnurag S. Maskey if (val > max) 7896ba597c5SAnurag S. Maskey return (NWAM_LIST_END); 7906ba597c5SAnurag S. Maskey else 7916ba597c5SAnurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE); 7926ba597c5SAnurag S. Maskey } 7936ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 7946ba597c5SAnurag S. Maskey } 7956ba597c5SAnurag S. Maskey 7966ba597c5SAnurag S. Maskey /* 7976ba597c5SAnurag S. Maskey * Convert string to appropriate uint64 value. 7986ba597c5SAnurag S. Maskey */ 7996ba597c5SAnurag S. Maskey nwam_error_t 8006ba597c5SAnurag S. Maskey nwam_value_string_get_uint64(const char *propname, const char *valstr, 8016ba597c5SAnurag S. Maskey uint64_t *valp) 8026ba597c5SAnurag S. Maskey { 8036ba597c5SAnurag S. Maskey int i, j; 8046ba597c5SAnurag S. Maskey struct nwam_value_entry *value_entries; 8056ba597c5SAnurag S. Maskey 8066ba597c5SAnurag S. Maskey assert(propname != NULL && valstr != NULL && valp != NULL); 8076ba597c5SAnurag S. Maskey 8086ba597c5SAnurag S. Maskey for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) { 8096ba597c5SAnurag S. Maskey if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0) 8106ba597c5SAnurag S. Maskey continue; 8116ba597c5SAnurag S. Maskey 8126ba597c5SAnurag S. Maskey value_entries = prop_value_entry_table[i].value_entries; 8136ba597c5SAnurag S. Maskey 8146ba597c5SAnurag S. Maskey for (j = 0; value_entries[j].value_string != NULL; j++) { 8156ba597c5SAnurag S. Maskey if (strcasecmp(value_entries[j].value_string, valstr) 8166ba597c5SAnurag S. Maskey == 0) { 8176ba597c5SAnurag S. Maskey *valp = value_entries[j].value; 8186ba597c5SAnurag S. Maskey return (NWAM_SUCCESS); 8196ba597c5SAnurag S. Maskey } 8206ba597c5SAnurag S. Maskey } 8216ba597c5SAnurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE); 8226ba597c5SAnurag S. Maskey } 8236ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8246ba597c5SAnurag S. Maskey } 8256ba597c5SAnurag S. Maskey 8266ba597c5SAnurag S. Maskey /* Conditional activation functions */ 8276ba597c5SAnurag S. Maskey 8286ba597c5SAnurag S. Maskey nwam_error_t 8296ba597c5SAnurag S. Maskey nwam_condition_to_condition_string(nwam_condition_object_type_t object_type, 8306ba597c5SAnurag S. Maskey nwam_condition_t condition, const char *object_name, char **stringp) 8316ba597c5SAnurag S. Maskey { 8326ba597c5SAnurag S. Maskey char *object_type_string, *condition_string; 8336ba597c5SAnurag S. Maskey char *string; 8346ba597c5SAnurag S. Maskey 8356ba597c5SAnurag S. Maskey assert(stringp != NULL); 8366ba597c5SAnurag S. Maskey 8376ba597c5SAnurag S. Maskey *stringp = NULL; 8386ba597c5SAnurag S. Maskey 8396ba597c5SAnurag S. Maskey switch (object_type) { 8406ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_NCP: 8416ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCP_STRING; 8426ba597c5SAnurag S. Maskey break; 8436ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_NCU: 8446ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCU_STRING; 8456ba597c5SAnurag S. Maskey break; 8466ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ENM: 8476ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_ENM_STRING; 8486ba597c5SAnurag S. Maskey break; 8496ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_LOC: 8506ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_LOC_STRING; 8516ba597c5SAnurag S. Maskey break; 8526ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS: 8536ba597c5SAnurag S. Maskey object_type_string = 8546ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING; 8556ba597c5SAnurag S. Maskey break; 8566ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN: 8576ba597c5SAnurag S. Maskey object_type_string = 8586ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING; 8596ba597c5SAnurag S. Maskey break; 8606ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN: 8616ba597c5SAnurag S. Maskey object_type_string = 8626ba597c5SAnurag S. Maskey NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING; 8636ba597c5SAnurag S. Maskey break; 8646ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_ESSID: 8656ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING; 8666ba597c5SAnurag S. Maskey break; 8676ba597c5SAnurag S. Maskey case NWAM_CONDITION_OBJECT_TYPE_BSSID: 8686ba597c5SAnurag S. Maskey object_type_string = NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING; 8696ba597c5SAnurag S. Maskey break; 8706ba597c5SAnurag S. Maskey default: 8716ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8726ba597c5SAnurag S. Maskey 8736ba597c5SAnurag S. Maskey } 8746ba597c5SAnurag S. Maskey switch (condition) { 8756ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS: 8766ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_IS_STRING; 8776ba597c5SAnurag S. Maskey break; 8786ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_NOT: 8796ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_IS_NOT_STRING; 8806ba597c5SAnurag S. Maskey break; 8816ba597c5SAnurag S. Maskey case NWAM_CONDITION_CONTAINS: 8826ba597c5SAnurag S. Maskey if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN && 8836ba597c5SAnurag S. Maskey object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN && 8846ba597c5SAnurag S. Maskey object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID) 8856ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8866ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_CONTAINS_STRING; 8876ba597c5SAnurag S. Maskey break; 8886ba597c5SAnurag S. Maskey case NWAM_CONDITION_DOES_NOT_CONTAIN: 8896ba597c5SAnurag S. Maskey if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN && 8906ba597c5SAnurag S. Maskey object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN && 8916ba597c5SAnurag S. Maskey object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID) 8926ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8936ba597c5SAnurag S. Maskey 8946ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_DOES_NOT_CONTAIN_STRING; 8956ba597c5SAnurag S. Maskey break; 8966ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_IN_RANGE: 8976ba597c5SAnurag S. Maskey if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) 8986ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 8996ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_IS_IN_RANGE_STRING; 9006ba597c5SAnurag S. Maskey break; 9016ba597c5SAnurag S. Maskey case NWAM_CONDITION_IS_NOT_IN_RANGE: 9026ba597c5SAnurag S. Maskey if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) 9036ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 9046ba597c5SAnurag S. Maskey condition_string = NWAM_CONDITION_IS_NOT_IN_RANGE_STRING; 9056ba597c5SAnurag S. Maskey break; 9066ba597c5SAnurag S. Maskey default: 9076ba597c5SAnurag S. Maskey return (NWAM_INVALID_ARG); 9086ba597c5SAnurag S. Maskey break; 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