From 1fd36183bfa2634d5357c055c16130632701158c Mon Sep 17 00:00:00 2001 From: Satya Durga Srinivasu Prabhala Date: Tue, 20 Jan 2015 18:53:35 -0800 Subject: [PATCH] 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 --- modules/sensors/Android.mk | 4 ++-- 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 445f69ec..94d100b0 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 cd67f6d5..5fedd4d4 100644 --- a/modules/sensors/multihal.cpp +++ b/modules/sensors/multihal.cpp @@ -27,6 +27,8 @@ #include #include +#include +#include #include #include @@ -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 *so_paths) { - FILE *conf_file = fopen(CONFIG_FILENAME, "r"); - if (conf_file == NULL) { +static void get_so_paths(std::vector *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 *so_paths = new std::vector(); + std::vector *so_paths = new std::vector(); get_so_paths(so_paths); // dlopen the module files and cache their module symbols in sub_hw_modules sub_hw_modules = new std::vector(); dlerror(); // clear any old errors const char* sym = HAL_MODULE_INFO_SYM_AS_STR; - for (std::vector::iterator it = so_paths->begin(); it != so_paths->end(); it++) { - char* path = *it; + for (std::vector::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());