diff options
author | Satya Durga Srinivasu Prabhala <satyap@codeaurora.org> | 2015-01-20 18:53:35 -0800 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2015-10-06 03:30:33 -0600 |
commit | a7ca5eb851e762ad158a66f16334967dd67fda00 (patch) | |
tree | 7d8f8bb5c5d99984e0c22a643c5d36628b4bab3d | |
parent | b4bcf6f59f44972198c792fbf4d116be1b2489a7 (diff) | |
download | hardware_libhardware-a7ca5eb851e762ad158a66f16334967dd67fda00.zip hardware_libhardware-a7ca5eb851e762ad158a66f16334967dd67fda00.tar.gz hardware_libhardware-a7ca5eb851e762ad158a66f16334967dd67fda00.tar.bz2 |
libhardware: sensors: update multi hal to support 64bit builds
To get multi hal working on both 32 & 64 bit targets,
removing hardcoded paths & checks in multi HAL.
Sensor HAL libs must be installed path that is available through
LD_LIBRARY_PATH.
/system/lib & /system/vendor/lib for 32-bit targets.
/system/lib64 & /system/vendor/lib64 for 64-bit targets.
Change-Id: Ib1c1f25f08855c4584d53cc04fbe82a3a768b180
-rw-r--r-- | modules/sensors/Android.mk | 4 | ||||
-rw-r--r-- | modules/sensors/multihal.cpp | 46 |
2 files changed, 15 insertions, 35 deletions
diff --git a/modules/sensors/Android.mk b/modules/sensors/Android.mk index 445f69e..94d100b 100644 --- a/modules/sensors/Android.mk +++ b/modules/sensors/Android.mk @@ -20,9 +20,9 @@ ifeq ($(USE_SENSOR_MULTI_HAL),true) include $(CLEAR_VARS) -LOCAL_MODULE := sensors.$(TARGET_DEVICE) +LOCAL_MODULE := sensors.$(TARGET_BOARD_PLATFORM) -LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw +LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_CFLAGS := -DLOG_TAG=\"MultiHal\" diff --git a/modules/sensors/multihal.cpp b/modules/sensors/multihal.cpp index cd67f6d..5fedd4d 100644 --- a/modules/sensors/multihal.cpp +++ b/modules/sensors/multihal.cpp @@ -27,6 +27,8 @@ #include <cutils/log.h> #include <vector> +#include <string> +#include <fstream> #include <map> #include <string> @@ -36,8 +38,6 @@ static const char* CONFIG_FILENAME = "/system/etc/sensors/hals.conf"; -static const char* LEGAL_SUBHAL_PATH_PREFIX = "/system/lib/hw/"; -static const char* LEGAL_SUBHAL_ALTERNATE_PATH_PREFIX = "/system/vendor/lib/"; static const int MAX_CONF_LINE_LENGTH = 1024; static pthread_mutex_t init_modules_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -463,39 +463,19 @@ static bool starts_with(const char* s, const char* prefix) { * Adds valid paths from the config file to the vector passed in. * The vector must not be null. */ -static void get_so_paths(std::vector<char*> *so_paths) { - FILE *conf_file = fopen(CONFIG_FILENAME, "r"); - if (conf_file == NULL) { +static void get_so_paths(std::vector<std::string> *so_paths) { + std::string line; + std::ifstream conf_file(CONFIG_FILENAME); + + if(!conf_file) { ALOGW("No multihal config file found at %s", CONFIG_FILENAME); return; } ALOGV("Multihal config file found at %s", CONFIG_FILENAME); - char *line = NULL; - size_t len = 0; - int line_count = 0; - while (getline(&line, &len, conf_file) != -1) { - // overwrite trailing eoln with null char - char* pch = strchr(line, '\n'); - if (pch != NULL) { - *pch = '\0'; - } - ALOGV("config file line #%d: '%s'", ++line_count, line); - char *real_path = realpath(line, NULL); - if (starts_with(real_path, LEGAL_SUBHAL_PATH_PREFIX) || - starts_with(real_path, LEGAL_SUBHAL_ALTERNATE_PATH_PREFIX)) { - ALOGV("accepting valid path '%s'", real_path); - char* compact_line = new char[strlen(real_path) + 1]; - strcpy(compact_line, real_path); - so_paths->push_back(compact_line); - } else { - ALOGW("rejecting path '%s' because it does not start with '%s' or '%s'", - real_path, LEGAL_SUBHAL_PATH_PREFIX, LEGAL_SUBHAL_ALTERNATE_PATH_PREFIX); - } - free(real_path); + while (std::getline(conf_file, line)) { + ALOGV("config file line: '%s'", line.c_str()); + so_paths->push_back(line); } - free(line); - fclose(conf_file); - ALOGV("hals.conf contained %d lines", line_count); } /* @@ -508,15 +488,15 @@ static void lazy_init_modules() { pthread_mutex_unlock(&init_modules_mutex); return; } - std::vector<char*> *so_paths = new std::vector<char*>(); + std::vector<std::string> *so_paths = new std::vector<std::string>(); get_so_paths(so_paths); // dlopen the module files and cache their module symbols in sub_hw_modules sub_hw_modules = new std::vector<hw_module_t *>(); dlerror(); // clear any old errors const char* sym = HAL_MODULE_INFO_SYM_AS_STR; - for (std::vector<char*>::iterator it = so_paths->begin(); it != so_paths->end(); it++) { - char* path = *it; + for (std::vector<std::string>::iterator it = so_paths->begin(); it != so_paths->end(); it++) { + const char* path = it->c_str(); void* lib_handle = dlopen(path, RTLD_LAZY); if (lib_handle == NULL) { ALOGW("dlerror(): %s", dlerror()); |