Skip to contentSkip to conversation

client: Fix default_ctrl change when new adapter is found

PATCH In review Yunhan Wang 2 participants 4 messages Sep 13, 2017 – Sep 14, 2017 Bluetooth drivers

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 client: Fix default_ctrl change when new adapter is found

When another adapter is found, the default adapter would be changed, which is not expected. Default adapter can only be changed by select command.

---
 client/main.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)
client/main.c +25 -6
index 75696c2c1..e6737b961 100644
@@ -148,10 +148,8 @@ static void disconnect_handler(DBusConnection *connection, void *user_data)
 	printf("\r");
 	rl_on_new_line();
 	rl_redisplay();
-
 	g_list_free_full(ctrl_list, proxy_leak);
 	ctrl_list = NULL;
-
 	default_ctrl = NULL;
 }
 
@@ -521,15 +519,36 @@ static void device_added(GDBusProxy *proxy)
 
 static void adapter_added(GDBusProxy *proxy)
 {
-	default_ctrl = g_malloc0(sizeof(struct adapter));
-	default_ctrl->proxy = proxy;
-	ctrl_list = g_list_append(ctrl_list, default_ctrl);
+	struct adapter *adapter = g_malloc0(sizeof(struct adapter));
+
+	adapter->proxy = proxy;
+	ctrl_list = g_list_append(ctrl_list, adapter);
+
+	if (!default_ctrl)
+		default_ctrl = adapter;
+
 	print_adapter(proxy, COLORED_NEW);
 }
 
+static int match_proxy(const void *a, const void *b)
+{
+	GDBusProxy *proxy1 = (void *) a;
+	GDBusProxy *proxy2 = (void *) b;
+
+	return strcmp(g_dbus_proxy_get_path(proxy1),
+				  g_dbus_proxy_get_path(proxy2));
+}
+
 static void ad_manager_added(GDBusProxy *proxy)
 {
-	default_ctrl->ad_proxy = proxy;
+	GList *list;
+
+	for (list = g_list_first(ctrl_list); list; list = g_list_next(list)) {
+		struct adapter *adapter = list->data;
+
+		if (match_proxy(proxy, adapter->proxy) == 0)
+			adapter->ad_proxy = proxy;
+	}
 }
 
 static void proxy_added(GDBusProxy *proxy, void *user_data)
Signature · 1 line
2.14.1.581.gf28d330327-goog
#1 lore raw

Hi Yunhan,

Quoted 48 lines · Yunhan Wang

When another adapter is found, the default adapter would be changed, which is not expected. Default adapter can only be changed by select command.

---
 client/main.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)
client/main.c +17 -5
index 75696c2c1..e6737b961 100644
@@ -148,10 +148,8 @@ static void disconnect_handler(DBusConnection *connection, void *user_data)
 	printf("\r");
 	rl_on_new_line();
 	rl_redisplay();
-
 	g_list_free_full(ctrl_list, proxy_leak);
 	ctrl_list = NULL;
-
 	default_ctrl = NULL;
 }
 
@@ -521,15 +519,36 @@ static void device_added(GDBusProxy *proxy)
 
 static void adapter_added(GDBusProxy *proxy)
 {
-	default_ctrl = g_malloc0(sizeof(struct adapter));
-	default_ctrl->proxy = proxy;
-	ctrl_list = g_list_append(ctrl_list, default_ctrl);
+	struct adapter *adapter = g_malloc0(sizeof(struct adapter));
+
+	adapter->proxy = proxy;
+	ctrl_list = g_list_append(ctrl_list, adapter);
+
+	if (!default_ctrl)
+		default_ctrl = adapter;
+
 	print_adapter(proxy, COLORED_NEW);
 }
 
+static int match_proxy(const void *a, const void *b)
+{
+	GDBusProxy *proxy1 = (void *) a;
+	GDBusProxy *proxy2 = (void *) b;
+
+	return strcmp(g_dbus_proxy_get_path(proxy1),
+				  g_dbus_proxy_get_path(proxy2));
+}
+
 static void ad_manager_added(GDBusProxy *proxy)

client/main.c static void device_added(GDBusProxy *proxy) · line 551

Quoted 10 lines
client/main.c +8 -1
 {
-	default_ctrl->ad_proxy = proxy;
+	GList *list;
+
+	for (list = g_list_first(ctrl_list); list; list = g_list_next(list)) {
+		struct adapter *adapter = list->data;
+
+		if (match_proxy(proxy, adapter->proxy) == 0)
+			adapter->ad_proxy = proxy;
+	}

I think that you should use find_ctrl(), which does the similar thing as match_proxy() and the for loop statement of above ad_manager_added().

Let's see ad_manager_added() of my attached patch at the URL:
https://www.spinics.net/lists/linux-bluetooth/msg71731.html

Regards,
Eramoto

#2 lore raw

Hi, ERAMOTO

Your patch is better. Could you reformat and resubmit it so that we can merge it.

Thanks
Best wishes
Yunhan

Quoted 72 lines · ERAMOTO Masaya

Hi Yunhan,

Quoted 48 lines · Yunhan Wang

When another adapter is found, the default adapter would be changed, which is not expected. Default adapter can only be changed by select command.

---
 client/main.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)
