147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 2f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * 3f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * Redistribution and use in source and binary forms, with or without 4f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * modification, are permitted provided that the following conditions are 5f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * met: 6f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * * Redistributions of source code must retain the above copyright 7f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * notice, this list of conditions and the following disclaimer. 8f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * * Redistributions in binary form must reproduce the above 9f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * copyright notice, this list of conditions and the following 10f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * disclaimer in the documentation and/or other materials provided 11f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * with the distribution. 12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * * Neither the name of The Linux Foundation, nor the names of its 13f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * contributors may be used to endorse or promote products derived 14f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * from this software without specific prior written permission. 15f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * 16f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * 28f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani */ 29f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 30f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#define LOG_NDDEBUG 0 31f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#define LOG_TAG "LocSvc_utils_cfg" 32f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 33f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <stdio.h> 34f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <stdlib.h> 35f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <pthread.h> 36f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <string.h> 37f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <ctype.h> 38f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <unistd.h> 39f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <time.h> 40f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <loc_cfg.h> 41f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani#include <log_util.h> 4247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo#include <loc_misc_utils.h> 43e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#ifdef USE_GLIB 44e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <glib.h> 45e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#endif 46e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include "platform_lib_includes.h" 47f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 48f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani/*============================================================================= 49f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * 50f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * GLOBAL DATA DECLARATION 51f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * 52f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani *============================================================================*/ 53f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 54f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani/* Parameter data */ 550c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastavastatic uint32_t DEBUG_LEVEL = 0xff; 560c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastavastatic uint32_t TIMESTAMP = 0; 57f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 58f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani/* Parameter spec table */ 59fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangstatic loc_param_s_type loc_param_table[] = 60f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani{ 6147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo {"DEBUG_LEVEL", &DEBUG_LEVEL, NULL, 'n'}, 6247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo {"TIMESTAMP", &TIMESTAMP, NULL, 'n'}, 63f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani}; 64fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangint loc_param_num = sizeof(loc_param_table) / sizeof(loc_param_s_type); 65f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 6647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russotypedef struct loc_param_v_type 6747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{ 6847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo char* param_name; 6947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo char* param_str_value; 7047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo int param_int_value; 7147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo double param_double_value; 7247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo}loc_param_v_type; 7347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 74f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani/*=========================================================================== 7547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante RussoFUNCTION loc_set_config_entry 76f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 77f77c85bb51137f5ba854184e5e9194197027438aAjay DudaniDESCRIPTION 7847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo Potentially sets a given configuration table entry based on the passed in 7947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo configuration value. This is done by using a string comparison of the 8047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo parameter names and those found in the configuration file. 8147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 8247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante RussoPARAMETERS: 8347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo config_entry: configuration entry in the table to possibly set 8447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo config_value: value to store in the entry if the parameter names match 85f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 86f77c85bb51137f5ba854184e5e9194197027438aAjay DudaniDEPENDENCIES 87f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani N/A 88f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 89f77c85bb51137f5ba854184e5e9194197027438aAjay DudaniRETURN VALUE 90f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani None 91f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 92f77c85bb51137f5ba854184e5e9194197027438aAjay DudaniSIDE EFFECTS 93f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani N/A 94f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani===========================================================================*/ 9547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russoint loc_set_config_entry(loc_param_s_type* config_entry, loc_param_v_type* config_value) 96f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani{ 9747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo int ret=-1; 9847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL == config_entry || NULL == config_value) 9947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 10047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGE("%s: INVALID config entry or parameter", __FUNCTION__); 10147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo return ret; 10247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 10347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 10447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if (strcmp(config_entry->param_name, config_value->param_name) == 0 && 10547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo config_entry->param_ptr) 10647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 10747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo switch (config_entry->param_type) 10847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 10947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo case 's': 11047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if (strcmp(config_value->param_str_value, "NULL") == 0) 11147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 11247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo *((char*)config_entry->param_ptr) = '\0'; 11347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 11447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo else { 11547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo strlcpy((char*) config_entry->param_ptr, 11647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo config_value->param_str_value, 11747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_MAX_PARAM_STRING + 1); 11847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 11947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo /* Log INI values */ 120fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang LOC_LOGD("%s: PARAM %s = %s", __FUNCTION__, 121fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_entry->param_name, (char*)config_entry->param_ptr); 12247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 12347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL != config_entry->param_set) 12447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 12547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo *(config_entry->param_set) = 1; 12647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 12747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ret = 0; 12847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo break; 12947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo case 'n': 13047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo *((int *)config_entry->param_ptr) = config_value->param_int_value; 13147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo /* Log INI values */ 132fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang LOC_LOGD("%s: PARAM %s = %d", __FUNCTION__, 133fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_entry->param_name, config_value->param_int_value); 13447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 13547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL != config_entry->param_set) 13647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 13747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo *(config_entry->param_set) = 1; 13847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 13947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ret = 0; 14047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo break; 14147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo case 'f': 14247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo *((double *)config_entry->param_ptr) = config_value->param_double_value; 14347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo /* Log INI values */ 144fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang LOC_LOGD("%s: PARAM %s = %f", __FUNCTION__, 145fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_entry->param_name, config_value->param_double_value); 14647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 14747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL != config_entry->param_set) 14847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 14947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo *(config_entry->param_set) = 1; 15047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 15147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ret = 0; 15247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo break; 15347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo default: 154fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang LOC_LOGE("%s: PARAM %s parameter type must be n, f, or s", 155fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang __FUNCTION__, config_entry->param_name); 15647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 15747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 15847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo return ret; 159f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani} 160f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 161f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani/*=========================================================================== 162fe660078f05f448ececb0b1170ecd79e600db440Kevin TangFUNCTION loc_fill_conf_item 163fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 164fe660078f05f448ececb0b1170ecd79e600db440Kevin TangDESCRIPTION 165fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang Takes a line of configuration item and sets defined values based on 166fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang the passed in configuration table. This table maps strings to values to 167fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang set along with the type of each of these values. 168fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 169fe660078f05f448ececb0b1170ecd79e600db440Kevin TangPARAMETERS: 170fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang input_buf : buffer contanis config item 171fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_table: table definition of strings to places to store information 172fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang table_length: length of the configuration table 173fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 174fe660078f05f448ececb0b1170ecd79e600db440Kevin TangDEPENDENCIES 175fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang N/A 176fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 177fe660078f05f448ececb0b1170ecd79e600db440Kevin TangRETURN VALUE 1781300ae618a0e750e41a5ee22bc242a8e0a7951b5Kevin Tang 0: Number of records in the config_table filled with input_buf 179fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 180fe660078f05f448ececb0b1170ecd79e600db440Kevin TangSIDE EFFECTS 181fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang N/A 182fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang===========================================================================*/ 183fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangint loc_fill_conf_item(char* input_buf, 184fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang loc_param_s_type* config_table, uint32_t table_length) 185fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang{ 186fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang int ret = 0; 187fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 188fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang if (input_buf && config_table) { 189fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang char *lasts; 190fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang loc_param_v_type config_value; 191fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang memset(&config_value, 0, sizeof(config_value)); 192fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 193fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang /* Separate variable and value */ 194fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_value.param_name = strtok_r(input_buf, "=", &lasts); 195fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang /* skip lines that do not contain "=" */ 196fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang if (config_value.param_name) { 197fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_value.param_str_value = strtok_r(NULL, "=", &lasts); 198fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 199fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang /* skip lines that do not contain two operands */ 200fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang if (config_value.param_str_value) { 201fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang /* Trim leading and trailing spaces */ 202fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang loc_util_trim_space(config_value.param_name); 203fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang loc_util_trim_space(config_value.param_str_value); 204fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 205fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang /* Parse numerical value */ 206fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang if ((strlen(config_value.param_str_value) >=3) && 207fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang (config_value.param_str_value[0] == '0') && 208fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang (tolower(config_value.param_str_value[1]) == 'x')) 209fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang { 210fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang /* hex */ 211fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_value.param_int_value = (int) strtol(&config_value.param_str_value[2], 212fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang (char**) NULL, 16); 213fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang } 214fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang else { 215fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_value.param_double_value = (double) atof(config_value.param_str_value); /* float */ 216fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_value.param_int_value = atoi(config_value.param_str_value); /* dec */ 217fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang } 218fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 219fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang for(uint32_t i = 0; NULL != config_table && i < table_length; i++) 220fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang { 221fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang if(!loc_set_config_entry(&config_table[i], &config_value)) { 2221300ae618a0e750e41a5ee22bc242a8e0a7951b5Kevin Tang ret += 1; 223fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang } 224fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang } 225fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang } 226fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang } 227fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang } 228fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 229fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang return ret; 230fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang} 231fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 232fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang/*=========================================================================== 23347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante RussoFUNCTION loc_read_conf_r (repetitive) 234f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 235f77c85bb51137f5ba854184e5e9194197027438aAjay DudaniDESCRIPTION 23647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo Reads the specified configuration file and sets defined values based on 23747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo the passed in configuration table. This table maps strings to values to 23847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo set along with the type of each of these values. 23947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo The difference between this and loc_read_conf is that this function returns 24047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo the file pointer position at the end of filling a config table. Also, it 24147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo reads a fixed number of parameters at a time which is equal to the length 24247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo of the configuration table. This functionality enables the caller to 24347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo repeatedly call the function to read data from the same file. 244e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 245e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoPARAMETERS: 24647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo conf_fp : file pointer 24747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo config_table: table definition of strings to places to store information 24847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo table_length: length of the configuration table 249f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 250f77c85bb51137f5ba854184e5e9194197027438aAjay DudaniDEPENDENCIES 251f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani N/A 252f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 253f77c85bb51137f5ba854184e5e9194197027438aAjay DudaniRETURN VALUE 25447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 0: Table filled successfully 25547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 1: No more parameters to read 25647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo -1: Error filling table 257f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani 258f77c85bb51137f5ba854184e5e9194197027438aAjay DudaniSIDE EFFECTS 259f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani N/A 260f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani===========================================================================*/ 26147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russoint loc_read_conf_r(FILE *conf_fp, loc_param_s_type* config_table, uint32_t table_length) 262e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 26347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo int ret=0; 26447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 26547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo unsigned int num_params=table_length; 26647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(conf_fp == NULL) { 26747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGE("%s:%d]: ERROR: File pointer is NULL\n", __func__, __LINE__); 26847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ret = -1; 26947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo goto err; 27047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 27147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 27247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo /* Clear all validity bits */ 273fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang for(uint32_t i = 0; NULL != config_table && i < table_length; i++) 27447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 27547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL != config_table[i].param_set) 27647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 27747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo *(config_table[i].param_set) = 0; 27847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 27947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 280fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 281fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang char input_buf[LOC_MAX_PARAM_LINE]; /* declare a char array */ 282fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 28347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: num_params: %d\n", __func__, __LINE__, num_params); 28447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo while(num_params) 28547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 28647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(!fgets(input_buf, LOC_MAX_PARAM_LINE, conf_fp)) { 28747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: fgets returned NULL\n", __func__, __LINE__); 28847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo break; 28947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 29047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 291fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang num_params -= loc_fill_conf_item(input_buf, config_table, table_length); 292fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang } 29347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 294fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangerr: 295fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang return ret; 296fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang} 29747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 298fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang/*=========================================================================== 299fe660078f05f448ececb0b1170ecd79e600db440Kevin TangFUNCTION loc_udpate_conf 300fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 301fe660078f05f448ececb0b1170ecd79e600db440Kevin TangDESCRIPTION 302fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang Parses the passed in buffer for configuration items, and update the table 303fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang that is also passed in. 304fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 305fe660078f05f448ececb0b1170ecd79e600db440Kevin TangReads the specified configuration file and sets defined values based on 306fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang the passed in configuration table. This table maps strings to values to 307fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang set along with the type of each of these values. 308fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 309fe660078f05f448ececb0b1170ecd79e600db440Kevin TangPARAMETERS: 310fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang conf_data: configuration items in bufferas a string 311fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang length: strlen(conf_data) 312fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang config_table: table definition of strings to places to store information 313fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang table_length: length of the configuration table 314fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 315fe660078f05f448ececb0b1170ecd79e600db440Kevin TangDEPENDENCIES 316fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang N/A 317fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 318fe660078f05f448ececb0b1170ecd79e600db440Kevin TangRETURN VALUE 319fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang number of the records in the table that is updated at time of return. 320fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 321fe660078f05f448ececb0b1170ecd79e600db440Kevin TangSIDE EFFECTS 322fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang N/A 323fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang===========================================================================*/ 324fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangint loc_update_conf(const char* conf_data, int32_t length, 325fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang loc_param_s_type* config_table, uint32_t table_length) 326fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang{ 327fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang int ret = -1; 328fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang 329fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang if (conf_data && length && config_table && table_length) { 330fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang // make a copy, so we do not tokenize the original data 331fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang char* conf_copy = (char*)malloc(length+1); 332bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 3330c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava if (conf_copy != NULL) 334bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 3350c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava memcpy(conf_copy, conf_data, length); 3360c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava // we hard NULL the end of string to be safe 3370c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava conf_copy[length] = 0; 3380c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava 3390c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava // start with one record off 3400c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava uint32_t num_params = table_length - 1; 3410c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava char* saveptr = NULL; 3420c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava char* input_buf = strtok_r(conf_copy, "\n", &saveptr); 3430c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava ret = 0; 344bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 3450c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava LOC_LOGD("%s:%d]: num_params: %d\n", __func__, __LINE__, num_params); 3460c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava while(num_params && input_buf) { 3470c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava ret++; 3480c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava num_params -= loc_fill_conf_item(input_buf, config_table, table_length); 3490c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava input_buf = strtok_r(NULL, "\n", &saveptr); 3500c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava } 3510c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava free(conf_copy); 35247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 35347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 35447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 35547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo return ret; 356e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 357e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 358e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo/*=========================================================================== 359e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoFUNCTION loc_read_conf 360e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 361e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoDESCRIPTION 362e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo Reads the specified configuration file and sets defined values based on 363e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo the passed in configuration table. This table maps strings to values to 364e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo set along with the type of each of these values. 365e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 366e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoPARAMETERS: 367e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo conf_file_name: configuration file to read 368e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo config_table: table definition of strings to places to store information 369e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo table_length: length of the configuration table 370e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 371e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoDEPENDENCIES 372e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo N/A 373e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 374e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoRETURN VALUE 375e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo None 376e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 377e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoSIDE EFFECTS 378e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo N/A 379e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo===========================================================================*/ 38047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russovoid loc_read_conf(const char* conf_file_name, loc_param_s_type* config_table, 38147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo uint32_t table_length) 382f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani{ 383fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang FILE *conf_fp = NULL; 38447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo char *lasts; 38547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo loc_param_v_type config_value; 38647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo uint32_t i; 38747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 388fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang if((conf_fp = fopen(conf_file_name, "r")) != NULL) 38947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo { 39047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s: using %s", __FUNCTION__, conf_file_name); 39147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(table_length && config_table) { 392fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang loc_read_conf_r(conf_fp, config_table, table_length); 393fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang rewind(conf_fp); 39447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 395fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang loc_read_conf_r(conf_fp, loc_param_table, loc_param_num); 396fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang fclose(conf_fp); 39747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 39847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo /* Initialize logging mechanism with parsed data */ 39947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo loc_logger_init(DEBUG_LEVEL, TIMESTAMP); 400f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani} 401