All pastes #745796 Raw Edit

Mine

public text v1 · immutable
·published 2007-10-22 18:13 UTC
rendered paste body
Index: connection.c
===================================================================
RCS file: /cvsroot/bluez/utils/network/connection.c,v
retrieving revision 1.42
diff -u -3 -p -u -r1.42 connection.c
--- connection.c	3 Oct 2007 18:49:15 -0000	1.42
+++ connection.c	22 Oct 2007 18:09:34 -0000
@@ -32,6 +32,8 @@
 #include <netinet/in.h>
 
 #include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
 #include <bluetooth/l2cap.h>
 #include <bluetooth/bnep.h>
 
@@ -56,6 +58,7 @@ typedef enum {
 
 struct network_conn {
 	DBusMessage	*msg;
+	bdaddr_t	store;
 	bdaddr_t	src;
 	bdaddr_t	dst;
 	char		*path;		/* D-Bus path */
@@ -636,6 +639,16 @@ int connection_register(const char *path
 			uint16_t id, const char *name, const char *desc)
 {
 	struct network_conn *nc;
+	bdaddr_t default_src;
+	int dev_id;
+
+	if (!path)
+		return -EINVAL;
+
+	bacpy(&default_src, BDADDR_ANY);
+	dev_id = hci_get_route(&default_src);
+	if ((dev_id < 0) || (hci_devba(dev_id, &default_src) < 0))
+		return -1;
 
 	nc = g_new0(struct network_conn, 1);
 
@@ -657,7 +670,8 @@ int connection_register(const char *path
 	}
 
 	nc->path = g_strdup(path);
-	bacpy(&nc->src, src);
+	bacpy(&nc->store, src);
+	bacpy(&nc->src, &default_src);
 	bacpy(&nc->dst, dst);
 	nc->id = id;
 	nc->name = g_strdup(name);
@@ -693,7 +707,7 @@ int connection_store(const char *path, g
 	role = bnep_name(nc->id);
 	snprintf(key, 32, "%s#%s", dst_addr, role);
 
-	ba2str(&nc->src, src_addr);
+	ba2str(&nc->store, src_addr);
 	create_name(filename, PATH_MAX, STORAGEDIR, src_addr, "network");
 	create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
 
@@ -768,7 +782,7 @@ int connection_remove_stored(const char 
 	role = bnep_name(nc->id);
 	snprintf(key, 32, "%s#%s", dst_addr, role);
 
-	ba2str(&nc->src, src_addr);
+	ba2str(&nc->store, src_addr);
 	create_name(filename, PATH_MAX, STORAGEDIR, src_addr, "network");
 
 	err = textfile_del(filename, key);
Index: manager.c
===================================================================
RCS file: /cvsroot/bluez/utils/network/manager.c,v
retrieving revision 1.78
diff -u -3 -p -u -r1.78 manager.c
--- manager.c	28 Sep 2007 13:37:54 -0000	1.78
+++ manager.c	22 Oct 2007 18:09:34 -0000
@@ -507,6 +507,60 @@ static DBusHandlerResult find_connection
 	return send_message_and_unref(conn, reply);
 }
 
+char *find_adapter(DBusConnection *conn, bdaddr_t *src)
+{
+	DBusMessage *msg, *reply;
+	DBusError derr;
+	char address[18], *addr_ptr = address;
+	char *path, *ret;
+
+	msg = dbus_message_new_method_call("org.bluez", "/org/bluez",
+						"org.bluez.Manager",
+						"FindAdapter");
+	if (!msg) {
+		error("Unable to allocate new method call");
+		return NULL;
+	}
+
+	ba2str(src, address);
+
+	dbus_message_append_args(msg, DBUS_TYPE_STRING, &addr_ptr,
+				 DBUS_TYPE_INVALID);
+
+	dbus_error_init(&derr);
+	reply = dbus_connection_send_with_reply_and_block(conn, msg, -1,
+								&derr);
+
+	dbus_message_unref(msg);
+
+	if (dbus_error_is_set(&derr) ||
+				dbus_set_error_from_message(&derr, reply)) {
+		error("FindAdapter(%s) failed: %s", address, derr.message);
+		dbus_error_free(&derr);
+		return NULL;
+	}
+
+	dbus_error_init(&derr);
+	dbus_message_get_args(reply, &derr,
+				DBUS_TYPE_STRING, &path,
+				DBUS_TYPE_INVALID);
+
+	if (dbus_error_is_set(&derr)) {
+		error("Unable to get message args");
+		dbus_message_unref(reply);
+		dbus_error_free(&derr);
+		return FALSE;
+	}
+
+	ret = g_strdup(path);
+
+	dbus_message_unref(reply);
+
+	debug("Got path %s for adapter with address %s", ret, address);
+
+	return ret;
+}
+
 static DBusHandlerResult create_connection(DBusConnection *conn,
 						DBusMessage *msg, void *data)
 {
@@ -546,11 +600,18 @@ static DBusHandlerResult create_connecti
 	}
 
 	bacpy(&src, BDADDR_ANY);
-	dev_id = hci_get_route(NULL);
-	if ((dev_id < 0) ||  (hci_devba(dev_id, &src) < 0))
+	dev_id = hci_get_route(&src);
+	if ((dev_id < 0) || (hci_devba(dev_id, &src) < 0))
 		return err_failed(conn, msg, "Adapter not available");
 
 	pr = g_new0(struct pending_reply, 1);
+
+	pr->adapter_path = find_adapter(conn, &src);
+	if (!pr->adapter_path) {
+		pending_reply_free (pr);
+		return err_failed(conn, msg, "Adapter not available");
+	}
+
 	pr->conn = dbus_connection_ref(conn);
 	pr->msg = dbus_message_ref(msg);
 	bacpy(&pr->src, &src);
@@ -561,9 +622,6 @@ static DBusHandlerResult create_connecti
 	snprintf(pr->path, MAX_PATH_LENGTH,
 			NETWORK_PATH"/connection%d", net_uid++);
 
-	pr->adapter_path = g_malloc0(16);
-	snprintf(pr->adapter_path, 16, "/org/bluez/hci%d", dev_id);
-
 	if (get_handles(pr, pan_handle_reply) < 0)
 		return err_not_supported(conn, msg);
 
@@ -795,10 +853,9 @@ static void register_connections_stored(
 	/* Check default connection for current default adapter */
 	bacpy(&default_src, BDADDR_ANY);
 	dev_id = hci_get_route(&default_src);
-	if (dev_id < 0)
+	if ((dev_id < 0) || (hci_devba(dev_id, &default_src) < 0))
 		return;
 
-	hci_devba(dev_id, &default_src);
 	if (bacmp(&default_src, &src) != 0)
 		return;
 
Index: server.c
===================================================================
RCS file: /cvsroot/bluez/utils/network/server.c,v
retrieving revision 1.82
diff -u -3 -p -u -r1.82 server.c
--- server.c	3 Oct 2007 18:49:15 -0000	1.82
+++ server.c	22 Oct 2007 18:09:34 -0000
@@ -848,7 +848,7 @@ static DBusHandlerResult enable(DBusConn
 	if (bacmp(&ns->src, BDADDR_ANY) == 0) {
 		int dev_id;
 
-		dev_id = hci_get_route(NULL);
+		dev_id = hci_get_route(&ns->src);
 		if ((dev_id < 0) || (hci_devba(dev_id, &ns->src) < 0))
 			return err_failed(conn, msg, "Adapter not available");
 
@@ -1170,6 +1170,9 @@ int server_register_from_file(const char
 	struct network_server *ns;
 	char *str;
 
+	if (!path)
+		return -EINVAL;
+
 	ns = g_new0(struct network_server, 1);
 
 	bacpy(&ns->src, src);