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