111767SAnurag.Maskey@Sun.COM /* 211767SAnurag.Maskey@Sun.COM * CDDL HEADER START 311767SAnurag.Maskey@Sun.COM * 411767SAnurag.Maskey@Sun.COM * The contents of this file are subject to the terms of the 511767SAnurag.Maskey@Sun.COM * Common Development and Distribution License (the "License"). 611767SAnurag.Maskey@Sun.COM * You may not use this file except in compliance with the License. 711767SAnurag.Maskey@Sun.COM * 811767SAnurag.Maskey@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 911767SAnurag.Maskey@Sun.COM * or http://www.opensolaris.org/os/licensing. 1011767SAnurag.Maskey@Sun.COM * See the License for the specific language governing permissions 1111767SAnurag.Maskey@Sun.COM * and limitations under the License. 1211767SAnurag.Maskey@Sun.COM * 1311767SAnurag.Maskey@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1411767SAnurag.Maskey@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1511767SAnurag.Maskey@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1611767SAnurag.Maskey@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1711767SAnurag.Maskey@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1811767SAnurag.Maskey@Sun.COM * 1911767SAnurag.Maskey@Sun.COM * CDDL HEADER END 2011767SAnurag.Maskey@Sun.COM */ 2111767SAnurag.Maskey@Sun.COM 2211767SAnurag.Maskey@Sun.COM /* 23*13107SRenee.Sommerfeld@Oracle.COM * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 2411767SAnurag.Maskey@Sun.COM */ 2511767SAnurag.Maskey@Sun.COM 2611767SAnurag.Maskey@Sun.COM #include <assert.h> 2711767SAnurag.Maskey@Sun.COM #include <stdio.h> 2811767SAnurag.Maskey@Sun.COM #include <stdlib.h> 2911767SAnurag.Maskey@Sun.COM #include <string.h> 3011767SAnurag.Maskey@Sun.COM #include <sys/types.h> 3111767SAnurag.Maskey@Sun.COM #include <libdlwlan.h> 3211767SAnurag.Maskey@Sun.COM #include <libnvpair.h> 3311767SAnurag.Maskey@Sun.COM 3411767SAnurag.Maskey@Sun.COM #include "libnwam_impl.h" 3511767SAnurag.Maskey@Sun.COM #include <libnwam_priv.h> 3611767SAnurag.Maskey@Sun.COM #include <libnwam.h> 3711767SAnurag.Maskey@Sun.COM 3811767SAnurag.Maskey@Sun.COM /* 3911767SAnurag.Maskey@Sun.COM * Internal implementation of libnwam in-memory objects and values. Objects 4011767SAnurag.Maskey@Sun.COM * are nvlists. 4111767SAnurag.Maskey@Sun.COM */ 4211767SAnurag.Maskey@Sun.COM 4311767SAnurag.Maskey@Sun.COM void 4411767SAnurag.Maskey@Sun.COM nwam_value_free(nwam_value_t value) 4511767SAnurag.Maskey@Sun.COM { 4611767SAnurag.Maskey@Sun.COM uint_t i; 4711767SAnurag.Maskey@Sun.COM 4811767SAnurag.Maskey@Sun.COM if (value == NULL) 4911767SAnurag.Maskey@Sun.COM return; 5011767SAnurag.Maskey@Sun.COM 5111767SAnurag.Maskey@Sun.COM switch (value->nwv_value_type) { 5211767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_BOOLEAN: 5311767SAnurag.Maskey@Sun.COM free(value->nwv_values.nwv_boolean); 5411767SAnurag.Maskey@Sun.COM break; 5511767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_INT64: 5611767SAnurag.Maskey@Sun.COM free(value->nwv_values.nwv_int64); 5711767SAnurag.Maskey@Sun.COM break; 5811767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_UINT64: 5911767SAnurag.Maskey@Sun.COM free(value->nwv_values.nwv_uint64); 6011767SAnurag.Maskey@Sun.COM break; 6111767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_STRING: 6211767SAnurag.Maskey@Sun.COM for (i = 0; i < value->nwv_value_numvalues; i++) 6311767SAnurag.Maskey@Sun.COM free(value->nwv_values.nwv_string[i]); 6411767SAnurag.Maskey@Sun.COM free(value->nwv_values.nwv_string); 6511767SAnurag.Maskey@Sun.COM break; 6611767SAnurag.Maskey@Sun.COM } 6711767SAnurag.Maskey@Sun.COM free(value); 6811767SAnurag.Maskey@Sun.COM } 6911767SAnurag.Maskey@Sun.COM 7011767SAnurag.Maskey@Sun.COM nwam_error_t 7111767SAnurag.Maskey@Sun.COM nwam_value_create(nwam_value_type_t value_type, void *values, uint_t numvalues, 7211767SAnurag.Maskey@Sun.COM nwam_value_t *valuep) 7311767SAnurag.Maskey@Sun.COM { 7411767SAnurag.Maskey@Sun.COM nwam_value_t newvalue; 7511767SAnurag.Maskey@Sun.COM boolean_t *values_boolean; 7611767SAnurag.Maskey@Sun.COM int64_t *values_int64; 7711767SAnurag.Maskey@Sun.COM uint64_t *values_uint64; 7811767SAnurag.Maskey@Sun.COM char **values_string; 7911767SAnurag.Maskey@Sun.COM int i, j; 8011767SAnurag.Maskey@Sun.COM nwam_error_t err = NWAM_SUCCESS; 8111767SAnurag.Maskey@Sun.COM 8211767SAnurag.Maskey@Sun.COM *valuep = NULL; 8311767SAnurag.Maskey@Sun.COM 8411767SAnurag.Maskey@Sun.COM if ((newvalue = calloc(1, sizeof (struct nwam_value))) == NULL) 8511767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 8611767SAnurag.Maskey@Sun.COM 8711767SAnurag.Maskey@Sun.COM newvalue->nwv_value_type = value_type; 8811767SAnurag.Maskey@Sun.COM newvalue->nwv_value_numvalues = numvalues; 8911767SAnurag.Maskey@Sun.COM 9011767SAnurag.Maskey@Sun.COM switch (value_type) { 9111767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_BOOLEAN: 9211767SAnurag.Maskey@Sun.COM values_boolean = values; 9311767SAnurag.Maskey@Sun.COM if ((newvalue->nwv_values.nwv_boolean = 9411767SAnurag.Maskey@Sun.COM calloc(numvalues, sizeof (boolean_t))) == NULL) { 9511767SAnurag.Maskey@Sun.COM free(newvalue); 9611767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 9711767SAnurag.Maskey@Sun.COM } 9811767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) 9911767SAnurag.Maskey@Sun.COM newvalue->nwv_values.nwv_boolean[i] = values_boolean[i]; 10011767SAnurag.Maskey@Sun.COM break; 10111767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_INT64: 10211767SAnurag.Maskey@Sun.COM values_int64 = values; 10311767SAnurag.Maskey@Sun.COM if ((newvalue->nwv_values.nwv_int64 = 10411767SAnurag.Maskey@Sun.COM calloc(numvalues, sizeof (int64_t))) == NULL) { 10511767SAnurag.Maskey@Sun.COM free(newvalue); 10611767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 10711767SAnurag.Maskey@Sun.COM } 10811767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) 10911767SAnurag.Maskey@Sun.COM newvalue->nwv_values.nwv_int64[i] = values_int64[i]; 11011767SAnurag.Maskey@Sun.COM break; 11111767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_UINT64: 11211767SAnurag.Maskey@Sun.COM values_uint64 = values; 11311767SAnurag.Maskey@Sun.COM if ((newvalue->nwv_values.nwv_uint64 = 11411767SAnurag.Maskey@Sun.COM calloc(numvalues, sizeof (uint64_t))) == NULL) { 11511767SAnurag.Maskey@Sun.COM free(newvalue); 11611767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 11711767SAnurag.Maskey@Sun.COM } 11811767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) 11911767SAnurag.Maskey@Sun.COM newvalue->nwv_values.nwv_uint64[i] = values_uint64[i]; 12011767SAnurag.Maskey@Sun.COM break; 12111767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_STRING: 12211767SAnurag.Maskey@Sun.COM values_string = values; 12311767SAnurag.Maskey@Sun.COM if ((newvalue->nwv_values.nwv_string = 12411767SAnurag.Maskey@Sun.COM calloc(numvalues, sizeof (char *))) == NULL) { 12511767SAnurag.Maskey@Sun.COM free(newvalue); 12611767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 12711767SAnurag.Maskey@Sun.COM } 12811767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 12911767SAnurag.Maskey@Sun.COM if (strnlen(values_string[i], NWAM_MAX_VALUE_LEN) == 13011767SAnurag.Maskey@Sun.COM NWAM_MAX_VALUE_LEN) { 13111767SAnurag.Maskey@Sun.COM err = NWAM_ENTITY_INVALID_VALUE; 13211767SAnurag.Maskey@Sun.COM } else if ((newvalue->nwv_values.nwv_string[i] = 13311767SAnurag.Maskey@Sun.COM strdup(values_string[i])) == NULL) { 13411767SAnurag.Maskey@Sun.COM err = NWAM_NO_MEMORY; 13511767SAnurag.Maskey@Sun.COM } 13611767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) { 13711767SAnurag.Maskey@Sun.COM for (j = 0; j < i; j++) 13811767SAnurag.Maskey@Sun.COM free( 13911767SAnurag.Maskey@Sun.COM newvalue->nwv_values.nwv_string[i]); 14011767SAnurag.Maskey@Sun.COM free(newvalue->nwv_values.nwv_string); 14111767SAnurag.Maskey@Sun.COM free(newvalue); 14211767SAnurag.Maskey@Sun.COM return (err); 14311767SAnurag.Maskey@Sun.COM } 14411767SAnurag.Maskey@Sun.COM } 14511767SAnurag.Maskey@Sun.COM break; 14611767SAnurag.Maskey@Sun.COM default: 14711767SAnurag.Maskey@Sun.COM break; 14811767SAnurag.Maskey@Sun.COM } 14911767SAnurag.Maskey@Sun.COM 15011767SAnurag.Maskey@Sun.COM *valuep = newvalue; 15111767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 15211767SAnurag.Maskey@Sun.COM } 15311767SAnurag.Maskey@Sun.COM 15411767SAnurag.Maskey@Sun.COM nwam_error_t 15511767SAnurag.Maskey@Sun.COM nwam_value_copy(nwam_value_t old, nwam_value_t *newp) 15611767SAnurag.Maskey@Sun.COM { 15711767SAnurag.Maskey@Sun.COM void *values; 15811767SAnurag.Maskey@Sun.COM 15911767SAnurag.Maskey@Sun.COM assert(old != NULL && newp != NULL); 16011767SAnurag.Maskey@Sun.COM 16111767SAnurag.Maskey@Sun.COM switch (old->nwv_value_type) { 16211767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_BOOLEAN: 16311767SAnurag.Maskey@Sun.COM values = old->nwv_values.nwv_boolean; 16411767SAnurag.Maskey@Sun.COM break; 16511767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_INT64: 16611767SAnurag.Maskey@Sun.COM values = old->nwv_values.nwv_int64; 16711767SAnurag.Maskey@Sun.COM break; 16811767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_UINT64: 16911767SAnurag.Maskey@Sun.COM values = old->nwv_values.nwv_uint64; 17011767SAnurag.Maskey@Sun.COM break; 17111767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_STRING: 17211767SAnurag.Maskey@Sun.COM values = old->nwv_values.nwv_string; 17311767SAnurag.Maskey@Sun.COM break; 17411767SAnurag.Maskey@Sun.COM default: 17511767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 17611767SAnurag.Maskey@Sun.COM } 17711767SAnurag.Maskey@Sun.COM return (nwam_value_create(old->nwv_value_type, values, 17811767SAnurag.Maskey@Sun.COM old->nwv_value_numvalues, newp)); 17911767SAnurag.Maskey@Sun.COM } 18011767SAnurag.Maskey@Sun.COM nwam_error_t 18111767SAnurag.Maskey@Sun.COM nwam_value_create_boolean_array(boolean_t *values, uint_t numvalues, 18211767SAnurag.Maskey@Sun.COM nwam_value_t *valuep) 18311767SAnurag.Maskey@Sun.COM { 18411767SAnurag.Maskey@Sun.COM return (nwam_value_create(NWAM_VALUE_TYPE_BOOLEAN, values, numvalues, 18511767SAnurag.Maskey@Sun.COM valuep)); 18611767SAnurag.Maskey@Sun.COM } 18711767SAnurag.Maskey@Sun.COM 18811767SAnurag.Maskey@Sun.COM nwam_error_t 18911767SAnurag.Maskey@Sun.COM nwam_value_create_boolean(boolean_t value, nwam_value_t *valuep) 19011767SAnurag.Maskey@Sun.COM { 19111767SAnurag.Maskey@Sun.COM return (nwam_value_create_boolean_array(&value, 1, valuep)); 19211767SAnurag.Maskey@Sun.COM } 19311767SAnurag.Maskey@Sun.COM 19411767SAnurag.Maskey@Sun.COM nwam_error_t 19511767SAnurag.Maskey@Sun.COM nwam_value_create_int64_array(int64_t *values, uint_t numvalues, 19611767SAnurag.Maskey@Sun.COM nwam_value_t *valuep) 19711767SAnurag.Maskey@Sun.COM { 19811767SAnurag.Maskey@Sun.COM return (nwam_value_create(NWAM_VALUE_TYPE_INT64, values, numvalues, 19911767SAnurag.Maskey@Sun.COM valuep)); 20011767SAnurag.Maskey@Sun.COM } 20111767SAnurag.Maskey@Sun.COM 20211767SAnurag.Maskey@Sun.COM nwam_error_t 20311767SAnurag.Maskey@Sun.COM nwam_value_create_int64(int64_t value, nwam_value_t *valuep) 20411767SAnurag.Maskey@Sun.COM { 20511767SAnurag.Maskey@Sun.COM return (nwam_value_create_int64_array(&value, 1, valuep)); 20611767SAnurag.Maskey@Sun.COM } 20711767SAnurag.Maskey@Sun.COM 20811767SAnurag.Maskey@Sun.COM nwam_error_t 20911767SAnurag.Maskey@Sun.COM nwam_value_create_uint64_array(uint64_t *values, uint_t numvalues, 21011767SAnurag.Maskey@Sun.COM nwam_value_t *valuep) 21111767SAnurag.Maskey@Sun.COM { 21211767SAnurag.Maskey@Sun.COM return (nwam_value_create(NWAM_VALUE_TYPE_UINT64, values, numvalues, 21311767SAnurag.Maskey@Sun.COM valuep)); 21411767SAnurag.Maskey@Sun.COM } 21511767SAnurag.Maskey@Sun.COM 21611767SAnurag.Maskey@Sun.COM nwam_error_t 21711767SAnurag.Maskey@Sun.COM nwam_value_create_uint64(uint64_t value, nwam_value_t *valuep) 21811767SAnurag.Maskey@Sun.COM { 21911767SAnurag.Maskey@Sun.COM return (nwam_value_create_uint64_array(&value, 1, valuep)); 22011767SAnurag.Maskey@Sun.COM } 22111767SAnurag.Maskey@Sun.COM 22211767SAnurag.Maskey@Sun.COM nwam_error_t 22311767SAnurag.Maskey@Sun.COM nwam_value_create_string_array(char **values, uint_t numvalues, 22411767SAnurag.Maskey@Sun.COM nwam_value_t *valuep) 22511767SAnurag.Maskey@Sun.COM { 22611767SAnurag.Maskey@Sun.COM return (nwam_value_create(NWAM_VALUE_TYPE_STRING, values, numvalues, 22711767SAnurag.Maskey@Sun.COM valuep)); 22811767SAnurag.Maskey@Sun.COM } 22911767SAnurag.Maskey@Sun.COM 23011767SAnurag.Maskey@Sun.COM nwam_error_t 23111767SAnurag.Maskey@Sun.COM nwam_value_create_string(char *value, nwam_value_t *valuep) 23211767SAnurag.Maskey@Sun.COM { 23311767SAnurag.Maskey@Sun.COM return (nwam_value_create_string_array(&value, 1, valuep)); 23411767SAnurag.Maskey@Sun.COM } 23511767SAnurag.Maskey@Sun.COM 23611767SAnurag.Maskey@Sun.COM nwam_error_t 23711767SAnurag.Maskey@Sun.COM nwam_value_get_boolean_array(nwam_value_t value, boolean_t **valuesp, 23811767SAnurag.Maskey@Sun.COM uint_t *numvaluesp) 23911767SAnurag.Maskey@Sun.COM { 24011767SAnurag.Maskey@Sun.COM assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 24111767SAnurag.Maskey@Sun.COM 24211767SAnurag.Maskey@Sun.COM *numvaluesp = value->nwv_value_numvalues; 24311767SAnurag.Maskey@Sun.COM *valuesp = value->nwv_values.nwv_boolean; 24411767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 24511767SAnurag.Maskey@Sun.COM } 24611767SAnurag.Maskey@Sun.COM 24711767SAnurag.Maskey@Sun.COM nwam_error_t 24811767SAnurag.Maskey@Sun.COM nwam_value_get_boolean(nwam_value_t value, boolean_t *valuep) 24911767SAnurag.Maskey@Sun.COM { 25011767SAnurag.Maskey@Sun.COM uint_t numvalues; 25111767SAnurag.Maskey@Sun.COM boolean_t *myvaluesp; 25211767SAnurag.Maskey@Sun.COM nwam_error_t err; 25311767SAnurag.Maskey@Sun.COM 25411767SAnurag.Maskey@Sun.COM err = nwam_value_get_boolean_array(value, &myvaluesp, &numvalues); 25511767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 25611767SAnurag.Maskey@Sun.COM return (err); 25711767SAnurag.Maskey@Sun.COM if (numvalues != 1) 25811767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MULTIPLE_VALUES); 25911767SAnurag.Maskey@Sun.COM 26011767SAnurag.Maskey@Sun.COM *valuep = myvaluesp[0]; 26111767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 26211767SAnurag.Maskey@Sun.COM } 26311767SAnurag.Maskey@Sun.COM 26411767SAnurag.Maskey@Sun.COM nwam_error_t 26511767SAnurag.Maskey@Sun.COM nwam_value_get_int64_array(nwam_value_t value, int64_t **valuesp, 26611767SAnurag.Maskey@Sun.COM uint_t *numvaluesp) 26711767SAnurag.Maskey@Sun.COM { 26811767SAnurag.Maskey@Sun.COM assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 26911767SAnurag.Maskey@Sun.COM 27011767SAnurag.Maskey@Sun.COM *numvaluesp = value->nwv_value_numvalues; 27111767SAnurag.Maskey@Sun.COM *valuesp = value->nwv_values.nwv_int64; 27211767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 27311767SAnurag.Maskey@Sun.COM } 27411767SAnurag.Maskey@Sun.COM 27511767SAnurag.Maskey@Sun.COM nwam_error_t 27611767SAnurag.Maskey@Sun.COM nwam_value_get_int64(nwam_value_t value, int64_t *valuep) 27711767SAnurag.Maskey@Sun.COM { 27811767SAnurag.Maskey@Sun.COM uint_t numvalues; 27911767SAnurag.Maskey@Sun.COM int64_t *myvaluesp; 28011767SAnurag.Maskey@Sun.COM nwam_error_t err; 28111767SAnurag.Maskey@Sun.COM 28211767SAnurag.Maskey@Sun.COM err = nwam_value_get_int64_array(value, &myvaluesp, &numvalues); 28311767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 28411767SAnurag.Maskey@Sun.COM return (err); 28511767SAnurag.Maskey@Sun.COM if (numvalues != 1) 28611767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MULTIPLE_VALUES); 28711767SAnurag.Maskey@Sun.COM 28811767SAnurag.Maskey@Sun.COM *valuep = myvaluesp[0]; 28911767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 29011767SAnurag.Maskey@Sun.COM } 29111767SAnurag.Maskey@Sun.COM 29211767SAnurag.Maskey@Sun.COM nwam_error_t 29311767SAnurag.Maskey@Sun.COM nwam_value_get_uint64_array(nwam_value_t value, uint64_t **valuesp, 29411767SAnurag.Maskey@Sun.COM uint_t *numvaluesp) 29511767SAnurag.Maskey@Sun.COM { 29611767SAnurag.Maskey@Sun.COM assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 29711767SAnurag.Maskey@Sun.COM 29811767SAnurag.Maskey@Sun.COM *numvaluesp = value->nwv_value_numvalues; 29911767SAnurag.Maskey@Sun.COM *valuesp = value->nwv_values.nwv_uint64; 30011767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 30111767SAnurag.Maskey@Sun.COM } 30211767SAnurag.Maskey@Sun.COM 30311767SAnurag.Maskey@Sun.COM nwam_error_t 30411767SAnurag.Maskey@Sun.COM nwam_value_get_uint64(nwam_value_t value, uint64_t *valuep) 30511767SAnurag.Maskey@Sun.COM { 30611767SAnurag.Maskey@Sun.COM uint_t numvalues; 30711767SAnurag.Maskey@Sun.COM uint64_t *myvaluesp; 30811767SAnurag.Maskey@Sun.COM nwam_error_t err; 30911767SAnurag.Maskey@Sun.COM 31011767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64_array(value, &myvaluesp, &numvalues); 31111767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 31211767SAnurag.Maskey@Sun.COM return (err); 31311767SAnurag.Maskey@Sun.COM if (numvalues != 1) 31411767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MULTIPLE_VALUES); 31511767SAnurag.Maskey@Sun.COM 31611767SAnurag.Maskey@Sun.COM *valuep = myvaluesp[0]; 31711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 31811767SAnurag.Maskey@Sun.COM } 31911767SAnurag.Maskey@Sun.COM 32011767SAnurag.Maskey@Sun.COM nwam_error_t 32111767SAnurag.Maskey@Sun.COM nwam_value_get_string_array(nwam_value_t value, char ***valuesp, 32211767SAnurag.Maskey@Sun.COM uint_t *numvaluesp) 32311767SAnurag.Maskey@Sun.COM { 32411767SAnurag.Maskey@Sun.COM assert(value != NULL && numvaluesp != NULL && valuesp != NULL); 32511767SAnurag.Maskey@Sun.COM 32611767SAnurag.Maskey@Sun.COM *numvaluesp = value->nwv_value_numvalues; 32711767SAnurag.Maskey@Sun.COM *valuesp = value->nwv_values.nwv_string; 32811767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 32911767SAnurag.Maskey@Sun.COM } 33011767SAnurag.Maskey@Sun.COM 33111767SAnurag.Maskey@Sun.COM nwam_error_t 33211767SAnurag.Maskey@Sun.COM nwam_value_get_string(nwam_value_t value, char **valuep) 33311767SAnurag.Maskey@Sun.COM { 33411767SAnurag.Maskey@Sun.COM uint_t numvalues; 33511767SAnurag.Maskey@Sun.COM char **myvaluesp; 33611767SAnurag.Maskey@Sun.COM nwam_error_t err; 33711767SAnurag.Maskey@Sun.COM 33811767SAnurag.Maskey@Sun.COM err = nwam_value_get_string_array(value, &myvaluesp, &numvalues); 33911767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 34011767SAnurag.Maskey@Sun.COM return (err); 34111767SAnurag.Maskey@Sun.COM if (numvalues != 1) 34211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MULTIPLE_VALUES); 34311767SAnurag.Maskey@Sun.COM 34411767SAnurag.Maskey@Sun.COM *valuep = myvaluesp[0]; 34511767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 34611767SAnurag.Maskey@Sun.COM } 34711767SAnurag.Maskey@Sun.COM 34811767SAnurag.Maskey@Sun.COM nwam_error_t 34911767SAnurag.Maskey@Sun.COM nwam_value_get_type(nwam_value_t value, nwam_value_type_t *typep) 35011767SAnurag.Maskey@Sun.COM { 35111767SAnurag.Maskey@Sun.COM *typep = value->nwv_value_type; 35211767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 35311767SAnurag.Maskey@Sun.COM } 35411767SAnurag.Maskey@Sun.COM 35511767SAnurag.Maskey@Sun.COM nwam_error_t 35611767SAnurag.Maskey@Sun.COM nwam_value_get_numvalues(nwam_value_t value, uint_t *numvaluesp) 35711767SAnurag.Maskey@Sun.COM { 35811767SAnurag.Maskey@Sun.COM *numvaluesp = value->nwv_value_numvalues; 35911767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 36011767SAnurag.Maskey@Sun.COM } 36111767SAnurag.Maskey@Sun.COM 36211767SAnurag.Maskey@Sun.COM /* 36311767SAnurag.Maskey@Sun.COM * Generic object data functions. We hide nvlist implementation 36411767SAnurag.Maskey@Sun.COM * from NCP, ENM and location implementations. 36511767SAnurag.Maskey@Sun.COM */ 36611767SAnurag.Maskey@Sun.COM nwam_error_t 36711767SAnurag.Maskey@Sun.COM nwam_alloc_object_list(void *list) 36811767SAnurag.Maskey@Sun.COM { 36911767SAnurag.Maskey@Sun.COM int nverr; 37011767SAnurag.Maskey@Sun.COM 37111767SAnurag.Maskey@Sun.COM assert(list != NULL); 37211767SAnurag.Maskey@Sun.COM 37311767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_alloc((nvlist_t **)list, NV_UNIQUE_NAME, 0)) != 0) 37411767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 37511767SAnurag.Maskey@Sun.COM 37611767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 37711767SAnurag.Maskey@Sun.COM } 37811767SAnurag.Maskey@Sun.COM 37911767SAnurag.Maskey@Sun.COM void 38011767SAnurag.Maskey@Sun.COM nwam_free_object_list(void *list) 38111767SAnurag.Maskey@Sun.COM { 38211767SAnurag.Maskey@Sun.COM if (list != NULL) 38311767SAnurag.Maskey@Sun.COM nvlist_free(list); 38411767SAnurag.Maskey@Sun.COM } 38511767SAnurag.Maskey@Sun.COM 38611767SAnurag.Maskey@Sun.COM nwam_error_t 38711767SAnurag.Maskey@Sun.COM nwam_dup_object_list(void *oldlist, void *newlist) 38811767SAnurag.Maskey@Sun.COM { 38911767SAnurag.Maskey@Sun.COM int nverr; 39011767SAnurag.Maskey@Sun.COM 39111767SAnurag.Maskey@Sun.COM assert(oldlist != NULL && newlist != NULL); 39211767SAnurag.Maskey@Sun.COM 39311767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_dup(oldlist, newlist, 0)) != 0) 39411767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 39511767SAnurag.Maskey@Sun.COM 39611767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 39711767SAnurag.Maskey@Sun.COM } 39811767SAnurag.Maskey@Sun.COM 39911767SAnurag.Maskey@Sun.COM /* Add child object list to parent object list using property name childname */ 40011767SAnurag.Maskey@Sun.COM nwam_error_t 40111767SAnurag.Maskey@Sun.COM nwam_object_list_add_object_list(void *parentlist, char *childname, 40211767SAnurag.Maskey@Sun.COM void *childlist) 40311767SAnurag.Maskey@Sun.COM { 40411767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nvlist_add_nvlist(parentlist, 40511767SAnurag.Maskey@Sun.COM childname, childlist))); 40611767SAnurag.Maskey@Sun.COM } 40711767SAnurag.Maskey@Sun.COM 40811767SAnurag.Maskey@Sun.COM /* Remove object list from parent object list */ 40911767SAnurag.Maskey@Sun.COM nwam_error_t 41011767SAnurag.Maskey@Sun.COM nwam_object_list_remove_object_list(void *parentlist, char *childname) 41111767SAnurag.Maskey@Sun.COM { 41211767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nvlist_remove_all(parentlist, 41311767SAnurag.Maskey@Sun.COM childname))); 41411767SAnurag.Maskey@Sun.COM } 41511767SAnurag.Maskey@Sun.COM 41611767SAnurag.Maskey@Sun.COM /* 41711767SAnurag.Maskey@Sun.COM * Get next object list (nvlist) after lastname. Used to walk NCUs, ENMs and 41811767SAnurag.Maskey@Sun.COM * locations, each of which is internally represented as an nvlist. 41911767SAnurag.Maskey@Sun.COM */ 42011767SAnurag.Maskey@Sun.COM nwam_error_t 42111767SAnurag.Maskey@Sun.COM nwam_next_object_list(void *parentlist, char *lastname, char **childnamep, 42211767SAnurag.Maskey@Sun.COM void *childlistp) 42311767SAnurag.Maskey@Sun.COM { 42411767SAnurag.Maskey@Sun.COM nvpair_t *last = NULL, *next; 42511767SAnurag.Maskey@Sun.COM int nverr; 42611767SAnurag.Maskey@Sun.COM 42711767SAnurag.Maskey@Sun.COM if (lastname != NULL) { 42811767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_lookup_nvpair(parentlist, lastname, &last)) 42911767SAnurag.Maskey@Sun.COM != 0) 43011767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 43111767SAnurag.Maskey@Sun.COM } 43211767SAnurag.Maskey@Sun.COM if ((next = nvlist_next_nvpair(parentlist, last)) == NULL) 43311767SAnurag.Maskey@Sun.COM return (NWAM_LIST_END); 43411767SAnurag.Maskey@Sun.COM 43511767SAnurag.Maskey@Sun.COM *childnamep = nvpair_name(next); 43611767SAnurag.Maskey@Sun.COM 43711767SAnurag.Maskey@Sun.COM if (nvpair_type(next) != DATA_TYPE_NVLIST) 43811767SAnurag.Maskey@Sun.COM return (NWAM_ERROR_INTERNAL); 43911767SAnurag.Maskey@Sun.COM 44011767SAnurag.Maskey@Sun.COM if ((nverr = nvpair_value_nvlist(next, childlistp)) != NWAM_SUCCESS) 44111767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 44211767SAnurag.Maskey@Sun.COM 44311767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 44411767SAnurag.Maskey@Sun.COM } 44511767SAnurag.Maskey@Sun.COM 44611767SAnurag.Maskey@Sun.COM /* 44711767SAnurag.Maskey@Sun.COM * Pack nvlist into contiguous memory. If packed_listp is NULL, we just 44811767SAnurag.Maskey@Sun.COM * return the size of the memory needed to do so. 44911767SAnurag.Maskey@Sun.COM */ 45011767SAnurag.Maskey@Sun.COM nwam_error_t 45111767SAnurag.Maskey@Sun.COM nwam_pack_object_list(void *list, char **packed_listp, size_t *packed_sizep) 45211767SAnurag.Maskey@Sun.COM { 45311767SAnurag.Maskey@Sun.COM int nverr; 45411767SAnurag.Maskey@Sun.COM 45511767SAnurag.Maskey@Sun.COM assert(list != NULL && packed_sizep != NULL); 45611767SAnurag.Maskey@Sun.COM 45711767SAnurag.Maskey@Sun.COM if (packed_listp == NULL) { 45811767SAnurag.Maskey@Sun.COM nverr = nvlist_size(list, packed_sizep, NV_ENCODE_XDR); 45911767SAnurag.Maskey@Sun.COM } else { 46011767SAnurag.Maskey@Sun.COM nverr = nvlist_pack(list, packed_listp, packed_sizep, 46111767SAnurag.Maskey@Sun.COM NV_ENCODE_XDR, 0); 46211767SAnurag.Maskey@Sun.COM } 46311767SAnurag.Maskey@Sun.COM 46411767SAnurag.Maskey@Sun.COM if (nverr != 0) 46511767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 46611767SAnurag.Maskey@Sun.COM 46711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 46811767SAnurag.Maskey@Sun.COM } 46911767SAnurag.Maskey@Sun.COM 47011767SAnurag.Maskey@Sun.COM nwam_error_t 47111767SAnurag.Maskey@Sun.COM nwam_unpack_object_list(char *packed_list, size_t packed_size, 47211767SAnurag.Maskey@Sun.COM void *list) 47311767SAnurag.Maskey@Sun.COM { 47411767SAnurag.Maskey@Sun.COM int nverr; 47511767SAnurag.Maskey@Sun.COM 47611767SAnurag.Maskey@Sun.COM assert(packed_list != NULL && list != NULL); 47711767SAnurag.Maskey@Sun.COM 47811767SAnurag.Maskey@Sun.COM *((nvlist_t **)list) = NULL; 47911767SAnurag.Maskey@Sun.COM 48011767SAnurag.Maskey@Sun.COM nverr = nvlist_unpack(packed_list, packed_size, (nvlist_t **)list, 0); 48111767SAnurag.Maskey@Sun.COM 48211767SAnurag.Maskey@Sun.COM if (nverr != 0) 48311767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 48411767SAnurag.Maskey@Sun.COM 48511767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 48611767SAnurag.Maskey@Sun.COM } 48711767SAnurag.Maskey@Sun.COM 48811767SAnurag.Maskey@Sun.COM /* 48911767SAnurag.Maskey@Sun.COM * Functions to walk, set and get properties in nvlist, translating 49011767SAnurag.Maskey@Sun.COM * between nwam_value_t and nvlist/nvpair representations. 49111767SAnurag.Maskey@Sun.COM */ 49211767SAnurag.Maskey@Sun.COM nwam_error_t 49311767SAnurag.Maskey@Sun.COM nwam_next_object_prop(void *list, char *lastname, char **namep, 49411767SAnurag.Maskey@Sun.COM nwam_value_t *valuep) 49511767SAnurag.Maskey@Sun.COM { 49611767SAnurag.Maskey@Sun.COM nvpair_t *last = NULL, *next; 49711767SAnurag.Maskey@Sun.COM int nverr; 49811767SAnurag.Maskey@Sun.COM 49911767SAnurag.Maskey@Sun.COM if (lastname != NULL) { 50011767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_lookup_nvpair(list, lastname, &last)) != 0) 50111767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 50211767SAnurag.Maskey@Sun.COM } 50311767SAnurag.Maskey@Sun.COM if ((next = nvlist_next_nvpair(list, last)) == NULL) 50411767SAnurag.Maskey@Sun.COM return (NWAM_LIST_END); 50511767SAnurag.Maskey@Sun.COM 50611767SAnurag.Maskey@Sun.COM *namep = nvpair_name(next); 50711767SAnurag.Maskey@Sun.COM 50811767SAnurag.Maskey@Sun.COM return (nwam_get_prop_value(list, (const char *)*namep, valuep)); 50911767SAnurag.Maskey@Sun.COM } 51011767SAnurag.Maskey@Sun.COM 51111767SAnurag.Maskey@Sun.COM nwam_error_t 51211767SAnurag.Maskey@Sun.COM nwam_get_prop_value(void *list, const char *name, nwam_value_t *valuep) 51311767SAnurag.Maskey@Sun.COM { 51411767SAnurag.Maskey@Sun.COM nvpair_t *prop; 51511767SAnurag.Maskey@Sun.COM nwam_error_t err; 51611767SAnurag.Maskey@Sun.COM int nverr; 51711767SAnurag.Maskey@Sun.COM boolean_t *valbool; 51811767SAnurag.Maskey@Sun.COM int64_t *valint64; 51911767SAnurag.Maskey@Sun.COM uint64_t *valuint64; 52011767SAnurag.Maskey@Sun.COM char **valstr; 52111767SAnurag.Maskey@Sun.COM uint_t numvalues; 52211767SAnurag.Maskey@Sun.COM 52311767SAnurag.Maskey@Sun.COM assert(valuep != NULL); 52411767SAnurag.Maskey@Sun.COM 52511767SAnurag.Maskey@Sun.COM *valuep = NULL; 52611767SAnurag.Maskey@Sun.COM 52711767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_lookup_nvpair(list, name, &prop)) != 0) { 52811767SAnurag.Maskey@Sun.COM /* convert EINVAL to NOT_FOUND */ 52911767SAnurag.Maskey@Sun.COM if (nverr == EINVAL) 53011767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_FOUND); 53111767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 53211767SAnurag.Maskey@Sun.COM } 53311767SAnurag.Maskey@Sun.COM 53411767SAnurag.Maskey@Sun.COM switch (nvpair_type(prop)) { 53511767SAnurag.Maskey@Sun.COM case DATA_TYPE_BOOLEAN_ARRAY: 53611767SAnurag.Maskey@Sun.COM if ((nverr = nvpair_value_boolean_array(prop, 53711767SAnurag.Maskey@Sun.COM &valbool, &numvalues)) != 0) 53811767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 53911767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_boolean_array(valbool, numvalues, 54011767SAnurag.Maskey@Sun.COM valuep)) != NWAM_SUCCESS) 54111767SAnurag.Maskey@Sun.COM return (err); 54211767SAnurag.Maskey@Sun.COM break; 54311767SAnurag.Maskey@Sun.COM case DATA_TYPE_INT64_ARRAY: 54411767SAnurag.Maskey@Sun.COM if ((nverr = nvpair_value_int64_array(prop, 54511767SAnurag.Maskey@Sun.COM &valint64, &numvalues)) != 0) 54611767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 54711767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_int64_array(valint64, numvalues, 54811767SAnurag.Maskey@Sun.COM valuep)) != NWAM_SUCCESS) 54911767SAnurag.Maskey@Sun.COM return (err); 55011767SAnurag.Maskey@Sun.COM break; 55111767SAnurag.Maskey@Sun.COM case DATA_TYPE_UINT64_ARRAY: 55211767SAnurag.Maskey@Sun.COM if ((nverr = nvpair_value_uint64_array(prop, 55311767SAnurag.Maskey@Sun.COM &valuint64, &numvalues)) != 0) 55411767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 55511767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64_array(valuint64, numvalues, 55611767SAnurag.Maskey@Sun.COM valuep)) != NWAM_SUCCESS) 55711767SAnurag.Maskey@Sun.COM return (err); 55811767SAnurag.Maskey@Sun.COM break; 55911767SAnurag.Maskey@Sun.COM case DATA_TYPE_STRING_ARRAY: 56011767SAnurag.Maskey@Sun.COM if ((nverr = nvpair_value_string_array(prop, 56111767SAnurag.Maskey@Sun.COM &valstr, &numvalues)) != 0) 56211767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 56311767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_string_array(valstr, numvalues, 56411767SAnurag.Maskey@Sun.COM valuep)) != NWAM_SUCCESS) 56511767SAnurag.Maskey@Sun.COM return (err); 56611767SAnurag.Maskey@Sun.COM break; 56711767SAnurag.Maskey@Sun.COM default: 56811767SAnurag.Maskey@Sun.COM /* Should not happen */ 56911767SAnurag.Maskey@Sun.COM return (NWAM_ERROR_INTERNAL); 57011767SAnurag.Maskey@Sun.COM } 57111767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 57211767SAnurag.Maskey@Sun.COM } 57311767SAnurag.Maskey@Sun.COM 57411767SAnurag.Maskey@Sun.COM nwam_error_t 57511767SAnurag.Maskey@Sun.COM nwam_delete_prop(void *list, const char *name) 57611767SAnurag.Maskey@Sun.COM { 57711767SAnurag.Maskey@Sun.COM int nverr; 57811767SAnurag.Maskey@Sun.COM 57911767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_remove_all(list, name)) != 0) 58011767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 58111767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 58211767SAnurag.Maskey@Sun.COM } 58311767SAnurag.Maskey@Sun.COM 58411767SAnurag.Maskey@Sun.COM nwam_error_t 58511767SAnurag.Maskey@Sun.COM nwam_set_prop_value(void *list, const char *propname, nwam_value_t value) 58611767SAnurag.Maskey@Sun.COM { 58711767SAnurag.Maskey@Sun.COM int nverr; 58811767SAnurag.Maskey@Sun.COM nwam_error_t err; 58911767SAnurag.Maskey@Sun.COM nwam_value_type_t type; 59011767SAnurag.Maskey@Sun.COM uint_t numvalues; 59111767SAnurag.Maskey@Sun.COM boolean_t *valbool; 59211767SAnurag.Maskey@Sun.COM int64_t *valint64; 59311767SAnurag.Maskey@Sun.COM uint64_t *valuint64; 59411767SAnurag.Maskey@Sun.COM char **valstr; 59511767SAnurag.Maskey@Sun.COM 59611767SAnurag.Maskey@Sun.COM assert(list != NULL && value != NULL); 59711767SAnurag.Maskey@Sun.COM 59811767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_type(value, &type)) != NWAM_SUCCESS) 59911767SAnurag.Maskey@Sun.COM return (err); 60011767SAnurag.Maskey@Sun.COM 60111767SAnurag.Maskey@Sun.COM switch (type) { 60211767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_BOOLEAN: 60311767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_boolean_array(value, &valbool, 60411767SAnurag.Maskey@Sun.COM &numvalues)) != NWAM_SUCCESS) 60511767SAnurag.Maskey@Sun.COM return (err); 60611767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_add_boolean_array(list, propname, 60711767SAnurag.Maskey@Sun.COM valbool, numvalues)) != 0) 60811767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 60911767SAnurag.Maskey@Sun.COM break; 61011767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_INT64: 61111767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_int64_array(value, &valint64, 61211767SAnurag.Maskey@Sun.COM &numvalues)) != NWAM_SUCCESS) 61311767SAnurag.Maskey@Sun.COM return (err); 61411767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_add_int64_array(list, propname, 61511767SAnurag.Maskey@Sun.COM valint64, numvalues)) != 0) 61611767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 61711767SAnurag.Maskey@Sun.COM break; 61811767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_UINT64: 61911767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_uint64_array(value, &valuint64, 62011767SAnurag.Maskey@Sun.COM &numvalues)) != NWAM_SUCCESS) 62111767SAnurag.Maskey@Sun.COM return (err); 62211767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_add_uint64_array(list, propname, 62311767SAnurag.Maskey@Sun.COM valuint64, numvalues)) != 0) 62411767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 62511767SAnurag.Maskey@Sun.COM break; 62611767SAnurag.Maskey@Sun.COM case NWAM_VALUE_TYPE_STRING: 62711767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_string_array(value, &valstr, 62811767SAnurag.Maskey@Sun.COM &numvalues)) != NWAM_SUCCESS) 62911767SAnurag.Maskey@Sun.COM return (err); 63011767SAnurag.Maskey@Sun.COM if ((nverr = nvlist_add_string_array(list, propname, 63111767SAnurag.Maskey@Sun.COM valstr, numvalues)) != 0) 63211767SAnurag.Maskey@Sun.COM return (nwam_errno_to_nwam_error(nverr)); 63311767SAnurag.Maskey@Sun.COM break; 63411767SAnurag.Maskey@Sun.COM default: 63511767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 63611767SAnurag.Maskey@Sun.COM } 63711767SAnurag.Maskey@Sun.COM 63811767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 63911767SAnurag.Maskey@Sun.COM } 64011767SAnurag.Maskey@Sun.COM 64111767SAnurag.Maskey@Sun.COM /* Map uint64 values to their string counterparts */ 64211767SAnurag.Maskey@Sun.COM 64311767SAnurag.Maskey@Sun.COM struct nwam_value_entry { 64411767SAnurag.Maskey@Sun.COM const char *value_string; 64511767SAnurag.Maskey@Sun.COM uint64_t value; 64611767SAnurag.Maskey@Sun.COM }; 64711767SAnurag.Maskey@Sun.COM 64811767SAnurag.Maskey@Sun.COM struct nwam_value_entry prop_activation_mode_value_entries[] = 64911767SAnurag.Maskey@Sun.COM { 65011767SAnurag.Maskey@Sun.COM { NWAM_ACTIVATION_MODE_MANUAL_STRING, NWAM_ACTIVATION_MODE_MANUAL }, 65111767SAnurag.Maskey@Sun.COM { NWAM_ACTIVATION_MODE_SYSTEM_STRING, NWAM_ACTIVATION_MODE_SYSTEM }, 65211767SAnurag.Maskey@Sun.COM { NWAM_ACTIVATION_MODE_CONDITIONAL_ANY_STRING, 65311767SAnurag.Maskey@Sun.COM NWAM_ACTIVATION_MODE_CONDITIONAL_ANY }, 65411767SAnurag.Maskey@Sun.COM { NWAM_ACTIVATION_MODE_CONDITIONAL_ALL_STRING, 65511767SAnurag.Maskey@Sun.COM NWAM_ACTIVATION_MODE_CONDITIONAL_ALL }, 65611767SAnurag.Maskey@Sun.COM { NWAM_ACTIVATION_MODE_PRIORITIZED_STRING, 65711767SAnurag.Maskey@Sun.COM NWAM_ACTIVATION_MODE_PRIORITIZED }, 65811767SAnurag.Maskey@Sun.COM { NULL, 0 } 65911767SAnurag.Maskey@Sun.COM }; 66011767SAnurag.Maskey@Sun.COM 66111767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_type_entries[] = 66211767SAnurag.Maskey@Sun.COM { 66311767SAnurag.Maskey@Sun.COM { NWAM_NCU_TYPE_LINK_STRING, NWAM_NCU_TYPE_LINK }, 66411767SAnurag.Maskey@Sun.COM { NWAM_NCU_TYPE_INTERFACE_STRING, NWAM_NCU_TYPE_INTERFACE }, 66511767SAnurag.Maskey@Sun.COM { NULL, 0 } 66611767SAnurag.Maskey@Sun.COM }; 66711767SAnurag.Maskey@Sun.COM 66811767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_class_entries[] = 66911767SAnurag.Maskey@Sun.COM { 67011767SAnurag.Maskey@Sun.COM { NWAM_NCU_CLASS_PHYS_STRING, NWAM_NCU_CLASS_PHYS }, 67111767SAnurag.Maskey@Sun.COM { NWAM_NCU_CLASS_IP_STRING, NWAM_NCU_CLASS_IP }, 67211767SAnurag.Maskey@Sun.COM { NULL, 0 } 67311767SAnurag.Maskey@Sun.COM }; 67411767SAnurag.Maskey@Sun.COM 67511767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_ip_version_entries[] = 67611767SAnurag.Maskey@Sun.COM { 67711767SAnurag.Maskey@Sun.COM { NWAM_IP_VERSION_IPV4_STRING, IPV4_VERSION }, 67811767SAnurag.Maskey@Sun.COM { NWAM_IP_VERSION_IPV6_STRING, IPV6_VERSION }, 67911767SAnurag.Maskey@Sun.COM { NULL, 0 } 68011767SAnurag.Maskey@Sun.COM }; 68111767SAnurag.Maskey@Sun.COM 68211767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_ipv4_addrsrc_entries[] = 68311767SAnurag.Maskey@Sun.COM { 68411767SAnurag.Maskey@Sun.COM { NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP }, 68511767SAnurag.Maskey@Sun.COM { NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC }, 68611767SAnurag.Maskey@Sun.COM { NULL, 0 } 68711767SAnurag.Maskey@Sun.COM }; 68811767SAnurag.Maskey@Sun.COM 68911767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_ipv6_addrsrc_entries[] = 69011767SAnurag.Maskey@Sun.COM { 69111767SAnurag.Maskey@Sun.COM { NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP }, 69211767SAnurag.Maskey@Sun.COM { NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC }, 69311767SAnurag.Maskey@Sun.COM { NWAM_ADDRSRC_AUTOCONF_STRING, NWAM_ADDRSRC_AUTOCONF }, 69411767SAnurag.Maskey@Sun.COM { NULL, 0 } 69511767SAnurag.Maskey@Sun.COM }; 69611767SAnurag.Maskey@Sun.COM 69711767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_priority_mode_entries[] = 69811767SAnurag.Maskey@Sun.COM { 69911767SAnurag.Maskey@Sun.COM { NWAM_PRIORITY_MODE_EXCLUSIVE_STRING, NWAM_PRIORITY_MODE_EXCLUSIVE }, 70011767SAnurag.Maskey@Sun.COM { NWAM_PRIORITY_MODE_SHARED_STRING, NWAM_PRIORITY_MODE_SHARED }, 70111767SAnurag.Maskey@Sun.COM { NWAM_PRIORITY_MODE_ALL_STRING, NWAM_PRIORITY_MODE_ALL }, 70211767SAnurag.Maskey@Sun.COM { NULL, 0 } 70311767SAnurag.Maskey@Sun.COM }; 70411767SAnurag.Maskey@Sun.COM 70511767SAnurag.Maskey@Sun.COM struct nwam_value_entry loc_prop_nameservices_entries[] = 70611767SAnurag.Maskey@Sun.COM { 70711767SAnurag.Maskey@Sun.COM { NWAM_NAMESERVICES_DNS_STRING, NWAM_NAMESERVICES_DNS }, 70811767SAnurag.Maskey@Sun.COM { NWAM_NAMESERVICES_FILES_STRING, NWAM_NAMESERVICES_FILES }, 70911767SAnurag.Maskey@Sun.COM { NWAM_NAMESERVICES_NIS_STRING, NWAM_NAMESERVICES_NIS }, 71011767SAnurag.Maskey@Sun.COM { NWAM_NAMESERVICES_LDAP_STRING, NWAM_NAMESERVICES_LDAP }, 71111767SAnurag.Maskey@Sun.COM { NULL, 0 } 71211767SAnurag.Maskey@Sun.COM }; 71311767SAnurag.Maskey@Sun.COM 71411767SAnurag.Maskey@Sun.COM struct nwam_value_entry loc_prop_nameservice_configsrc_entries[] = 71511767SAnurag.Maskey@Sun.COM { 71611767SAnurag.Maskey@Sun.COM { NWAM_CONFIGSRC_MANUAL_STRING, NWAM_CONFIGSRC_MANUAL }, 71711767SAnurag.Maskey@Sun.COM { NWAM_CONFIGSRC_DHCP_STRING, NWAM_CONFIGSRC_DHCP }, 71811767SAnurag.Maskey@Sun.COM { NULL, 0 } 71911767SAnurag.Maskey@Sun.COM }; 72011767SAnurag.Maskey@Sun.COM 72111767SAnurag.Maskey@Sun.COM struct nwam_value_entry known_wlan_prop_security_mode_entries[] = 72211767SAnurag.Maskey@Sun.COM { 72311767SAnurag.Maskey@Sun.COM { "none", DLADM_WLAN_SECMODE_NONE }, 72411767SAnurag.Maskey@Sun.COM { "wep", DLADM_WLAN_SECMODE_WEP }, 72511767SAnurag.Maskey@Sun.COM { "wpa", DLADM_WLAN_SECMODE_WPA }, 72611767SAnurag.Maskey@Sun.COM { NULL, 0 } 72711767SAnurag.Maskey@Sun.COM }; 72811767SAnurag.Maskey@Sun.COM 72911767SAnurag.Maskey@Sun.COM struct nwam_prop_value_entry { 73011767SAnurag.Maskey@Sun.COM const char *prop_name; 73111767SAnurag.Maskey@Sun.COM struct nwam_value_entry *value_entries; 73211767SAnurag.Maskey@Sun.COM } prop_value_entry_table[] = 73311767SAnurag.Maskey@Sun.COM { 73411767SAnurag.Maskey@Sun.COM { NWAM_NCU_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 73511767SAnurag.Maskey@Sun.COM { NWAM_NCU_PROP_TYPE, ncu_prop_type_entries }, 73611767SAnurag.Maskey@Sun.COM { NWAM_NCU_PROP_CLASS, ncu_prop_class_entries }, 73711767SAnurag.Maskey@Sun.COM { NWAM_NCU_PROP_IP_VERSION, ncu_prop_ip_version_entries }, 73811767SAnurag.Maskey@Sun.COM { NWAM_NCU_PROP_IPV4_ADDRSRC, ncu_prop_ipv4_addrsrc_entries }, 73911767SAnurag.Maskey@Sun.COM { NWAM_NCU_PROP_IPV6_ADDRSRC, ncu_prop_ipv6_addrsrc_entries }, 74011767SAnurag.Maskey@Sun.COM { NWAM_NCU_PROP_PRIORITY_MODE, ncu_prop_priority_mode_entries }, 74111767SAnurag.Maskey@Sun.COM { NWAM_ENM_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 74211767SAnurag.Maskey@Sun.COM { NWAM_LOC_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries }, 74311767SAnurag.Maskey@Sun.COM { NWAM_LOC_PROP_NAMESERVICES, loc_prop_nameservices_entries }, 74411767SAnurag.Maskey@Sun.COM { NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, 74511767SAnurag.Maskey@Sun.COM loc_prop_nameservice_configsrc_entries }, 74611767SAnurag.Maskey@Sun.COM { NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, 74711767SAnurag.Maskey@Sun.COM loc_prop_nameservice_configsrc_entries }, 74811767SAnurag.Maskey@Sun.COM { NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, 74911767SAnurag.Maskey@Sun.COM loc_prop_nameservice_configsrc_entries }, 75011767SAnurag.Maskey@Sun.COM { NWAM_KNOWN_WLAN_PROP_SECURITY_MODE, 75111767SAnurag.Maskey@Sun.COM known_wlan_prop_security_mode_entries }, 75211767SAnurag.Maskey@Sun.COM { NULL, NULL } 75311767SAnurag.Maskey@Sun.COM }; 75411767SAnurag.Maskey@Sun.COM 75511767SAnurag.Maskey@Sun.COM /* 75611767SAnurag.Maskey@Sun.COM * Convert uint64 values for property propname into a string representing 75711767SAnurag.Maskey@Sun.COM * that value. Used by enum values. 75811767SAnurag.Maskey@Sun.COM */ 75911767SAnurag.Maskey@Sun.COM nwam_error_t 76011767SAnurag.Maskey@Sun.COM nwam_uint64_get_value_string(const char *propname, uint64_t val, 76111767SAnurag.Maskey@Sun.COM const char **valstrp) 76211767SAnurag.Maskey@Sun.COM { 76311767SAnurag.Maskey@Sun.COM int i, j; 76411767SAnurag.Maskey@Sun.COM int max = 0; /* largest enum value seen so far */ 76511767SAnurag.Maskey@Sun.COM struct nwam_value_entry *value_entries; 76611767SAnurag.Maskey@Sun.COM 76711767SAnurag.Maskey@Sun.COM assert(propname != NULL && valstrp != NULL); 76811767SAnurag.Maskey@Sun.COM 76911767SAnurag.Maskey@Sun.COM for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) { 77011767SAnurag.Maskey@Sun.COM if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0) 77111767SAnurag.Maskey@Sun.COM continue; 77211767SAnurag.Maskey@Sun.COM 77311767SAnurag.Maskey@Sun.COM value_entries = prop_value_entry_table[i].value_entries; 77411767SAnurag.Maskey@Sun.COM 77511767SAnurag.Maskey@Sun.COM for (j = 0; value_entries[j].value_string != NULL; j++) { 77611767SAnurag.Maskey@Sun.COM if (value_entries[j].value == val) { 77711767SAnurag.Maskey@Sun.COM *valstrp = value_entries[j].value_string; 77811767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 77911767SAnurag.Maskey@Sun.COM } 78011767SAnurag.Maskey@Sun.COM max = value_entries[j].value > max ? 78111767SAnurag.Maskey@Sun.COM value_entries[j].value : max; 78211767SAnurag.Maskey@Sun.COM } 78311767SAnurag.Maskey@Sun.COM /* 78411767SAnurag.Maskey@Sun.COM * If trying to get the string for an enum value that doesn't 78511767SAnurag.Maskey@Sun.COM * exist, return NWAM_LIST_END. Otherwise, the input enum 78611767SAnurag.Maskey@Sun.COM * value doesn't exist for the given property. 78711767SAnurag.Maskey@Sun.COM */ 78811767SAnurag.Maskey@Sun.COM if (val > max) 78911767SAnurag.Maskey@Sun.COM return (NWAM_LIST_END); 79011767SAnurag.Maskey@Sun.COM else 79111767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 79211767SAnurag.Maskey@Sun.COM } 79311767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 79411767SAnurag.Maskey@Sun.COM } 79511767SAnurag.Maskey@Sun.COM 79611767SAnurag.Maskey@Sun.COM /* 79711767SAnurag.Maskey@Sun.COM * Convert string to appropriate uint64 value. 79811767SAnurag.Maskey@Sun.COM */ 79911767SAnurag.Maskey@Sun.COM nwam_error_t 80011767SAnurag.Maskey@Sun.COM nwam_value_string_get_uint64(const char *propname, const char *valstr, 80111767SAnurag.Maskey@Sun.COM uint64_t *valp) 80211767SAnurag.Maskey@Sun.COM { 80311767SAnurag.Maskey@Sun.COM int i, j; 80411767SAnurag.Maskey@Sun.COM struct nwam_value_entry *value_entries; 80511767SAnurag.Maskey@Sun.COM 80611767SAnurag.Maskey@Sun.COM assert(propname != NULL && valstr != NULL && valp != NULL); 80711767SAnurag.Maskey@Sun.COM 80811767SAnurag.Maskey@Sun.COM for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) { 80911767SAnurag.Maskey@Sun.COM if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0) 81011767SAnurag.Maskey@Sun.COM continue; 81111767SAnurag.Maskey@Sun.COM 81211767SAnurag.Maskey@Sun.COM value_entries = prop_value_entry_table[i].value_entries; 81311767SAnurag.Maskey@Sun.COM 81411767SAnurag.Maskey@Sun.COM for (j = 0; value_entries[j].value_string != NULL; j++) { 81511767SAnurag.Maskey@Sun.COM if (strcasecmp(value_entries[j].value_string, valstr) 81611767SAnurag.Maskey@Sun.COM == 0) { 81711767SAnurag.Maskey@Sun.COM *valp = value_entries[j].value; 81811767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 81911767SAnurag.Maskey@Sun.COM } 82011767SAnurag.Maskey@Sun.COM } 82111767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 82211767SAnurag.Maskey@Sun.COM } 82311767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 82411767SAnurag.Maskey@Sun.COM } 82511767SAnurag.Maskey@Sun.COM 82611767SAnurag.Maskey@Sun.COM /* Conditional activation functions */ 82711767SAnurag.Maskey@Sun.COM 82811767SAnurag.Maskey@Sun.COM nwam_error_t 82911767SAnurag.Maskey@Sun.COM nwam_condition_to_condition_string(nwam_condition_object_type_t object_type, 83011767SAnurag.Maskey@Sun.COM nwam_condition_t condition, const char *object_name, char **stringp) 83111767SAnurag.Maskey@Sun.COM { 83211767SAnurag.Maskey@Sun.COM char *object_type_string, *condition_string; 83311767SAnurag.Maskey@Sun.COM char *string; 83411767SAnurag.Maskey@Sun.COM 83511767SAnurag.Maskey@Sun.COM assert(stringp != NULL); 83611767SAnurag.Maskey@Sun.COM 83711767SAnurag.Maskey@Sun.COM *stringp = NULL; 83811767SAnurag.Maskey@Sun.COM 83911767SAnurag.Maskey@Sun.COM switch (object_type) { 84011767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_NCP: 84111767SAnurag.Maskey@Sun.COM object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCP_STRING; 84211767SAnurag.Maskey@Sun.COM break; 84311767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_NCU: 84411767SAnurag.Maskey@Sun.COM object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCU_STRING; 84511767SAnurag.Maskey@Sun.COM break; 84611767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ENM: 84711767SAnurag.Maskey@Sun.COM object_type_string = NWAM_CONDITION_OBJECT_TYPE_ENM_STRING; 84811767SAnurag.Maskey@Sun.COM break; 84911767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_LOC: 85011767SAnurag.Maskey@Sun.COM object_type_string = NWAM_CONDITION_OBJECT_TYPE_LOC_STRING; 85111767SAnurag.Maskey@Sun.COM break; 85211767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS: 85311767SAnurag.Maskey@Sun.COM object_type_string = 85411767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING; 85511767SAnurag.Maskey@Sun.COM break; 85611767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN: 85711767SAnurag.Maskey@Sun.COM object_type_string = 85811767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING; 85911767SAnurag.Maskey@Sun.COM break; 86011767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN: 86111767SAnurag.Maskey@Sun.COM object_type_string = 86211767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING; 86311767SAnurag.Maskey@Sun.COM break; 86411767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ESSID: 86511767SAnurag.Maskey@Sun.COM object_type_string = NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING; 86611767SAnurag.Maskey@Sun.COM break; 86711767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_BSSID: 86811767SAnurag.Maskey@Sun.COM object_type_string = NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING; 86911767SAnurag.Maskey@Sun.COM break; 87011767SAnurag.Maskey@Sun.COM default: 87111767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 87211767SAnurag.Maskey@Sun.COM 87311767SAnurag.Maskey@Sun.COM } 87411767SAnurag.Maskey@Sun.COM switch (condition) { 87511767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS: 87611767SAnurag.Maskey@Sun.COM condition_string = NWAM_CONDITION_IS_STRING; 87711767SAnurag.Maskey@Sun.COM break; 87811767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS_NOT: 87911767SAnurag.Maskey@Sun.COM condition_string = NWAM_CONDITION_IS_NOT_STRING; 88011767SAnurag.Maskey@Sun.COM break; 88111767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_CONTAINS: 88211767SAnurag.Maskey@Sun.COM if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN && 88311767SAnurag.Maskey@Sun.COM object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN && 88411767SAnurag.Maskey@Sun.COM object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID) 88511767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 88611767SAnurag.Maskey@Sun.COM condition_string = NWAM_CONDITION_CONTAINS_STRING; 88711767SAnurag.Maskey@Sun.COM break; 88811767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_DOES_NOT_CONTAIN: 88911767SAnurag.Maskey@Sun.COM if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN && 89011767SAnurag.Maskey@Sun.COM object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN && 89111767SAnurag.Maskey@Sun.COM object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID) 89211767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 89311767SAnurag.Maskey@Sun.COM 89411767SAnurag.Maskey@Sun.COM condition_string = NWAM_CONDITION_DOES_NOT_CONTAIN_STRING; 89511767SAnurag.Maskey@Sun.COM break; 89611767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS_IN_RANGE: 89711767SAnurag.Maskey@Sun.COM if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) 89811767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 89911767SAnurag.Maskey@Sun.COM condition_string = NWAM_CONDITION_IS_IN_RANGE_STRING; 90011767SAnurag.Maskey@Sun.COM break; 90111767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS_NOT_IN_RANGE: 90211767SAnurag.Maskey@Sun.COM if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) 90311767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 90411767SAnurag.Maskey@Sun.COM condition_string = NWAM_CONDITION_IS_NOT_IN_RANGE_STRING; 90511767SAnurag.Maskey@Sun.COM break; 90611767SAnurag.Maskey@Sun.COM default: 90711767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 90811767SAnurag.Maskey@Sun.COM break; 90911767SAnurag.Maskey@Sun.COM } 91011767SAnurag.Maskey@Sun.COM if ((string = malloc(NWAM_MAX_VALUE_LEN)) == NULL) 91111767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 91211767SAnurag.Maskey@Sun.COM switch (object_type) { 91311767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_NCP: 91411767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_NCU: 91511767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ENM: 91611767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_LOC: 91711767SAnurag.Maskey@Sun.COM (void) snprintf(string, NWAM_MAX_VALUE_LEN, 91811767SAnurag.Maskey@Sun.COM "%s %s %s active", object_type_string, 91911767SAnurag.Maskey@Sun.COM object_name, condition_string); 92011767SAnurag.Maskey@Sun.COM *stringp = string; 92111767SAnurag.Maskey@Sun.COM break; 92211767SAnurag.Maskey@Sun.COM 92311767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS: 92411767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN: 92511767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN: 92611767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ESSID: 92711767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_BSSID: 92811767SAnurag.Maskey@Sun.COM (void) snprintf(string, NWAM_MAX_VALUE_LEN, 92911767SAnurag.Maskey@Sun.COM "%s %s %s", object_type_string, 93011767SAnurag.Maskey@Sun.COM condition_string, object_name); 93111767SAnurag.Maskey@Sun.COM *stringp = string; 93211767SAnurag.Maskey@Sun.COM break; 93311767SAnurag.Maskey@Sun.COM 93411767SAnurag.Maskey@Sun.COM default: 93511767SAnurag.Maskey@Sun.COM free(string); 93611767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 93711767SAnurag.Maskey@Sun.COM 93811767SAnurag.Maskey@Sun.COM } 93911767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 94011767SAnurag.Maskey@Sun.COM } 94111767SAnurag.Maskey@Sun.COM 94211767SAnurag.Maskey@Sun.COM nwam_error_t 94311767SAnurag.Maskey@Sun.COM nwam_condition_string_to_condition(const char *string, 94411767SAnurag.Maskey@Sun.COM nwam_condition_object_type_t *object_typep, 94511767SAnurag.Maskey@Sun.COM nwam_condition_t *conditionp, char **object_namep) 94611767SAnurag.Maskey@Sun.COM { 94711767SAnurag.Maskey@Sun.COM char *copy, *lasts; 94811767SAnurag.Maskey@Sun.COM char *object_type_string, *object_name; 94911767SAnurag.Maskey@Sun.COM char *condition_string, *active_string; 95011767SAnurag.Maskey@Sun.COM 95111767SAnurag.Maskey@Sun.COM assert(string != NULL && object_typep != NULL && conditionp != NULL && 95211767SAnurag.Maskey@Sun.COM object_namep != NULL); 95311767SAnurag.Maskey@Sun.COM 95411767SAnurag.Maskey@Sun.COM if ((copy = strdup(string)) == NULL) 95511767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 95611767SAnurag.Maskey@Sun.COM 95711767SAnurag.Maskey@Sun.COM if ((object_type_string = strtok_r(copy, " \t", &lasts)) == NULL) { 95811767SAnurag.Maskey@Sun.COM free(copy); 95911767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 96011767SAnurag.Maskey@Sun.COM } 96111767SAnurag.Maskey@Sun.COM 96211767SAnurag.Maskey@Sun.COM if (strcmp(object_type_string, NWAM_CONDITION_OBJECT_TYPE_NCP_STRING) 96311767SAnurag.Maskey@Sun.COM == 0) 96411767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_NCP; 96511767SAnurag.Maskey@Sun.COM else if (strcmp(object_type_string, 96611767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_NCU_STRING) == 0) 96711767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_NCU; 96811767SAnurag.Maskey@Sun.COM else if (strcmp(object_type_string, 96911767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_ENM_STRING) == 0) 97011767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_ENM; 97111767SAnurag.Maskey@Sun.COM else if (strcmp(object_type_string, 97211767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_LOC_STRING) == 0) 97311767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_LOC; 97411767SAnurag.Maskey@Sun.COM else if (strcmp(object_type_string, 97511767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING) == 0) 97611767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS; 97711767SAnurag.Maskey@Sun.COM else if (strcmp(object_type_string, 97811767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING) == 0) 97911767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN; 98011767SAnurag.Maskey@Sun.COM else if (strcmp(object_type_string, 98111767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING) == 0) 98211767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN; 98311767SAnurag.Maskey@Sun.COM else if (strcmp(object_type_string, 98411767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING) == 0) 98511767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_ESSID; 98611767SAnurag.Maskey@Sun.COM else if (strcmp(object_type_string, 98711767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING) == 0) 98811767SAnurag.Maskey@Sun.COM *object_typep = NWAM_CONDITION_OBJECT_TYPE_BSSID; 98911767SAnurag.Maskey@Sun.COM else { 99011767SAnurag.Maskey@Sun.COM free(copy); 99111767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 99211767SAnurag.Maskey@Sun.COM } 99311767SAnurag.Maskey@Sun.COM 99411767SAnurag.Maskey@Sun.COM if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP || 99511767SAnurag.Maskey@Sun.COM *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU || 99611767SAnurag.Maskey@Sun.COM *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM || 99711767SAnurag.Maskey@Sun.COM *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) { 99811767SAnurag.Maskey@Sun.COM if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) { 99911767SAnurag.Maskey@Sun.COM free(copy); 100011767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 100111767SAnurag.Maskey@Sun.COM } 100211767SAnurag.Maskey@Sun.COM if ((*object_namep = strdup(object_name)) == NULL) { 100311767SAnurag.Maskey@Sun.COM free(copy); 100411767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 100511767SAnurag.Maskey@Sun.COM } 100611767SAnurag.Maskey@Sun.COM 100711767SAnurag.Maskey@Sun.COM } 100811767SAnurag.Maskey@Sun.COM 100911767SAnurag.Maskey@Sun.COM if ((condition_string = strtok_r(NULL, " \t", &lasts)) == NULL) { 101011767SAnurag.Maskey@Sun.COM free(copy); 101111767SAnurag.Maskey@Sun.COM if (*object_namep != NULL) 101211767SAnurag.Maskey@Sun.COM free(*object_namep); 101311767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 101411767SAnurag.Maskey@Sun.COM } 101511767SAnurag.Maskey@Sun.COM if (strcmp(condition_string, NWAM_CONDITION_IS_STRING) == 0) 101611767SAnurag.Maskey@Sun.COM *conditionp = NWAM_CONDITION_IS; 101711767SAnurag.Maskey@Sun.COM else if (strcmp(condition_string, NWAM_CONDITION_IS_NOT_STRING) == 0) 101811767SAnurag.Maskey@Sun.COM *conditionp = NWAM_CONDITION_IS_NOT; 101911767SAnurag.Maskey@Sun.COM else if (strcmp(condition_string, NWAM_CONDITION_CONTAINS_STRING) == 0) 102011767SAnurag.Maskey@Sun.COM *conditionp = NWAM_CONDITION_CONTAINS; 102111767SAnurag.Maskey@Sun.COM else if (strcmp(condition_string, 102211767SAnurag.Maskey@Sun.COM NWAM_CONDITION_DOES_NOT_CONTAIN_STRING) == 0) 102311767SAnurag.Maskey@Sun.COM *conditionp = NWAM_CONDITION_DOES_NOT_CONTAIN; 102411767SAnurag.Maskey@Sun.COM else if (strcmp(condition_string, 102511767SAnurag.Maskey@Sun.COM NWAM_CONDITION_IS_IN_RANGE_STRING) == 0) 102611767SAnurag.Maskey@Sun.COM *conditionp = NWAM_CONDITION_IS_IN_RANGE; 102711767SAnurag.Maskey@Sun.COM else if (strcmp(condition_string, 102811767SAnurag.Maskey@Sun.COM NWAM_CONDITION_IS_NOT_IN_RANGE_STRING) == 0) 102911767SAnurag.Maskey@Sun.COM *conditionp = NWAM_CONDITION_IS_NOT_IN_RANGE; 103011767SAnurag.Maskey@Sun.COM else { 103111767SAnurag.Maskey@Sun.COM free(copy); 103211767SAnurag.Maskey@Sun.COM if (*object_namep != NULL) 103311767SAnurag.Maskey@Sun.COM free(*object_namep); 103411767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 103511767SAnurag.Maskey@Sun.COM } 103611767SAnurag.Maskey@Sun.COM 103711767SAnurag.Maskey@Sun.COM if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP || 103811767SAnurag.Maskey@Sun.COM *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU || 103911767SAnurag.Maskey@Sun.COM *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM || 104011767SAnurag.Maskey@Sun.COM *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) { 104111767SAnurag.Maskey@Sun.COM if ((*conditionp != NWAM_CONDITION_IS && 104211767SAnurag.Maskey@Sun.COM *conditionp != NWAM_CONDITION_IS_NOT) || 104311767SAnurag.Maskey@Sun.COM (active_string = strtok_r(NULL, " \t", &lasts)) == NULL || 104411767SAnurag.Maskey@Sun.COM strcmp(active_string, NWAM_CONDITION_ACTIVE_STRING) != 0) { 104511767SAnurag.Maskey@Sun.COM free(copy); 104611767SAnurag.Maskey@Sun.COM free(*object_namep); 104711767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 104811767SAnurag.Maskey@Sun.COM } 104911767SAnurag.Maskey@Sun.COM } else { 105011767SAnurag.Maskey@Sun.COM switch (*conditionp) { 105111767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_CONTAINS: 105211767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_DOES_NOT_CONTAIN: 105311767SAnurag.Maskey@Sun.COM if (*object_typep != 105411767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN && 105511767SAnurag.Maskey@Sun.COM *object_typep != 105611767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN && 105711767SAnurag.Maskey@Sun.COM *object_typep != NWAM_CONDITION_OBJECT_TYPE_ESSID) { 105811767SAnurag.Maskey@Sun.COM free(copy); 105911767SAnurag.Maskey@Sun.COM free(*object_namep); 106011767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 106111767SAnurag.Maskey@Sun.COM } 106211767SAnurag.Maskey@Sun.COM break; 106311767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS_IN_RANGE: 106411767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS_NOT_IN_RANGE: 106511767SAnurag.Maskey@Sun.COM if (*object_typep != 106611767SAnurag.Maskey@Sun.COM NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) { 106711767SAnurag.Maskey@Sun.COM free(copy); 106811767SAnurag.Maskey@Sun.COM free(*object_namep); 106911767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 107011767SAnurag.Maskey@Sun.COM } 107111767SAnurag.Maskey@Sun.COM break; 107211767SAnurag.Maskey@Sun.COM } 107311767SAnurag.Maskey@Sun.COM 107411767SAnurag.Maskey@Sun.COM if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) { 107511767SAnurag.Maskey@Sun.COM free(copy); 107611767SAnurag.Maskey@Sun.COM free(*object_namep); 107711767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 107811767SAnurag.Maskey@Sun.COM } 107911767SAnurag.Maskey@Sun.COM if ((*object_namep = strdup(object_name)) == NULL) { 108011767SAnurag.Maskey@Sun.COM free(copy); 108111767SAnurag.Maskey@Sun.COM free(*object_namep); 108211767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY); 108311767SAnurag.Maskey@Sun.COM } 108411767SAnurag.Maskey@Sun.COM } 108511767SAnurag.Maskey@Sun.COM 108611767SAnurag.Maskey@Sun.COM free(copy); 108711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 108811767SAnurag.Maskey@Sun.COM } 108911767SAnurag.Maskey@Sun.COM 109011767SAnurag.Maskey@Sun.COM nwam_error_t 109111767SAnurag.Maskey@Sun.COM nwam_condition_rate(nwam_condition_object_type_t object_type, 109211767SAnurag.Maskey@Sun.COM nwam_condition_t condition, uint64_t *ratep) 109311767SAnurag.Maskey@Sun.COM { 109411767SAnurag.Maskey@Sun.COM assert(ratep != NULL); 109511767SAnurag.Maskey@Sun.COM 109611767SAnurag.Maskey@Sun.COM *ratep = 0; 109711767SAnurag.Maskey@Sun.COM 109811767SAnurag.Maskey@Sun.COM switch (object_type) { 109911767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_NCP: 110011767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_NCU: 110111767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ENM: 110211767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_LOC: 110311767SAnurag.Maskey@Sun.COM (*ratep)++; 110411767SAnurag.Maskey@Sun.COM /* FALLTHRU */ 110511767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN: 110611767SAnurag.Maskey@Sun.COM (*ratep)++; 110711767SAnurag.Maskey@Sun.COM /* FALLTHRU */ 110811767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN: 110911767SAnurag.Maskey@Sun.COM (*ratep)++; 111011767SAnurag.Maskey@Sun.COM /* FALLTHRU */ 111111767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS: 111211767SAnurag.Maskey@Sun.COM (*ratep)++; 111311767SAnurag.Maskey@Sun.COM /* FALLTHRU */ 111411767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_BSSID: 111511767SAnurag.Maskey@Sun.COM (*ratep)++; 111611767SAnurag.Maskey@Sun.COM /* FALLTHRU */ 111711767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_OBJECT_TYPE_ESSID: 111811767SAnurag.Maskey@Sun.COM (*ratep)++; 111911767SAnurag.Maskey@Sun.COM break; 112011767SAnurag.Maskey@Sun.COM default: 112111767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 112211767SAnurag.Maskey@Sun.COM } 112311767SAnurag.Maskey@Sun.COM 112411767SAnurag.Maskey@Sun.COM switch (condition) { 112511767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS: 112611767SAnurag.Maskey@Sun.COM (*ratep)++; 112711767SAnurag.Maskey@Sun.COM /* FALLTHRU */ 112811767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_CONTAINS: 112911767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS_IN_RANGE: 113011767SAnurag.Maskey@Sun.COM (*ratep)++; 113111767SAnurag.Maskey@Sun.COM /* FALLTHRU */ 113211767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_DOES_NOT_CONTAIN: 113311767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS_NOT_IN_RANGE: 113411767SAnurag.Maskey@Sun.COM (*ratep)++; 113511767SAnurag.Maskey@Sun.COM /* FALLTHRU */ 113611767SAnurag.Maskey@Sun.COM case NWAM_CONDITION_IS_NOT: 113711767SAnurag.Maskey@Sun.COM (*ratep)++; 113811767SAnurag.Maskey@Sun.COM break; 113911767SAnurag.Maskey@Sun.COM default: 114011767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 114111767SAnurag.Maskey@Sun.COM } 114211767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 114311767SAnurag.Maskey@Sun.COM } 1144