18c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 28c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 38c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * Redistribution and use in source and binary forms, with or without 48c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * modification, are permitted provided that the following conditions are 58c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * met: 68c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Redistributions of source code must retain the above copyright 78c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * notice, this list of conditions and the following disclaimer. 88c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Redistributions in binary form must reproduce the above 98c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * copyright notice, this list of conditions and the following 108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * disclaimer in the documentation and/or other materials provided 118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * with the distribution. 128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Neither the name of The Linux Foundation, nor the names of its 138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * contributors may be used to endorse or promote products derived 148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * from this software without specific prior written permission. 158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam */ 298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_NDDEBUG 0 318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_TAG "LocSvc_utils_cfg" 328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdio.h> 348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdlib.h> 358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <pthread.h> 368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <string.h> 378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <ctype.h> 388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <unistd.h> 398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <time.h> 408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <loc_cfg.h> 418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <log_util.h> 428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <loc_misc_utils.h> 438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#ifdef USE_GLIB 448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <glib.h> 458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#endif 468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "platform_lib_includes.h" 478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*============================================================================= 498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * GLOBAL DATA DECLARATION 518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *============================================================================*/ 538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Parameter data */ 558c2d3d5afc51d3f35150f748f263870367771b6fEd Tamstatic uint32_t DEBUG_LEVEL = 0xff; 568c2d3d5afc51d3f35150f748f263870367771b6fEd Tamstatic uint32_t TIMESTAMP = 0; 578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Parameter spec table */ 598c2d3d5afc51d3f35150f748f263870367771b6fEd Tamstatic loc_param_s_type loc_param_table[] = 608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam {"DEBUG_LEVEL", &DEBUG_LEVEL, NULL, 'n'}, 628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam {"TIMESTAMP", &TIMESTAMP, NULL, 'n'}, 638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}; 648c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_param_num = sizeof(loc_param_table) / sizeof(loc_param_s_type); 658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 668c2d3d5afc51d3f35150f748f263870367771b6fEd Tamtypedef struct loc_param_v_type 678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char* param_name; 698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char* param_str_value; 708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int param_int_value; 718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam double param_double_value; 728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}loc_param_v_type; 738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 758c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_set_config_entry 768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 778c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Potentially sets a given configuration table entry based on the passed in 798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam configuration value. This is done by using a string comparison of the 808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam parameter names and those found in the configuration file. 818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 828c2d3d5afc51d3f35150f748f263870367771b6fEd TamPARAMETERS: 838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_entry: configuration entry in the table to possibly set 848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_value: value to store in the entry if the parameter names match 858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 868c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 898c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam None 918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 928c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 958c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_set_config_entry(loc_param_s_type* config_entry, loc_param_v_type* config_value) 968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int ret=-1; 988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(NULL == config_entry || NULL == config_value) 998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: INVALID config entry or parameter", __FUNCTION__); 1018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret; 1028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (strcmp(config_entry->param_name, config_value->param_name) == 0 && 1058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_entry->param_ptr) 1068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam switch (config_entry->param_type) 1088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case 's': 1108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (strcmp(config_value->param_str_value, "NULL") == 0) 1118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *((char*)config_entry->param_ptr) = '\0'; 1138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam else { 1158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam strlcpy((char*) config_entry->param_ptr, 1168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_value->param_str_value, 1178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_MAX_PARAM_STRING + 1); 1188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Log INI values */ 1208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s: PARAM %s = %s", __FUNCTION__, 1218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_entry->param_name, (char*)config_entry->param_ptr); 1228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(NULL != config_entry->param_set) 1248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *(config_entry->param_set) = 1; 1268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret = 0; 1288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 1298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case 'n': 1308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *((int *)config_entry->param_ptr) = config_value->param_int_value; 1318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Log INI values */ 1328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s: PARAM %s = %d", __FUNCTION__, 1338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_entry->param_name, config_value->param_int_value); 1348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(NULL != config_entry->param_set) 1368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *(config_entry->param_set) = 1; 1388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret = 0; 1408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 1418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case 'f': 1428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *((double *)config_entry->param_ptr) = config_value->param_double_value; 1438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Log INI values */ 1448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s: PARAM %s = %f", __FUNCTION__, 1458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_entry->param_name, config_value->param_double_value); 1468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(NULL != config_entry->param_set) 1488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *(config_entry->param_set) = 1; 1508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret = 0; 1528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 1538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam default: 1548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: PARAM %s parameter type must be n, f, or s", 1558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam __FUNCTION__, config_entry->param_name); 1568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret; 1598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 1628c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_fill_conf_item 1638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1648c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 1658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Takes a line of configuration item and sets defined values based on 1668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam the passed in configuration table. This table maps strings to values to 1678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam set along with the type of each of these values. 1688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1698c2d3d5afc51d3f35150f748f263870367771b6fEd TamPARAMETERS: 1708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam input_buf : buffer contanis config item 1718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_table: table definition of strings to places to store information 1728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam table_length: length of the configuration table 1738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1748c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 1758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 1768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1778c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 1788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 0: Number of records in the config_table filled with input_buf 1798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1808c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 1818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 1828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 1838c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_fill_conf_item(char* input_buf, 1848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_param_s_type* config_table, uint32_t table_length) 1858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int ret = 0; 1878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (input_buf && config_table) { 1898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char *lasts; 1908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_param_v_type config_value; 1918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam memset(&config_value, 0, sizeof(config_value)); 1928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Separate variable and value */ 1948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_value.param_name = strtok_r(input_buf, "=", &lasts); 1958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* skip lines that do not contain "=" */ 1968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (config_value.param_name) { 1978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_value.param_str_value = strtok_r(NULL, "=", &lasts); 1988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* skip lines that do not contain two operands */ 2008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (config_value.param_str_value) { 2018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Trim leading and trailing spaces */ 2028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_util_trim_space(config_value.param_name); 2038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_util_trim_space(config_value.param_str_value); 2048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Parse numerical value */ 2068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if ((strlen(config_value.param_str_value) >=3) && 2078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (config_value.param_str_value[0] == '0') && 2088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (tolower(config_value.param_str_value[1]) == 'x')) 2098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* hex */ 2118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_value.param_int_value = (int) strtol(&config_value.param_str_value[2], 2128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (char**) NULL, 16); 2138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam else { 2158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_value.param_double_value = (double) atof(config_value.param_str_value); /* float */ 2168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_value.param_int_value = atoi(config_value.param_str_value); /* dec */ 2178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam for(uint32_t i = 0; NULL != config_table && i < table_length; i++) 2208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(!loc_set_config_entry(&config_table[i], &config_value)) { 2228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret += 1; 2238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret; 2308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 2338c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_read_conf_r (repetitive) 2348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2358c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 2368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Reads the specified configuration file and sets defined values based on 2378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam the passed in configuration table. This table maps strings to values to 2388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam set along with the type of each of these values. 2398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam The difference between this and loc_read_conf is that this function returns 2408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam the file pointer position at the end of filling a config table. Also, it 2418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam reads a fixed number of parameters at a time which is equal to the length 2428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam of the configuration table. This functionality enables the caller to 2438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam repeatedly call the function to read data from the same file. 2448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2458c2d3d5afc51d3f35150f748f263870367771b6fEd TamPARAMETERS: 2468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam conf_fp : file pointer 2478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_table: table definition of strings to places to store information 2488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam table_length: length of the configuration table 2498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2508c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 2518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 2528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2538c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 2548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 0: Table filled successfully 2558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1: No more parameters to read 2568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam -1: Error filling table 2578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2588c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 2598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 2608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 2618c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_read_conf_r(FILE *conf_fp, loc_param_s_type* config_table, uint32_t table_length) 2628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 2638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int ret=0; 2648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam unsigned int num_params=table_length; 2668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(conf_fp == NULL) { 2678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s:%d]: ERROR: File pointer is NULL\n", __func__, __LINE__); 2688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret = -1; 2698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam goto err; 2708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Clear all validity bits */ 2738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam for(uint32_t i = 0; NULL != config_table && i < table_length; i++) 2748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(NULL != config_table[i].param_set) 2768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *(config_table[i].param_set) = 0; 2788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char input_buf[LOC_MAX_PARAM_LINE]; /* declare a char array */ 2828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s:%d]: num_params: %d\n", __func__, __LINE__, num_params); 2848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam while(num_params) 2858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(!fgets(input_buf, LOC_MAX_PARAM_LINE, conf_fp)) { 2878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s:%d]: fgets returned NULL\n", __func__, __LINE__); 2888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 2898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam num_params -= loc_fill_conf_item(input_buf, config_table, table_length); 2928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2948c2d3d5afc51d3f35150f748f263870367771b6fEd Tamerr: 2958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret; 2968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 2998c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_udpate_conf 3008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3018c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 3028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Parses the passed in buffer for configuration items, and update the table 3038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam that is also passed in. 3048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3058c2d3d5afc51d3f35150f748f263870367771b6fEd TamReads the specified configuration file and sets defined values based on 3068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam the passed in configuration table. This table maps strings to values to 3078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam set along with the type of each of these values. 3088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3098c2d3d5afc51d3f35150f748f263870367771b6fEd TamPARAMETERS: 3108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam conf_data: configuration items in bufferas a string 3118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam length: strlen(conf_data) 3128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_table: table definition of strings to places to store information 3138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam table_length: length of the configuration table 3148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3158c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 3168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 3178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3188c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 3198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam number of the records in the table that is updated at time of return. 3208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3218c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 3228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 3238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 3248c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_update_conf(const char* conf_data, int32_t length, 3258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_param_s_type* config_table, uint32_t table_length) 3268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 3278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int ret = -1; 3288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (conf_data && length && config_table && table_length) { 3308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam // make a copy, so we do not tokenize the original data 3318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char* conf_copy = (char*)malloc(length+1); 3328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (conf_copy != NULL) 3348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 3358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam memcpy(conf_copy, conf_data, length); 3368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam // we hard NULL the end of string to be safe 3378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam conf_copy[length] = 0; 3388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam // start with one record off 3408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam uint32_t num_params = table_length - 1; 3418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char* saveptr = NULL; 3428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char* input_buf = strtok_r(conf_copy, "\n", &saveptr); 3438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret = 0; 3448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s:%d]: num_params: %d\n", __func__, __LINE__, num_params); 3468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam while(num_params && input_buf) { 3478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret++; 3488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam num_params -= loc_fill_conf_item(input_buf, config_table, table_length); 3498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam input_buf = strtok_r(NULL, "\n", &saveptr); 3508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam free(conf_copy); 3528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret; 3568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 3578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 3598c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_read_conf 3608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3618c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 3628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Reads the specified configuration file and sets defined values based on 3638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam the passed in configuration table. This table maps strings to values to 3648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam set along with the type of each of these values. 3658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3668c2d3d5afc51d3f35150f748f263870367771b6fEd TamPARAMETERS: 3678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam conf_file_name: configuration file to read 3688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam config_table: table definition of strings to places to store information 3698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam table_length: length of the configuration table 3708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3718c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 3728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 3738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3748c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 3758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam None 3768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3778c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 3788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 3798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 3808c2d3d5afc51d3f35150f748f263870367771b6fEd Tamvoid loc_read_conf(const char* conf_file_name, loc_param_s_type* config_table, 3818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam uint32_t table_length) 3828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 3838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FILE *conf_fp = NULL; 3848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char *lasts; 3858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_param_v_type config_value; 3868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam uint32_t i; 3878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if((conf_fp = fopen(conf_file_name, "r")) != NULL) 3898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 3908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s: using %s", __FUNCTION__, conf_file_name); 3918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if(table_length && config_table) { 3928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_read_conf_r(conf_fp, config_table, table_length); 3938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rewind(conf_fp); 3948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_read_conf_r(conf_fp, loc_param_table, loc_param_num); 3968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam fclose(conf_fp); 3978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Initialize logging mechanism with parsed data */ 3998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_logger_init(DEBUG_LEVEL, TIMESTAMP); 4008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 401