client/main.c +17 -5
index 75696c2c1..e6737b961 100644
@@ -148,10 +148,8 @@ static void disconnect_handler(DBusConnection *connection, void *user_data)
      printf("\r");
      rl_on_new_line();
      rl_redisplay();
-
      g_list_free_full(ctrl_list, proxy_leak);
      ctrl_list = NULL;
-
      default_ctrl = NULL;
 }
 
@@ -521,15 +519,36 @@ static void device_added(GDBusProxy *proxy)
 
 static void adapter_added(GDBusProxy *proxy)
 {
-     default_ctrl = g_malloc0(sizeof(struct adapter));
-     default_ctrl->proxy = proxy;
-     ctrl_list = g_list_append(ctrl_list, default_ctrl);
+     struct adapter *adapter = g_malloc0(sizeof(struct adapter));
+
+     adapter->proxy = proxy;
+     ctrl_list = g_list_append(ctrl_list, adapter);
+
+     if (!default_ctrl)
+             default_ctrl = adapter;
+
      print_adapter(proxy, COLORED_NEW);
 }
 
+static int match_proxy(const void *a, const void *b)
+{
+     GDBusProxy *proxy1 = (void *) a;
+     GDBusProxy *proxy2 = (void *) b;
+
+     return strcmp(g_dbus_proxy_get_path(proxy1),
+                               g_dbus_proxy_get_path(proxy2));
+}
+
 static void ad_manager_added(GDBusProxy *proxy)

client/main.c static void device_added(GDBusProxy *proxy) · line 551

Quoted 10 lines
client/main.c +8 -1
 {
-     default_ctrl->ad_proxy = proxy;
+     GList *list;
+
+     for (list = g_list_first(ctrl_list); list; list = g_list_next(list)) {
+             struct adapter *adapter = list->data;
+
+             if (match_proxy(proxy, adapter->proxy) == 0)
+                     adapter->ad_proxy = proxy;
+     }

I think that you should use find_ctrl(), which does the similar thing as match_proxy() and the for loop statement of above ad_manager_added().

Let's see ad_manager_added() of my attached patch at the URL:
https://www.spinics.net/lists/linux-bluetooth/msg71731.html

Regards,
Eramoto

#3 lore raw

Hi Luiz and Yunhan,

I sent the reformatted patch. Could you please help to have a review?

Best regards,
Eramoto

Quoted 84 lines · Yunhan Wang

Hi, ERAMOTO

Your patch is better. Could you reformat and resubmit it so that we can merge it.

Thanks
Best wishes
Yunhan

Quoted 72 lines · ERAMOTO Masaya

Hi Yunhan,

Quoted 48 lines · Yunhan Wang

When another adapter is found, the default adapter would be changed, which is not expected. Default adapter can only be changed by select command.

---
 client/main.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)
client/main.c +17 -5
index 75696c2c1..e6737b961 100644
@@ -148,10 +148,8 @@ static void disconnect_handler(DBusConnection *connection, void *user_data)
      printf("\r");
      rl_on_new_line();
      rl_redisplay();
-
      g_list_free_full(ctrl_list, proxy_leak);
      ctrl_list = NULL;
-
      default_ctrl = NULL;
 }
 
@@ -521,15 +519,36 @@ static void device_added(GDBusProxy *proxy)
 
 static void adapter_added(GDBusProxy *proxy)
 {
-     default_ctrl = g_malloc0(sizeof(struct adapter));
-     default_ctrl->proxy = proxy;
-     ctrl_list = g_list_append(ctrl_list, default_ctrl);
+     struct adapter *adapter = g_malloc0(sizeof(struct adapter));
+
+     adapter->proxy = proxy;
+     ctrl_list = g_list_append(ctrl_list, adapter);
+
+     if (!default_ctrl)
+             default_ctrl = adapter;
+
      print_adapter(proxy, COLORED_NEW);
 }
 
+static int match_proxy(const void *a, const void *b)
+{
+     GDBusProxy *proxy1 = (void *) a;
+     GDBusProxy *proxy2 = (void *) b;
+
+     return strcmp(g_dbus_proxy_get_path(proxy1),
+                               g_dbus_proxy_get_path(proxy2));
+}
+
 static void ad_manager_added(GDBusProxy *proxy)

client/main.c static void device_added(GDBusProxy *proxy) · line 551

Quoted 10 lines
client/main.c +8 -1
 {
-     default_ctrl->ad_proxy = proxy;
+     GList *list;
+
+     for (list = g_list_first(ctrl_list); list; list = g_list_next(list)) {
+             struct adapter *adapter = list->data;
+
+             if (match_proxy(proxy, adapter->proxy) == 0)
+                     adapter->ad_proxy = proxy;
+     }

I think that you should use find_ctrl(), which does the similar thing as match_proxy() and the for loop statement of above ad_manager_added().

Let's see ad_manager_added() of my attached patch at the URL:
https://www.spinics.net/lists/linux-bluetooth/msg71731.html

Regards,
Eramoto