summaryrefslogtreecommitdiff
path: root/halimpl/src/util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'halimpl/src/util.cc')
-rw-r--r--halimpl/src/util.cc265
1 files changed, 265 insertions, 0 deletions
diff --git a/halimpl/src/util.cc b/halimpl/src/util.cc
new file mode 100644
index 0000000..fa75db0
--- /dev/null
+++ b/halimpl/src/util.cc
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2013 SAMSUNG S.LSI
+ *
+ * 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.
+ *
+ *
+ */
+
+#include <ctype.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "util.h"
+
+/* START [H17080801] HAL config file path */
+#define CFG_FILE_1 "/vendor/etc/libnfc-sec-vendor.conf"
+#define CFG_FILE_2 "/etc/libnfc-sec-vendor.conf"
+/* END [H17080801] HAL config file path */
+
+#define isToken(x) (x == ':' || x == '=' || x == ' ' || x == '\t')
+#define skipToken(x) \
+ while (isToken(*x)) x++
+#define skipSpace(x) \
+ while (isspace(*x)) x++
+
+bool willBeContinuous(char* buffer, size_t maxlen) {
+ char* p;
+ size_t len;
+ if (!buffer) return false;
+
+ len = strnlen(buffer, maxlen);
+ if (len == maxlen && buffer[len - 2] != '\n') return true;
+
+ p = buffer + len - 1;
+ while (isspace(*p) && p > buffer) p--;
+ if (*p == '\\') return true;
+ return false;
+}
+
+bool find_by_name_from_current(FILE* file, const char* field) {
+ char *p, buffer[256] = {
+ '\0',
+ };
+ size_t len;
+ int fp;
+ bool skip = false;
+
+ if (!file || !field) return false;
+
+ len = strlen(field);
+ while (!feof(file) && fgets(buffer, sizeof(buffer) - 1, file)) {
+ if (skip) {
+ skip = willBeContinuous(buffer, sizeof(buffer));
+ continue;
+ }
+ skip = willBeContinuous(buffer, sizeof(buffer));
+
+ p = buffer;
+ skipSpace(p);
+ if (*p == '#') continue;
+
+ if (!strncmp((char const*)field, (char const*)p, len)) {
+ fp = -strlen(p);
+ fp += len;
+ return (fseek(file, fp, SEEK_CUR) == 0) ? true : false;
+ }
+ }
+ return false;
+}
+
+bool find_by_name(FILE* file, const char* field) {
+ fseek(file, 0x00, SEEK_SET);
+ return find_by_name_from_current(file, field);
+}
+
+bool __get_config_int(__attribute__((unused)) char* file_path,
+ const char* field, int* data, int option) {
+ FILE* file;
+ char buffer[10], *p, *endp;
+ size_t len;
+ long int val;
+
+ if (!field || !data) return false;
+
+ /* START [H17080801] HAL config file path */
+ if ((file = fopen(CFG_FILE_1, "rb")) == NULL) {
+ OSI_loge("Cannot open config file %s", CFG_FILE_1);
+ if ((file = fopen(CFG_FILE_2, "rb")) == NULL) {
+ OSI_loge("Cannot open config file %s", CFG_FILE_2);
+ return 0;
+ }
+ }
+ /* END [H17080801] HAL config file path */
+
+ if (!find_by_name(file, field)) {
+ OSI_loge("Cannot find the field name [%s]", field);
+ goto fail;
+ }
+
+ if (!fgets(buffer, sizeof(buffer) - 1, file)) {
+ OSI_loge("Read failed");
+ goto fail;
+ }
+
+ if (willBeContinuous(buffer, sizeof(buffer))) // not supported multi line
+ goto fail;
+
+ if ((len = strlen(buffer)) == sizeof(buffer) - 1) {
+ OSI_loge("It is too long data [%s~]; max", buffer);
+ goto fail;
+ }
+
+ p = buffer;
+ skipToken(p);
+ if (*p == '\0') {
+ OSI_loge("It is empty data");
+ goto fail;
+ }
+
+ if (((*p == '0') && (*(p + 1) == 'x')) || option == HAL_UTIL_GET_INT_16)
+ val = strtol(p, &endp, 0x10);
+ else
+ val = strtol(p, &endp, 10);
+
+ if (p == endp) {
+ OSI_loge("Read failed [%s]", buffer);
+ goto fail;
+ }
+
+ OSI_logd("Get config %s: %ld(0x%lx)", field, val, val);
+
+ fclose(file);
+
+ *data = val;
+ return true;
+
+fail:
+ fclose(file);
+ return false;
+}
+
+bool get_config_int(const char* field, int* data) {
+ /* START [17080801] HAL config file path */
+ return __get_config_int((char*)CFG_FILE_1, field, data, 0);
+ /* END [17080801] HAL config file path */
+}
+
+int get_config_string(const char* field, char* strBuffer, size_t bufferSize) {
+ FILE* file;
+ char data[256], *buffer, *p;
+ bool readmore = true;
+ size_t count = 0;
+
+ if (!field || !strBuffer || bufferSize < 1) return 0;
+
+ /* START [H17080801] HAL config file path */
+ if ((file = fopen(CFG_FILE_1, "rb")) == NULL) {
+ OSI_loge("Cannot open config file %s", CFG_FILE_1);
+ if ((file = fopen(CFG_FILE_2, "rb")) == NULL) {
+ OSI_loge("Cannot open config file %s", CFG_FILE_2);
+ return 0;
+ }
+ }
+ /* END [H17080801] HAL config file path */
+
+ if (!find_by_name(file, field)) {
+ OSI_logd("Cannot find the field name [%s]", field);
+ goto fail;
+ }
+
+ if ((buffer = (char*)malloc(bufferSize)) == NULL) {
+ OSI_logd("Cannot allocate temporary buffer for [%s]", field);
+ goto fail;
+ }
+
+ while (count < bufferSize - 1 && readmore) {
+ if (!fgets(data, sizeof(data) - 1, file)) {
+ OSI_loge("Read failed");
+ goto fail_free;
+ }
+
+ readmore = willBeContinuous(data, sizeof(data));
+ p = data;
+ while ((p = strchr(p, '"')) != NULL) // start string
+ {
+ for (p++; *p != '"'; p++) // end string
+ {
+ if (*p == '\n' || *p == '\0' || *p == '\\') {
+ OSI_loge("Cannot find ending point of string");
+ goto fail_free;
+ }
+ buffer[count++] = *p;
+ }
+ p++;
+ }
+ }
+ buffer[count] = '\0';
+
+ OSI_logd("Get config %s: %s", field, buffer);
+ if (count == bufferSize) {
+ if (p == NULL)
+ goto fail_free;
+ else if (*p != '\n')
+ OSI_loge("Overflower!, remained data is [%s]", p);
+ else if (readmore)
+ OSI_loge("Overflower!, data is remained! (multi line)");
+ }
+
+ count++;
+ memcpy(strBuffer, buffer, count);
+ free(buffer);
+
+ fclose(file);
+ return count;
+
+fail_free:
+ free(buffer);
+fail:
+ fclose(file);
+ return 0;
+}
+
+int get_config_count(const char* field) {
+ FILE* file;
+ int count = 0;
+
+ /* START [H17080801] HAL config file path */
+ if ((file = fopen(CFG_FILE_1, "rb")) == NULL) {
+ OSI_loge("Cannot open config file %s", CFG_FILE_1);
+ if ((file = fopen(CFG_FILE_2, "rb")) == NULL) {
+ OSI_loge("Cannot open config file %s", CFG_FILE_2);
+ return 0;
+ }
+ }
+ /* END [H17080801] HAL config file path */
+
+ while (find_by_name_from_current(file, field)) count++;
+
+ fclose(file);
+ return count;
+}
+
+int get_hw_rev() {
+ char* info_file = (char*)"/proc/cpuinfo";
+ char* field = (char*)"Revision";
+ int rev = -1;
+
+ OSI_logd("%s enter;", __func__);
+ __get_config_int(info_file, field, &rev, HAL_UTIL_GET_INT_16);
+ OSI_logd("%s exit; rev = %d", __func__, rev);
+
+ return rev;
+}