lin
2025-08-21 57113df3a0e2be01232281fad9a5f2c060567981
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/******************************************************************************
 *
 *  Copyright (C) 2009-2012 Xradio Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/
 
/******************************************************************************
 *
 *  Filename:      conf.c
 *
 *  Description:   Contains functions to conduct run-time module configuration
 *                 based on entries present in the .conf file
 *
 ******************************************************************************/
 
#define LOG_TAG "bt_vnd_conf"
 
#include <utils/Log.h>
#include <string.h>
#include <stdio.h>
#include "bt_vendor_xr.h"
 
/******************************************************************************
**  Externs
******************************************************************************/
extern int userial_set_bandrate(char *p_conf_name, char *p_conf_value, int param);
 
/******************************************************************************
**  Local type definitions
******************************************************************************/
 
#define CONF_COMMENT '#'
#define CONF_DELIMITERS " =\n\r\t"
#define CONF_VALUES_DELIMITERS "=\n\r\t"
#define CONF_MAX_LINE_LEN 255
 
typedef int (conf_action_t)(char *p_conf_name, char *p_conf_value, int param);
 
typedef struct {
    const char *conf_entry;
    conf_action_t *p_action;
    int param;
} conf_entry_t;
 
/******************************************************************************
**  Static variables
******************************************************************************/
 
/*
 * Current supported entries and corresponding action functions
 */
static const conf_entry_t conf_table[] = {
    {"Uartbandrate", userial_set_bandrate, 0},
    {(const char *) NULL, NULL, 0}
};
 
/*****************************************************************************
**   CONF INTERFACE FUNCTIONS
*****************************************************************************/
 
/*******************************************************************************
**
** Function        vnd_load_conf
**
** Description     Read conf entry from p_path file one by one and call
**                 the corresponding config function
**
** Returns         None
**
*******************************************************************************/
void vnd_load_conf(const char *p_path)
{
    FILE    *p_file;
    char    *p_name;
    char    *p_value;
    conf_entry_t    *p_entry;
    char    line[CONF_MAX_LINE_LEN+1]; /* add 1 for \0 char */
 
    ALOGI("Attempt to load conf from %s", p_path);
 
    if ((p_file = fopen(p_path, "r")) != NULL) {
        /* read line by line */
        while (fgets(line, CONF_MAX_LINE_LEN + 1, p_file) != NULL) {
            if (line[0] == CONF_COMMENT)
                continue;
 
            p_name = strtok(line, CONF_DELIMITERS);
 
            if (NULL == p_name)
                continue;
 
            p_value = strtok(NULL, CONF_DELIMITERS);
 
            if (NULL == p_value) {
                ALOGW("vnd_load_conf: missing value for name: %s", p_name);
                continue;
            }
 
            p_entry = (conf_entry_t *)conf_table;
 
            while (p_entry->conf_entry != NULL) {
                if (strcmp(p_entry->conf_entry, (const char *)p_name) == 0) {
                    p_entry->p_action(p_name, p_value, p_entry->param);
                    break;
                }
 
                p_entry++;
            }
        }
 
        fclose(p_file);
    } else {
        ALOGI("vnd_load_conf file >%s< not found", p_path);
    }
}