From 1611b0520d8daae47cd34d133548d5c485dd8d56 Mon Sep 17 00:00:00 2001 From: Jack He Date: Fri, 13 Oct 2017 18:23:05 -0700 Subject: [PATCH] Fix net_test_bluetooth * net_test_bluetooth should try to load Bluetooth library from system/lib/hw or system/lib64/hw if it cannot find it from default path * Also replaced legacy logging macro with libbase logging statements Bug: 67059247 Test: net_test_bluetooth Change-Id: I6c45f66aedf675397f377ca56203bec9708324e1 --- btcore/src/hal_util.cc | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/btcore/src/hal_util.cc b/btcore/src/hal_util.cc index f3ae7417a..58c97ec24 100644 --- a/btcore/src/hal_util.cc +++ b/btcore/src/hal_util.cc @@ -16,6 +16,8 @@ #define LOG_TAG "hal_util" +#include +#include #include #include @@ -26,15 +28,14 @@ #include "btcore/include/hal_util.h" #include "osi/include/log.h" -// TODO(armansito): All logging macros should include __func__ by default (see -// Bug: 22671731) -#define HULOGERR(fmt, args...) \ - LOG_ERROR(LOG_TAG, "[%s] failed to load the Bluetooth library: " fmt, \ - __func__, ##args) +using base::StringPrintf; -// TODO(armansito): It might be better to pass the library name in a more -// generic manner as opposed to hard-coding it here. -static const char kBluetoothLibraryName[] = "bluetooth.default.so"; +#define BLUETOOTH_LIBRARY_NAME "bluetooth.default.so" +#if defined(__LP64__) +#define BACKUP_PATH "/system/lib64/hw/" BLUETOOTH_LIBRARY_NAME +#else +#define BACKUP_PATH "/system/lib/hw/" BLUETOOTH_LIBRARY_NAME +#endif int hal_util_load_bt_library(const struct hw_module_t** module) { const char* id = BT_STACK_MODULE_ID; @@ -42,31 +43,43 @@ int hal_util_load_bt_library(const struct hw_module_t** module) { struct hw_module_t* hmi = nullptr; // Always try to load the default Bluetooth stack on GN builds. - void* handle = dlopen(kBluetoothLibraryName, RTLD_NOW); + const char* path = BLUETOOTH_LIBRARY_NAME; + void* handle = dlopen(path, RTLD_NOW); if (!handle) { - char const* err_str = dlerror(); - HULOGERR("%s", err_str ? err_str : "error unknown"); - goto error; + const char* err_str = dlerror(); + LOG(WARNING) << __func__ << ": failed to load Bluetooth library " << path + << ", error=" << (err_str ? err_str : "error unknown"); + path = BACKUP_PATH; + LOG(WARNING) << __func__ << ": loading backup path " << path; + handle = dlopen(path, RTLD_NOW); + if (!handle) { + err_str = dlerror(); + LOG(ERROR) << __func__ << ": failed to load Bluetooth library " << path + << ", error=" << (err_str ? err_str : "error unknown"); + goto error; + } } // Get the address of the struct hal_module_info. hmi = (struct hw_module_t*)dlsym(handle, sym); if (!hmi) { - HULOGERR("%s", sym); + LOG(ERROR) << __func__ << ": failed to load symbol from Bluetooth library " + << sym; goto error; } // Check that the id matches. if (strcmp(id, hmi->id) != 0) { - HULOGERR("id=%s does not match HAL module ID: %s", id, hmi->id); + LOG(ERROR) << StringPrintf("%s: id=%s does not match HAL module ID: %s", + __func__, id, hmi->id); goto error; } hmi->dso = handle; // Success. - LOG_INFO(LOG_TAG, "[%s] loaded HAL id=%s path=%s hmi=%p handle=%p", __func__, - id, kBluetoothLibraryName, hmi, handle); + LOG(INFO) << StringPrintf("%s: loaded HAL id=%s path=%s hmi=%p handle=%p", + __func__, id, path, hmi, handle); *module = hmi; return 0; -- 2.11.0