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 /*
236ba597c5SAnurag S. Maskey  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
246ba597c5SAnurag S. Maskey  * Use is subject to license terms.
256ba597c5SAnurag S. Maskey  */
266ba597c5SAnurag S. Maskey 
276ba597c5SAnurag S. Maskey #include <arpa/inet.h>
286ba597c5SAnurag S. Maskey #include <assert.h>
296ba597c5SAnurag S. Maskey #include <atomic.h>
306ba597c5SAnurag S. Maskey #include <ctype.h>
316ba597c5SAnurag S. Maskey #include <errno.h>
326ba597c5SAnurag S. Maskey #include <inet/ip.h>
336ba597c5SAnurag S. Maskey #include <libintl.h>
346ba597c5SAnurag S. Maskey #include <libproc.h>
356ba597c5SAnurag S. Maskey #include <libscf.h>
366ba597c5SAnurag S. Maskey #include <net/if_dl.h>
376ba597c5SAnurag S. Maskey #include <netinet/in.h>
386ba597c5SAnurag S. Maskey #include <pthread.h>
396ba597c5SAnurag S. Maskey #include <stdio.h>
406ba597c5SAnurag S. Maskey #include <stdlib.h>
416ba597c5SAnurag S. Maskey #include <strings.h>
426ba597c5SAnurag S. Maskey #include <sys/mman.h>
436ba597c5SAnurag S. Maskey #include <sys/socket.h>
446ba597c5SAnurag S. Maskey #include <sys/types.h>
456ba597c5SAnurag S. Maskey #include <unistd.h>
466ba597c5SAnurag S. Maskey 
476ba597c5SAnurag S. Maskey #include "libnwam_impl.h"
486ba597c5SAnurag S. Maskey #include <libnwam_priv.h>
496ba597c5SAnurag S. Maskey #include <libnwam.h>
506ba597c5SAnurag S. Maskey 
516ba597c5SAnurag S. Maskey /*
526ba597c5SAnurag S. Maskey  * Utility functions for door access, common validation functions etc.
536ba597c5SAnurag S. Maskey  */
546ba597c5SAnurag S. Maskey 
556ba597c5SAnurag S. Maskey pthread_mutex_t door_mutex = PTHREAD_MUTEX_INITIALIZER;
566ba597c5SAnurag S. Maskey int nwam_door_fd = -1;
576ba597c5SAnurag S. Maskey 
586ba597c5SAnurag S. Maskey static int
open_door(const char * door_name,int * door_fdp)596ba597c5SAnurag S. Maskey open_door(const char *door_name, int *door_fdp)
606ba597c5SAnurag S. Maskey {
616ba597c5SAnurag S. Maskey 	struct door_info dinfo;
626ba597c5SAnurag S. Maskey 	int err = 0;
636ba597c5SAnurag S. Maskey 
646ba597c5SAnurag S. Maskey 	(void) pthread_mutex_lock(&door_mutex);
656ba597c5SAnurag S. Maskey 
666ba597c5SAnurag S. Maskey 	if (*door_fdp != -1) {
676ba597c5SAnurag S. Maskey 		/* Check door fd is not old (from previous nwamd). */
686ba597c5SAnurag S. Maskey 		if (door_info(*door_fdp, &dinfo) != 0 ||
696ba597c5SAnurag S. Maskey 		    (dinfo.di_attributes & DOOR_REVOKED) != 0) {
706ba597c5SAnurag S. Maskey 			(void) close(*door_fdp);
716ba597c5SAnurag S. Maskey 			*door_fdp = -1;
726ba597c5SAnurag S. Maskey 		}
736ba597c5SAnurag S. Maskey 	}
746ba597c5SAnurag S. Maskey 	if (*door_fdp == -1) {
756ba597c5SAnurag S. Maskey 		*door_fdp = open(door_name, 0);
766ba597c5SAnurag S. Maskey 		if (*door_fdp == -1)
776ba597c5SAnurag S. Maskey 			err = errno;
786ba597c5SAnurag S. Maskey 	}
796ba597c5SAnurag S. Maskey 
806ba597c5SAnurag S. Maskey 	(void) pthread_mutex_unlock(&door_mutex);
816ba597c5SAnurag S. Maskey 
826ba597c5SAnurag S. Maskey 	return (err);
836ba597c5SAnurag S. Maskey }
846ba597c5SAnurag S. Maskey 
856ba597c5SAnurag S. Maskey int
nwam_make_door_call(const char * door_name,int * door_fdp,void * request,size_t request_size)866ba597c5SAnurag S. Maskey nwam_make_door_call(const char *door_name, int *door_fdp,
876ba597c5SAnurag S. Maskey     void *request, size_t request_size)
886ba597c5SAnurag S. Maskey {
896ba597c5SAnurag S. Maskey 	int err;
906ba597c5SAnurag S. Maskey 	door_arg_t door_args;
916ba597c5SAnurag S. Maskey 
926ba597c5SAnurag S. Maskey 	door_args.data_ptr = (void *)request;
936ba597c5SAnurag S. Maskey 	door_args.data_size = request_size;
946ba597c5SAnurag S. Maskey 	door_args.desc_ptr = NULL;
956ba597c5SAnurag S. Maskey 	door_args.desc_num = 0;
966ba597c5SAnurag S. Maskey 	door_args.rbuf = (void *)request;
976ba597c5SAnurag S. Maskey 	door_args.rsize = request_size;
986ba597c5SAnurag S. Maskey 
996ba597c5SAnurag S. Maskey 	if ((err = open_door(door_name, door_fdp)) != 0)
1006ba597c5SAnurag S. Maskey 		return (err);
1016ba597c5SAnurag S. Maskey 
1026ba597c5SAnurag S. Maskey 	if (door_call(*door_fdp, &door_args) == -1)
1036ba597c5SAnurag S. Maskey 		return (errno);
1046ba597c5SAnurag S. Maskey 
1056ba597c5SAnurag S. Maskey 	return (0);
1066ba597c5SAnurag S. Maskey }
1076ba597c5SAnurag S. Maskey 
1086ba597c5SAnurag S. Maskey static nwam_error_t
send_msg_to_nwam(nwamd_door_arg_t * request)1096ba597c5SAnurag S. Maskey send_msg_to_nwam(nwamd_door_arg_t *request)
1106ba597c5SAnurag S. Maskey {
1116ba597c5SAnurag S. Maskey 	int err;
1126ba597c5SAnurag S. Maskey 
1136ba597c5SAnurag S. Maskey 	if ((err = nwam_make_door_call(NWAM_DOOR, &nwam_door_fd,
1146ba597c5SAnurag S. Maskey 	    request, sizeof (nwamd_door_arg_t))) != 0) {
1156ba597c5SAnurag S. Maskey 		if (err == ENOENT)
1166ba597c5SAnurag S. Maskey 			return (NWAM_ERROR_BIND);
1176ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(err));
1186ba597c5SAnurag S. Maskey 	}
1196ba597c5SAnurag S. Maskey 
1206ba597c5SAnurag S. Maskey 	switch (request->nwda_status) {
1216ba597c5SAnurag S. Maskey 	case NWAM_REQUEST_STATUS_OK:
1226ba597c5SAnurag S. Maskey 		return (NWAM_SUCCESS);
1236ba597c5SAnurag S. Maskey 	case NWAM_REQUEST_STATUS_UNKNOWN:
1246ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
1256ba597c5SAnurag S. Maskey 	case NWAM_REQUEST_STATUS_ALREADY:
1266ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_IN_USE);
1276ba597c5SAnurag S. Maskey 	case NWAM_REQUEST_STATUS_FAILED:
1286ba597c5SAnurag S. Maskey 		return (request->nwda_error);
1296ba597c5SAnurag S. Maskey 	default:
1306ba597c5SAnurag S. Maskey 		return (NWAM_ERROR_INTERNAL);
1316ba597c5SAnurag S. Maskey 	}
1326ba597c5SAnurag S. Maskey }
1336ba597c5SAnurag S. Maskey 
1346ba597c5SAnurag S. Maskey nwam_error_t
nwam_request_register_unregister(nwam_request_type_t type,const char * event_msg_file)1356ba597c5SAnurag S. Maskey nwam_request_register_unregister(nwam_request_type_t type,
1366ba597c5SAnurag S. Maskey     const char *event_msg_file)
1376ba597c5SAnurag S. Maskey {
1386ba597c5SAnurag S. Maskey 	nwamd_door_arg_t req;
1396ba597c5SAnurag S. Maskey 
1406ba597c5SAnurag S. Maskey 	req.nwda_type = type;
1416ba597c5SAnurag S. Maskey 
1426ba597c5SAnurag S. Maskey 	(void) strlcpy(req.nwda_data.nwdad_register_info.nwdad_name,
1436ba597c5SAnurag S. Maskey 	    event_msg_file,
1446ba597c5SAnurag S. Maskey 	    sizeof (req.nwda_data.nwdad_register_info.nwdad_name));
1456ba597c5SAnurag S. Maskey 
1466ba597c5SAnurag S. Maskey 	return (send_msg_to_nwam(&req));
1476ba597c5SAnurag S. Maskey }
1486ba597c5SAnurag S. Maskey 
1496ba597c5SAnurag S. Maskey nwam_error_t
nwam_request_action(nwam_object_type_t object_type,const char * name,const char * parent,nwam_action_t action)1506ba597c5SAnurag S. Maskey nwam_request_action(nwam_object_type_t object_type,
1516ba597c5SAnurag S. Maskey     const char *name, const char *parent, nwam_action_t action)
1526ba597c5SAnurag S. Maskey {
1536ba597c5SAnurag S. Maskey 	nwamd_door_arg_t req;
1546ba597c5SAnurag S. Maskey 
1556ba597c5SAnurag S. Maskey 	assert(name != NULL);
1566ba597c5SAnurag S. Maskey 
1576ba597c5SAnurag S. Maskey 	req.nwda_type = NWAM_REQUEST_TYPE_ACTION;
1586ba597c5SAnurag S. Maskey 	req.nwda_data.nwdad_object_action.nwdad_object_type = object_type;
1596ba597c5SAnurag S. Maskey 	req.nwda_data.nwdad_object_action.nwdad_action = action;
1606ba597c5SAnurag S. Maskey 	(void) strlcpy(req.nwda_data.nwdad_object_action.nwdad_name, name,
1616ba597c5SAnurag S. Maskey 	    sizeof (req.nwda_data.nwdad_object_action.nwdad_name));
1626ba597c5SAnurag S. Maskey 	if (parent != NULL) {
1636ba597c5SAnurag S. Maskey 		(void) strlcpy(req.nwda_data.nwdad_object_action.nwdad_parent,
1646ba597c5SAnurag S. Maskey 		    parent,
1656ba597c5SAnurag S. Maskey 		    sizeof (req.nwda_data.nwdad_object_action.nwdad_parent));
1666ba597c5SAnurag S. Maskey 	} else {
1676ba597c5SAnurag S. Maskey 		req.nwda_data.nwdad_object_action.nwdad_parent[0] = '\0';
1686ba597c5SAnurag S. Maskey 	}
1696ba597c5SAnurag S. Maskey 
1706ba597c5SAnurag S. Maskey 	return (send_msg_to_nwam(&req));
1716ba597c5SAnurag S. Maskey }
1726ba597c5SAnurag S. Maskey 
1736ba597c5SAnurag S. Maskey nwam_error_t
nwam_request_state(nwam_object_type_t object_type,const char * name,const char * parent,nwam_state_t * statep,nwam_aux_state_t * auxp)1746ba597c5SAnurag S. Maskey nwam_request_state(nwam_object_type_t object_type, const char *name,
1756ba597c5SAnurag S. Maskey     const char *parent, nwam_state_t *statep, nwam_aux_state_t *auxp)
1766ba597c5SAnurag S. Maskey {
1776ba597c5SAnurag S. Maskey 	nwamd_door_arg_t req;
1786ba597c5SAnurag S. Maskey 	nwam_error_t err;
1796ba597c5SAnurag S. Maskey 
1806ba597c5SAnurag S. Maskey 	assert(name != NULL && statep != NULL && auxp != NULL);
1816ba597c5SAnurag S. Maskey 
1826ba597c5SAnurag S. Maskey 	req.nwda_type = NWAM_REQUEST_TYPE_STATE;
1836ba597c5SAnurag S. Maskey 
1846ba597c5SAnurag S. Maskey 	req.nwda_data.nwdad_object_state.nwdad_object_type = object_type;
1856ba597c5SAnurag S. Maskey 
1866ba597c5SAnurag S. Maskey 	(void) strlcpy(req.nwda_data.nwdad_object_state.nwdad_name, name,
1876ba597c5SAnurag S. Maskey 	    sizeof (req.nwda_data.nwdad_object_state.nwdad_name));
1886ba597c5SAnurag S. Maskey 	if (parent != NULL) {
1896ba597c5SAnurag S. Maskey 		(void) strlcpy(req.nwda_data.nwdad_object_state.nwdad_parent,
1906ba597c5SAnurag S. Maskey 		    parent,
1916ba597c5SAnurag S. Maskey 		    sizeof (req.nwda_data.nwdad_object_state.nwdad_parent));
1926ba597c5SAnurag S. Maskey 	}
1936ba597c5SAnurag S. Maskey 
1946ba597c5SAnurag S. Maskey 	err = send_msg_to_nwam(&req);
1956ba597c5SAnurag S. Maskey 
1966ba597c5SAnurag S. Maskey 	if (err == NWAM_SUCCESS) {
1976ba597c5SAnurag S. Maskey 		*statep = req.nwda_data.nwdad_object_state.nwdad_state;
1986ba597c5SAnurag S. Maskey 		*auxp = req.nwda_data.nwdad_object_state.nwdad_aux_state;
1996ba597c5SAnurag S. Maskey 	}
2006ba597c5SAnurag S. Maskey 
2016ba597c5SAnurag S. Maskey 	return (err);
2026ba597c5SAnurag S. Maskey }
2036ba597c5SAnurag S. Maskey 
2046ba597c5SAnurag S. Maskey nwam_error_t
nwam_request_wlan(nwam_request_type_t type,const char * name,const char * essid,const char * bssid,uint32_t security_mode,uint_t keyslot,const char * key,boolean_t add_to_known_wlans)2056ba597c5SAnurag S. Maskey nwam_request_wlan(nwam_request_type_t type, const char *name,
2066ba597c5SAnurag S. Maskey     const char *essid, const char *bssid, uint32_t security_mode,
2076ba597c5SAnurag S. Maskey     uint_t keyslot, const char *key, boolean_t add_to_known_wlans)
2086ba597c5SAnurag S. Maskey {
2096ba597c5SAnurag S. Maskey 	nwamd_door_arg_t req;
2106ba597c5SAnurag S. Maskey 
2116ba597c5SAnurag S. Maskey 	assert(name != NULL);
2126ba597c5SAnurag S. Maskey 
2136ba597c5SAnurag S. Maskey 	req.nwda_type = type;
2146ba597c5SAnurag S. Maskey 
2156ba597c5SAnurag S. Maskey 	(void) strlcpy(req.nwda_data.nwdad_wlan_info.nwdad_name, name,
2166ba597c5SAnurag S. Maskey 	    sizeof (req.nwda_data.nwdad_wlan_info));
2176ba597c5SAnurag S. Maskey 	if (essid != NULL) {
2186ba597c5SAnurag S. Maskey 		(void) strlcpy(req.nwda_data.nwdad_wlan_info.nwdad_essid, essid,
2196ba597c5SAnurag S. Maskey 		    sizeof (req.nwda_data.nwdad_wlan_info.nwdad_essid));
2206ba597c5SAnurag S. Maskey 	} else {
2216ba597c5SAnurag S. Maskey 		req.nwda_data.nwdad_wlan_info.nwdad_essid[0] = '\0';
2226ba597c5SAnurag S. Maskey 	}
2236ba597c5SAnurag S. Maskey 	if (bssid != NULL) {
2246ba597c5SAnurag S. Maskey 		(void) strlcpy(req.nwda_data.nwdad_wlan_info.nwdad_bssid, bssid,
2256ba597c5SAnurag S. Maskey 		    sizeof (req.nwda_data.nwdad_wlan_info.nwdad_bssid));
2266ba597c5SAnurag S. Maskey 	} else {
2276ba597c5SAnurag S. Maskey 		req.nwda_data.nwdad_wlan_info.nwdad_bssid[0] = '\0';
2286ba597c5SAnurag S. Maskey 	}
2296ba597c5SAnurag S. Maskey 	if (key != NULL) {
2306ba597c5SAnurag S. Maskey 		(void) strlcpy(req.nwda_data.nwdad_wlan_info.nwdad_key, key,
2316ba597c5SAnurag S. Maskey 		    sizeof (req.nwda_data.nwdad_wlan_info.nwdad_key));
2326ba597c5SAnurag S. Maskey 		req.nwda_data.nwdad_wlan_info.nwdad_keyslot = keyslot;
2336ba597c5SAnurag S. Maskey 	} else {
2346ba597c5SAnurag S. Maskey 		req.nwda_data.nwdad_wlan_info.nwdad_key[0] = '\0';
2356ba597c5SAnurag S. Maskey 	}
2366ba597c5SAnurag S. Maskey 
2376ba597c5SAnurag S. Maskey 	req.nwda_data.nwdad_wlan_info.nwdad_security_mode = security_mode;
2386ba597c5SAnurag S. Maskey 	req.nwda_data.nwdad_wlan_info.nwdad_add_to_known_wlans =
2396ba597c5SAnurag S. Maskey 	    add_to_known_wlans;
2406ba597c5SAnurag S. Maskey 
2416ba597c5SAnurag S. Maskey 	return (send_msg_to_nwam(&req));
2426ba597c5SAnurag S. Maskey }
2436ba597c5SAnurag S. Maskey 
2446ba597c5SAnurag S. Maskey nwam_error_t
nwam_request_wlan_scan_results(const char * name,uint_t * num_wlansp,nwam_wlan_t ** wlansp)2456ba597c5SAnurag S. Maskey nwam_request_wlan_scan_results(const char *name, uint_t *num_wlansp,
2466ba597c5SAnurag S. Maskey     nwam_wlan_t **wlansp)
2476ba597c5SAnurag S. Maskey {
2486ba597c5SAnurag S. Maskey 	nwamd_door_arg_t req;
2496ba597c5SAnurag S. Maskey 	nwam_error_t err;
2506ba597c5SAnurag S. Maskey 
2516ba597c5SAnurag S. Maskey 	assert(name != NULL && num_wlansp != NULL && wlansp != NULL);
2526ba597c5SAnurag S. Maskey 
2536ba597c5SAnurag S. Maskey 	req.nwda_type = NWAM_REQUEST_TYPE_WLAN_SCAN_RESULTS;
2546ba597c5SAnurag S. Maskey 
2556ba597c5SAnurag S. Maskey 	(void) strlcpy(req.nwda_data.nwdad_wlan_info.nwdad_name, name,
2566ba597c5SAnurag S. Maskey 	    sizeof (req.nwda_data.nwdad_wlan_info.nwdad_name));
2576ba597c5SAnurag S. Maskey 
2586ba597c5SAnurag S. Maskey 	if ((err = send_msg_to_nwam(&req)) != NWAM_SUCCESS)
2596ba597c5SAnurag S. Maskey 		return (err);
2606ba597c5SAnurag S. Maskey 
2616ba597c5SAnurag S. Maskey 	*num_wlansp = req.nwda_data.nwdad_wlan_info.nwdad_num_wlans;
2626ba597c5SAnurag S. Maskey 
2636ba597c5SAnurag S. Maskey 	*wlansp = calloc(*num_wlansp, sizeof (nwam_wlan_t));
2646ba597c5SAnurag S. Maskey 	if (*wlansp == NULL)
2656ba597c5SAnurag S. Maskey 		return (NWAM_NO_MEMORY);
2666ba597c5SAnurag S. Maskey 
2676ba597c5SAnurag S. Maskey 	(void) memcpy(*wlansp, req.nwda_data.nwdad_wlan_info.nwdad_wlans,
2686ba597c5SAnurag S. Maskey 	    *num_wlansp * sizeof (nwam_wlan_t));
2696ba597c5SAnurag S. Maskey 
2706ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
2716ba597c5SAnurag S. Maskey }
2726ba597c5SAnurag S. Maskey 
2736ba597c5SAnurag S. Maskey nwam_error_t
nwam_request_active_priority_group(int64_t * priorityp)2746ba597c5SAnurag S. Maskey nwam_request_active_priority_group(int64_t *priorityp)
2756ba597c5SAnurag S. Maskey {
2766ba597c5SAnurag S. Maskey 	nwamd_door_arg_t req;
2776ba597c5SAnurag S. Maskey 	nwam_error_t err;
2786ba597c5SAnurag S. Maskey 
2796ba597c5SAnurag S. Maskey 	assert(priorityp != NULL);
2806ba597c5SAnurag S. Maskey 
2816ba597c5SAnurag S. Maskey 	req.nwda_type = NWAM_REQUEST_TYPE_PRIORITY_GROUP;
2826ba597c5SAnurag S. Maskey 	err = send_msg_to_nwam(&req);
2836ba597c5SAnurag S. Maskey 
2846ba597c5SAnurag S. Maskey 	if (err == NWAM_SUCCESS)
2856ba597c5SAnurag S. Maskey 		*priorityp =
2866ba597c5SAnurag S. Maskey 		    req.nwda_data.nwdad_priority_group_info.nwdad_priority;
2876ba597c5SAnurag S. Maskey 
2886ba597c5SAnurag S. Maskey 	return (err);
2896ba597c5SAnurag S. Maskey }
2906ba597c5SAnurag S. Maskey 
2916ba597c5SAnurag S. Maskey /* String conversion functions */
2926ba597c5SAnurag S. Maskey 
2936ba597c5SAnurag S. Maskey const char *
nwam_value_type_to_string(nwam_value_type_t type)2946ba597c5SAnurag S. Maskey nwam_value_type_to_string(nwam_value_type_t type)
2956ba597c5SAnurag S. Maskey {
2966ba597c5SAnurag S. Maskey 	switch (type) {
2976ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
2986ba597c5SAnurag S. Maskey 		return ("boolean");
2996ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
3006ba597c5SAnurag S. Maskey 		return ("int64");
3016ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
3026ba597c5SAnurag S. Maskey 		return ("uint64");
3036ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
3046ba597c5SAnurag S. Maskey 		return ("string");
3056ba597c5SAnurag S. Maskey 	default:
3066ba597c5SAnurag S. Maskey 		return ("unknown");
3076ba597c5SAnurag S. Maskey 	}
3086ba597c5SAnurag S. Maskey }
3096ba597c5SAnurag S. Maskey 
3106ba597c5SAnurag S. Maskey nwam_value_type_t
nwam_string_to_value_type(const char * typestr)3116ba597c5SAnurag S. Maskey nwam_string_to_value_type(const char *typestr)
3126ba597c5SAnurag S. Maskey {
3136ba597c5SAnurag S. Maskey 	if (strncmp(typestr, nwam_value_type_to_string(NWAM_VALUE_TYPE_BOOLEAN),
3146ba597c5SAnurag S. Maskey 	    strlen(typestr)) == 0)
3156ba597c5SAnurag S. Maskey 		return (NWAM_VALUE_TYPE_BOOLEAN);
3166ba597c5SAnurag S. Maskey 	if (strncmp(typestr, nwam_value_type_to_string(NWAM_VALUE_TYPE_INT64),
3176ba597c5SAnurag S. Maskey 	    strlen(typestr)) == 0)
3186ba597c5SAnurag S. Maskey 		return (NWAM_VALUE_TYPE_INT64);