}
//LCOV_EXCL_STOP
+static int db_join_value(const char *value_platform, const char *value_hal, const char *type, char *out, int len)
+{
+ if (!value_platform || !value_hal || !type)
+ return SYSTEM_INFO_ERROR_INVALID_PARAMETER;
+
+ /* If the type is other than bool type, then
+ * the value_hal takes precedence over the value_platform */
+ if (strncmp(type, BOOL_TYPE, sizeof(BOOL_TYPE)) != 0) {
+ strncpy(out, value_hal, len);
+ return SYSTEM_INFO_ERROR_NONE;
+ }
+
+ /* If the type is bool type, then
+ * the result is AND of those two value */
+ if (value_platform[0] == 'F')
+ strncpy(out, value_platform, len);
+ else if (value_hal[0] == 'F')
+ strncpy(out, value_hal, len);
+ else
+ strncpy(out, value_platform, len);
+
+ return SYSTEM_INFO_ERROR_NONE;
+}
+
+static int db_search_value(const char *db_path, char *key_internal, char *value, int len)
+{
+ FILE *fp = NULL;
+ int key_internal_len;
+ char buf[PATH_MAX]; // buffer size should be larger than KEY_MAX
+ size_t value_internal_len;
+ char *temp;
+
+ if (!db_path || !key_internal || !value)
+ return SYSTEM_INFO_ERROR_INVALID_PARAMETER;
+
+ snprintf(buf, sizeof(buf), "%s/%lu", db_path, simple_hash(key_internal));
+
+ fp = fopen(buf, "r");
+ if (!fp) {
+ _E("fopen for %s failed (%d)", buf, errno); //LCOV_EXCL_LINE
+ return SYSTEM_INFO_ERROR_IO_ERROR;
+ }
+
+ key_internal_len = strlen(key_internal);
+ while ((temp = fgets(buf, sizeof(buf), fp))) {
+ if (!strncmp(buf, key_internal, key_internal_len) && buf[key_internal_len] == ' ') {
+ value_internal_len = strcspn(buf + key_internal_len + 1, "\n") + 1;
+ snprintf(value, len < value_internal_len ? len : value_internal_len,
+ "%s", buf + key_internal_len + 1);
+ break;
+ }
+ }
+ fclose(fp);
+
+ if (!temp) {
+ _D("Failed to find key=%s in DB=%s", key_internal, db_path);
+ return SYSTEM_INFO_ERROR_IO_ERROR;
+ }
+
+ _D("key=%s in DB=%s, found value=%s", key_internal, db_path, value);
+ return SYSTEM_INFO_ERROR_NONE;
+}
+
static int db_get_value(enum tag_type tag, const char *key,
const char *type, char *value, size_t len)
{
char key_internal[KEY_MAX];
- size_t key_internal_len;
- char buf[PATH_MAX]; // buffer size should be larger than KEY_MAX
- size_t value_internal_len;
- FILE *fp = NULL;
int ret;
char *tag_s;
char *temp;
}
}
- if (access(SYSTEM_INFO_DB_RW_PATH, R_OK) == 0)
- snprintf(buf, sizeof(buf), SYSTEM_INFO_DB_RW_PATH"/%lu", simple_hash(key_internal));
- else
- snprintf(buf, sizeof(buf), SYSTEM_INFO_DB_RO_PATH"/%lu", simple_hash(key_internal));
-
- fp = fopen(buf, "r");
- if (!fp) {
- if (errno == ENOENT)
- _D("Failed to find key in DB (%s, %s)", key, type);
- else
- _E("fopen for %s failed (%d)", buf, errno); //LCOV_EXCL_LINE
- ret = SYSTEM_INFO_ERROR_IO_ERROR; //LCOV_EXCL_LINE
- goto out;
- }
+ if (access(SYSTEM_INFO_DB_RW_PATH, R_OK) == 0) {
+ ret = db_search_value(SYSTEM_INFO_DB_RW_PATH, key_internal, value, len);
+ } else {
+ int retval1;
+ int retval2;
+ char *buffer1;
+ char *buffer2;
+
+ buffer1 = (char *) calloc(len, sizeof(char));
+ buffer2 = (char *) calloc(len, sizeof(char));
+ if (!buffer1 || !buffer2) {
+ free(buffer1);
+ free(buffer2);
+ pthread_mutex_unlock(&fmutex);
+ return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
+ }
- key_internal_len = strlen(key_internal);
- while ((temp = fgets(buf, sizeof(buf), fp))) {
- if (!strncmp(buf, key_internal, key_internal_len) && buf[key_internal_len] == ' ') {
- value_internal_len = strcspn(buf + key_internal_len + 1, "\n") + 1;
- snprintf(value, len < value_internal_len ? len : value_internal_len,
- "%s", buf + key_internal_len + 1);
- break;
+ retval1 = db_search_value(SYSTEM_INFO_DB_RO_PATH, key_internal, buffer1, len);
+ retval2 = db_search_value(SYSTEM_INFO_HAL_DB_RO_PATH, key_internal, buffer2, len);
+
+ if (retval1 == SYSTEM_INFO_ERROR_NONE && retval2 == SYSTEM_INFO_ERROR_NONE) {
+ ret = db_join_value(buffer1, buffer2, type, value, len);
+ } else if (retval1 == SYSTEM_INFO_ERROR_NONE) {
+ ret = SYSTEM_INFO_ERROR_NONE;
+ strncpy(value, buffer1, len);
+ } else if (retval2 == SYSTEM_INFO_ERROR_NONE) {
+ ret = SYSTEM_INFO_ERROR_NONE;
+ strncpy(value, buffer2, len);
+ } else {
+ ret = SYSTEM_INFO_ERROR_IO_ERROR;
}
- }
- if (!temp) {
- _D("Failed to find key in DB (%s)", key_internal);
- ret = SYSTEM_INFO_ERROR_IO_ERROR;
- goto out;
+ free(buffer1);
+ free(buffer2);
}
- ret = SYSTEM_INFO_ERROR_NONE;
+ if (ret == SYSTEM_INFO_ERROR_NONE)
+ g_hash_table_insert(hashtable, strdup(key_internal), strdup(value));
- g_hash_table_insert(hashtable, strdup(key_internal), strdup(value));
-out:
- if (fp)
- fclose(fp);
pthread_mutex_unlock(&fmutex);
+
return ret;
}