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