From c1553d3cab1a17cad8713ee61e1833903c0a6d89 Mon Sep 17 00:00:00 2001
From: Ajay Panicker <apanicke@google.com>
Date: Mon, 3 Aug 2015 16:29:31 -0700
Subject: [PATCH] Load factory Bluetooth address from system property

Implemented a check to grab the ro.boot.btmacaddr property in case the
device fails to receive an address beforehand.

Bug: 22618015
Change-Id: Ie322888e114a732f8e85c81793e3e5e5eacffc7a
---
 btif/include/btif_common.h | 10 +++++++++
 btif/src/btif_core.c       | 42 +++++++++++++++++++++++---------------
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/btif/include/btif_common.h b/btif/include/btif_common.h
index 2c4276d9..7e8c5064 100644
--- a/btif/include/btif_common.h
+++ b/btif/include/btif_common.h
@@ -145,6 +145,16 @@ enum
 #define PERSIST_BDADDR_PROPERTY         "persist.service.bdroid.bdaddr"
 #endif
 
+/**
+ * FACTORY_BT_BDADDR_PROPERTY
+ * If there is no valid bdaddr available from PROPERTY_BT_BDADDR_PATH
+ * and there is no available persistent bdaddr available from
+ * PERSIST_BDADDR_PROPERTY use a factory set address
+ */
+#ifndef FACTORY_BT_ADDR_PROPERTY
+#define FACTORY_BT_ADDR_PROPERTY        "ro.boot.btmacaddr"
+#endif
+
 #define FACTORY_BT_BDADDR_STORAGE_LEN   17
 
 
diff --git a/btif/src/btif_core.c b/btif/src/btif_core.c
index d552e5ca..0ff9651f 100644
--- a/btif/src/btif_core.c
+++ b/btif/src/btif_core.c
@@ -123,6 +123,7 @@ static const char *BT_JNI_WORKQUEUE_NAME = "bt_jni_workqueue";
 ************************************************************************************/
 static void btif_jni_associate(UNUSED_ATTR uint16_t event, UNUSED_ATTR char *p_param);
 static void btif_jni_disassociate(UNUSED_ATTR uint16_t event, UNUSED_ATTR char *p_param);
+static bool btif_fetch_property(const char *key, bt_bdaddr_t *addr);
 
 /* sends message to btif task */
 static void btif_sendmsg(void *p_msg);
@@ -316,9 +317,22 @@ void btif_thread_post(thread_fn func, void *context) {
     thread_post(bt_jni_workqueue_thread, func, context);
 }
 
+static bool btif_fetch_property(const char *key, bt_bdaddr_t *addr) {
+    char val[PROPERTY_VALUE_MAX] = {0};
+
+    if (property_get(key, val, NULL)) {
+        if (string_to_bdaddr(val, addr)) {
+            BTIF_TRACE_DEBUG("%s: Got BDA %s", __func__, val);
+            return TRUE;
+        }
+        BTIF_TRACE_DEBUG("%s: System Property did not contain valid bdaddr", __func__);
+    }
+    return FALSE;
+}
+
 static void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr)
 {
-    char val[256];
+    char val[PROPERTY_VALUE_MAX] = {0};
     uint8_t valid_bda = FALSE;
     int val_size = 0;
     const uint8_t null_bdaddr[BD_ADDR_LEN] = {0,0,0,0,0,0};
@@ -328,22 +342,19 @@ static void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr)
     {
         int addr_fd;
 
-        BTIF_TRACE_DEBUG("local bdaddr is stored in %s", val);
+        BTIF_TRACE_DEBUG("%s, local bdaddr is stored in %s", __func__, val);
 
         if ((addr_fd = open(val, O_RDONLY)) != -1)
         {
             memset(val, 0, sizeof(val));
             read(addr_fd, val, FACTORY_BT_BDADDR_STORAGE_LEN);
-            string_to_bdaddr(val, local_addr);
             /* If this is not a reserved/special bda, then use it */
-            if (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0)
+            if ((string_to_bdaddr(val, local_addr)) &&
+                (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0))
             {
                 valid_bda = TRUE;
-                BTIF_TRACE_DEBUG("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X",
-                    local_addr->address[0], local_addr->address[1], local_addr->address[2],
-                    local_addr->address[3], local_addr->address[4], local_addr->address[5]);
+                BTIF_TRACE_DEBUG("%s: Got Factory BDA %s", __func__, val);
             }
-
             close(addr_fd);
         }
     }
@@ -360,14 +371,13 @@ static void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr)
      }
 
     /* No factory BDADDR found. Look for previously generated random BDA */
-    if ((!valid_bda) && \
-        (property_get(PERSIST_BDADDR_PROPERTY, val, NULL)))
-    {
-        string_to_bdaddr(val, local_addr);
-        valid_bda = TRUE;
-        BTIF_TRACE_DEBUG("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X",
-            local_addr->address[0], local_addr->address[1], local_addr->address[2],
-            local_addr->address[3], local_addr->address[4], local_addr->address[5]);
+    if (!valid_bda) {
+        valid_bda = btif_fetch_property(PERSIST_BDADDR_PROPERTY, local_addr);
+    }
+
+    /* No BDADDR found in file. Look for BDA in factory property */
+    if (!valid_bda) {
+        valid_bda = btif_fetch_property(FACTORY_BT_ADDR_PROPERTY, local_addr);
     }
 
     /* Generate new BDA if necessary */
-- 
GitLab