1 /**************************************************************************
5 * Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
7 * Contact: Eunchul Kim <chulspro.kim@samsung.com>,
8 * JinYoung Jeon <jy0.jeon@samsung.com>,
9 * Taeheon Kim <th908.kim@samsung.com>,
10 * YoungJun Cho <yj44.cho@samsung.com>,
11 * SooChan Lim <sc1.lim@samsung.com>,
12 * Boram Park <sc1.lim@samsung.com>
14 * Permission is hereby granted, free of charge, to any person obtaining a
15 * copy of this software and associated documentation files (the
16 * "Software"), to deal in the Software without restriction, including
17 * without limitation the rights to use, copy, modify, merge, publish,
18 * distribute, sub license, and/or sell copies of the Software, and to
19 * permit persons to whom the Software is furnished to do so, subject to
20 * the following conditions:
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
27 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
29 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
30 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
31 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
32 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 **************************************************************************/
40 #include <iniparser.h>
43 #include "tdm_macro.h"
46 #include "tdm_private.h"
47 #include "tdm_config.h"
49 #define TDM_CONFIG_FILENAME "tdm.ini"
50 #define TDM_CONFIG_GENERAL_SECTION "general"
52 static pthread_mutex_t g_dic_lock = PTHREAD_MUTEX_INITIALIZER;
53 static dictionary *g_dic = NULL;
56 _tdm_config_check_file_owner(const char *filepath)
60 if (stat(filepath, &sb) < 0) {
61 TDM_WRN("%s: %m", filepath);
65 if (sb.st_uid != getuid()) {
66 TDM_WRN("'%s': not owned by %u", filepath, getuid());
74 _tdm_config_load_file(const char *dir, const char *filename)
76 char filepath[TDM_PATH_LEN];
79 snprintf(filepath, sizeof filepath, "%s/%s", dir, filename);
81 if (_tdm_config_check_file_owner(filepath) < 0)
84 dic = iniparser_load(filepath);
85 TDM_RETURN_VAL_IF_FAIL(dic != NULL, NULL);
87 if (!iniparser_find_entry(dic, TDM_CONFIG_GENERAL_SECTION)) {
88 TDM_ERR("no '%s' section: '%s'", TDM_CONFIG_GENERAL_SECTION, filepath);
89 iniparser_freedict(dic);
93 TDM_INFO("opened successed: '%s'", filepath);
99 _tdm_config_check_logs(void)
104 pthread_mutex_unlock(&g_dic_lock);
106 level = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_LOG_LEVEL, 3);
107 tdm_log_set_debug_level(level);
109 level = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_ASSERT_LEVEL, 0);
110 tdm_log_set_assert_level(level);
112 /* if TDM_CONFIG_KEY_DEBUG_LOG_PATH is setted, TDM_CONFIG_KEY_DEBUG_DLOG will be ignored. */
113 path = tdm_config_get_string(TDM_CONFIG_KEY_DEBUG_LOG_PATH, NULL);
115 tdm_log_enable_dlog(0);
116 tdm_log_set_path(path);
118 int dlog = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_DLOG, 1);
119 tdm_log_enable_dlog(dlog);
122 pthread_mutex_lock(&g_dic_lock);
126 _tdm_config_check_init(void)
131 g_dic = _tdm_config_load_file(TDM_DATA_PATH, TDM_CONFIG_FILENAME);
133 _tdm_config_check_logs();
135 TDM_INFO("tdm config init %s (%p)", (g_dic) ? "successed" : "failed", g_dic);
137 return (g_dic) ? 1 : 0;
141 tdm_config_deinit(void)
143 pthread_mutex_lock(&g_dic_lock);
146 pthread_mutex_unlock(&g_dic_lock);
150 iniparser_freedict(g_dic);
153 TDM_INFO("tdm config deinit done");
155 pthread_mutex_unlock(&g_dic_lock);
159 _tdm_config_get_string_internal(dictionary *dic, const char *key, const char *default_value)
165 temp = strdup(default_value);
167 TDM_ERR("strdup failed: %m");
168 return default_value;
172 result = (const char *)iniparser_getstring(dic, key, temp);
173 if (!result || strlen(result) == 0) {
175 return default_value;
184 tdm_config_get_int(const char *key, int default_value)
189 TDM_RETURN_VAL_IF_FAIL(key != NULL, default_value);
191 pthread_mutex_lock(&g_dic_lock);
193 if (!_tdm_config_check_init()) {
194 TDM_INFO("%s = %d: default", key, default_value);
195 pthread_mutex_unlock(&g_dic_lock);
196 return default_value;
199 result = _tdm_config_get_string_internal(g_dic, key, NULL);
200 pthread_mutex_unlock(&g_dic_lock);
203 TDM_INFO("%s = %d: no key", key, default_value);
204 return default_value;
207 value = (int)strtol(result, NULL, 0);
209 TDM_INFO("%s = %d", key, value);
215 tdm_config_get_string(const char *key, const char *default_value)
219 TDM_RETURN_VAL_IF_FAIL(key != NULL, default_value);
221 pthread_mutex_lock(&g_dic_lock);
223 if (!_tdm_config_check_init()) {
224 TDM_INFO("%s = %s: default", key, default_value);
225 pthread_mutex_unlock(&g_dic_lock);
226 return default_value;
229 result = _tdm_config_get_string_internal(g_dic, key, default_value);
230 pthread_mutex_unlock(&g_dic_lock);
232 TDM_INFO("%s = %s", key, result);
238 tdm_config_set_int(const char *key, int value)
240 char temp[TDM_NAME_LEN];
243 TDM_RETURN_VAL_IF_FAIL(key != NULL, TDM_ERROR_INVALID_PARAMETER);
245 snprintf(temp, sizeof temp, "%d", value);
247 pthread_mutex_lock(&g_dic_lock);
249 if (!_tdm_config_check_init()) {
250 TDM_INFO("%s = %d set failed", key, value);
251 pthread_mutex_unlock(&g_dic_lock);
252 return TDM_ERROR_BAD_REQUEST;
255 ret = iniparser_set(g_dic, key, (const char*)temp);
257 pthread_mutex_unlock(&g_dic_lock);
259 TDM_RETURN_VAL_IF_FAIL(ret == 0, TDM_ERROR_OPERATION_FAILED);
261 TDM_INFO("%s = %d set done", key, value);
263 return TDM_ERROR_NONE;
267 tdm_config_set_string(const char *key, const char *value)
271 TDM_RETURN_VAL_IF_FAIL(key != NULL, TDM_ERROR_INVALID_PARAMETER);
273 pthread_mutex_lock(&g_dic_lock);
275 if (!_tdm_config_check_init()) {
276 TDM_INFO("%s = %s set failed", key, value);
277 pthread_mutex_unlock(&g_dic_lock);
278 return TDM_ERROR_BAD_REQUEST;
281 ret = iniparser_set(g_dic, key, value);
283 pthread_mutex_unlock(&g_dic_lock);
285 TDM_RETURN_VAL_IF_FAIL(ret == 0, TDM_ERROR_OPERATION_FAILED);
287 TDM_INFO("%s = %s set done", key, value);
289 return TDM_ERROR_NONE;