From 3406c27e758f3dfa182f6fdfcc878bc3a53e3c98 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 9 Mar 2007 15:33:38 +0000 Subject: Add skeleton for network service --- network/manager.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 network/manager.c (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c new file mode 100644 index 00000000..90d20927 --- /dev/null +++ b/network/manager.c @@ -0,0 +1,28 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2007 Marcel Holtmann + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "manager.h" -- cgit From 855cf216127e1fd6f6aba60c3761a0ead17ae910 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 9 Mar 2007 15:37:57 +0000 Subject: Create init and exit functions --- network/manager.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 90d20927..33679a51 100644 --- a/network/manager.c +++ b/network/manager.c @@ -26,3 +26,12 @@ #endif #include "manager.h" + +int network_init(void) +{ + return 0; +} + +void network_exit(void) +{ +} -- cgit From 29b4c4f802c7e9cfc40d70721f77caf25c409821 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 12 Mar 2007 01:06:47 +0000 Subject: Network: added server methods skeleton --- network/manager.c | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 33679a51..ab77cfe0 100644 --- a/network/manager.c +++ b/network/manager.c @@ -25,13 +25,220 @@ #include #endif +#include +#include +#include + +#include + +#include "logging.h" +#include "dbus.h" + +#define NETWORK_PATH "/org/bluez/network" +#define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager" +#define NETWORK_ERROR_INTERFACE "org.bluez.Error" + #include "manager.h" +struct manager { + bdaddr_t src; /* Local adapter BT address */ + GSList *servers; /* Network registered servers paths */ +}; + +static DBusConnection *connection = NULL; + +static DBusHandlerResult err_unknown_connection(DBusConnection *conn, + DBusMessage *msg) +{ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusHandlerResult list_servers(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusHandlerResult create_server(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusHandlerResult remove_server(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusHandlerResult list_connections(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusHandlerResult create_connection(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusHandlerResult remove_connections(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusHandlerResult manager_message(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + const char *path, *iface, *member; + + path = dbus_message_get_path(msg); + iface = dbus_message_get_interface(msg); + member = dbus_message_get_member(msg); + + /* Catching fallback paths */ + if (strcmp(NETWORK_PATH, path) != 0) + return err_unknown_connection(conn, msg); + + /* Accept messages from the manager interface only */ + if (strcmp(NETWORK_MANAGER_INTERFACE, iface)) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (strcmp(member, "ListServers") == 0) + return list_servers(conn, msg, data); + + if (strcmp(member, "CreateServer") == 0) + return create_server(conn, msg, data); + + if (strcmp(member, "RemoveServer") == 0) + return remove_server(conn, msg, data); + + if (strcmp(member, "ListConnections") == 0) + return list_connections(conn, msg, data); + + if (strcmp(member, "CreateConnection") == 0) + return create_connection(conn, msg, data); + + if (strcmp(member, "RemoveConnections") == 0) + return remove_connections(conn, msg, data); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static void manager_free(struct manager *mgr) +{ + if (!mgr) + return; + + g_free (mgr); +} +static void manager_unregister(DBusConnection *conn, void *data) +{ + struct manager *mgr = data; + + info("Unregistered manager path"); + + manager_free(mgr); +} + +/* Virtual table to handle manager object path hierarchy */ +static const DBusObjectPathVTable manager_table = { + .message_function = manager_message, + .unregister_function = manager_unregister, +}; + +int network_dbus_init(void) +{ + struct manager *mgr; + bdaddr_t src; + int dev_id; + + connection = init_dbus(NULL, NULL, NULL); + if (!connection) + return -1; + + dbus_connection_set_exit_on_disconnect(connection, TRUE); + + mgr = g_new0(struct manager, 1); + + /* Fallback to catch invalid device path */ + if (!dbus_connection_register_fallback(connection, NETWORK_PATH, + &manager_table, mgr)) { + error("D-Bus failed to register %s path", NETWORK_PATH); + goto fail; + } + + info("Registered manager path:%s", NETWORK_PATH); + + /* Set the default adapter */ + bacpy(&src, BDADDR_ANY); + dev_id = hci_get_route(&src); + if (dev_id < 0) { + error("Bluetooth device not available"); + goto fail; + } + + if (hci_devba(dev_id, &src) < 0) { + error("Can't get local adapter device info"); + goto fail; + } + + bacpy(&mgr->src, &src); + + return 0; + +fail: + manager_free(mgr); + + return -1; +} + +void network_dbus_exit(void) +{ + dbus_connection_unregister_object_path(connection, NETWORK_PATH); + + dbus_connection_unref(connection); +} + +void internal_service(const char *identifier) +{ + DBusMessage *msg, *reply; + const char *name = "Network service", *desc = ""; + + info("Registering service"); + + msg = dbus_message_new_method_call("org.bluez", "/org/bluez", + "org.bluez.Database", "RegisterService"); + if (!msg) { + error("Can't create service register method"); + return; + } + + dbus_message_append_args(msg, DBUS_TYPE_STRING, &identifier, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &desc, DBUS_TYPE_INVALID); + + reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, NULL); + if (!reply) { + error("Can't register service"); + return; + } + + dbus_message_unref(msg); + dbus_message_unref(reply); + + dbus_connection_flush(connection); +} + int network_init(void) { + network_dbus_init(); return 0; } void network_exit(void) { + network_dbus_exit(); } -- cgit From 7e39b983e5cead54bca67953aa92f6ecb4d78fa2 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Tue, 13 Mar 2007 18:20:18 +0000 Subject: Network: Added unknown connection path fallback --- network/manager.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index ab77cfe0..982eb015 100644 --- a/network/manager.c +++ b/network/manager.c @@ -50,7 +50,10 @@ static DBusConnection *connection = NULL; static DBusHandlerResult err_unknown_connection(DBusConnection *conn, DBusMessage *msg) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + return send_message_and_unref(conn, + dbus_message_new_error(msg, + NETWORK_ERROR_INTERFACE ".UnknownConnection", + "Unknown connection path")); } static DBusHandlerResult list_servers(DBusConnection *conn, @@ -134,6 +137,7 @@ static void manager_free(struct manager *mgr) g_free (mgr); } + static void manager_unregister(DBusConnection *conn, void *data) { struct manager *mgr = data; -- cgit From 9411bce4baf65cc7891f6899cb602a96c4ac26b3 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 15 Mar 2007 13:42:30 +0000 Subject: Network: Added ListServers --- network/manager.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 982eb015..8487bbb1 100644 --- a/network/manager.c +++ b/network/manager.c @@ -59,7 +59,30 @@ static DBusHandlerResult err_unknown_connection(DBusConnection *conn, static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, void *data) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + struct manager *mgr = data; + DBusMessage *reply; + GSList *l; + DBusMessageIter iter; + DBusMessageIter array_iter; + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_iter_init_append(reply, &iter); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, + DBUS_TYPE_STRING_AS_STRING, &array_iter); + + for (l = mgr->servers; l; l = l->next) { + const char *server = l->data; + + dbus_message_iter_append_basic(&array_iter, + DBUS_TYPE_STRING, &server); + } + + dbus_message_iter_close_container(&iter, &array_iter); + + return send_message_and_unref(conn, reply); } static DBusHandlerResult create_server(DBusConnection *conn, -- cgit From 7ba9c777c7755dc380443f29f41fcd2a61e1b7df Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 16 Mar 2007 19:58:29 +0000 Subject: Add minimal support for bridge creation and removal --- network/manager.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 8487bbb1..26ebf57b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -38,6 +38,7 @@ #define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager" #define NETWORK_ERROR_INTERFACE "org.bluez.Error" +#include "bridge.h" #include "manager.h" struct manager { @@ -262,10 +263,26 @@ void internal_service(const char *identifier) int network_init(void) { network_dbus_init(); + + if (bridge_init() < 0) { + error("Can't init bridge module"); + return -1; + } + + if (bridge_create("pan0") < 0) { + error("Can't create bridge"); + return -1; + } + return 0; } void network_exit(void) { + if (bridge_remove("pan0") < 0) + error("Can't remove bridge"); + + bridge_cleanup(); + network_dbus_exit(); } -- cgit From 851ad267e554850ae2cbfd486922cbcfb897f8b5 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 19 Mar 2007 13:24:41 +0000 Subject: - Fix standalone init when there is no bluetooth adapter. --- network/manager.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 26ebf57b..e0265af7 100644 --- a/network/manager.c +++ b/network/manager.c @@ -191,7 +191,7 @@ int network_dbus_init(void) mgr = g_new0(struct manager, 1); - /* Fallback to catch invalid device path */ + /* Fallback to catch invalid network path */ if (!dbus_connection_register_fallback(connection, NETWORK_PATH, &manager_table, mgr)) { error("D-Bus failed to register %s path", NETWORK_PATH); @@ -262,8 +262,6 @@ void internal_service(const char *identifier) int network_init(void) { - network_dbus_init(); - if (bridge_init() < 0) { error("Can't init bridge module"); return -1; @@ -274,7 +272,7 @@ int network_init(void) return -1; } - return 0; + return network_dbus_init(); } void network_exit(void) -- cgit From 0ac929228aa1eb823f37776e2bbb84855417c66e Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 19 Mar 2007 13:57:52 +0000 Subject: Fix build, move errors to error file and add server registration. --- network/manager.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index e0265af7..e10a4e33 100644 --- a/network/manager.c +++ b/network/manager.c @@ -32,12 +32,11 @@ #include #include "logging.h" -#include "dbus.h" #define NETWORK_PATH "/org/bluez/network" #define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager" -#define NETWORK_ERROR_INTERFACE "org.bluez.Error" +#include "error.h" #include "bridge.h" #include "manager.h" @@ -48,15 +47,6 @@ struct manager { static DBusConnection *connection = NULL; -static DBusHandlerResult err_unknown_connection(DBusConnection *conn, - DBusMessage *msg) -{ - return send_message_and_unref(conn, - dbus_message_new_error(msg, - NETWORK_ERROR_INTERFACE ".UnknownConnection", - "Unknown connection path")); -} - static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, void *data) { -- cgit From c41c67efc320d5f8b15963246cc0c2aa006446d5 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 20 Mar 2007 15:10:58 +0000 Subject: Initial code of CreateServer and RemoveServer methods. --- network/manager.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index e10a4e33..91e71c37 100644 --- a/network/manager.c +++ b/network/manager.c @@ -32,6 +32,7 @@ #include #include "logging.h" +#include "dbus.h" #define NETWORK_PATH "/org/bluez/network" #define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager" @@ -39,6 +40,7 @@ #include "error.h" #include "bridge.h" #include "manager.h" +#include "server.h" struct manager { bdaddr_t src; /* Local adapter BT address */ @@ -79,13 +81,73 @@ static DBusHandlerResult list_servers(DBusConnection *conn, static DBusHandlerResult create_server(DBusConnection *conn, DBusMessage *msg, void *data) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + struct manager *mgr = data; + DBusMessage *reply; + DBusError derr; + const char *uuid; + char *path; + + dbus_error_init(&derr); + if (!dbus_message_get_args(msg, &derr, + DBUS_TYPE_STRING, &uuid, + DBUS_TYPE_INVALID)) { + err_generic(conn, msg, derr.name, derr.message); + dbus_error_free(&derr); + return DBUS_HANDLER_RESULT_HANDLED; + } + + path = g_new0(char, 32); + snprintf(path, 32, NETWORK_PATH "/server/%s", uuid); + if (!g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) { + if (server_register(conn, path) != -1) { + mgr->servers = g_slist_append(mgr->servers, + g_strdup(path)); + } + } + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + g_free(path); + return send_message_and_unref(connection, reply); } static DBusHandlerResult remove_server(DBusConnection *conn, DBusMessage *msg, void *data) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + struct manager *mgr = data; + const char *path; + DBusMessage *reply; + DBusError derr; + GSList *l; + + dbus_error_init(&derr); + if (!dbus_message_get_args(msg, &derr, + DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID)) { + err_generic(conn, msg, derr.name, derr.message); + dbus_error_free(&derr); + return DBUS_HANDLER_RESULT_HANDLED; + } + + l = g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp); + if (!l) + return err_does_not_exist(conn, msg, "Server doesn't exist"); + + mgr->servers = g_slist_remove(mgr->servers, l->data); + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + if (!dbus_connection_unregister_object_path(conn, path)) + error("Network server path unregister failed"); + + return send_message_and_unref(conn, reply); } static DBusHandlerResult list_connections(DBusConnection *conn, @@ -149,6 +211,9 @@ static void manager_free(struct manager *mgr) if (!mgr) return; + if (mgr->servers) + g_slist_free(mgr->servers); + g_free (mgr); } -- cgit From ad5740f56965f3fc003b704fe41e80fe1e53434d Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 20 Mar 2007 19:59:55 +0000 Subject: Initial code of CreateConnection and RemoveConnection methods. --- network/manager.c | 100 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 21 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 91e71c37..4d17bfc1 100644 --- a/network/manager.c +++ b/network/manager.c @@ -41,20 +41,20 @@ #include "bridge.h" #include "manager.h" #include "server.h" +#include "connection.h" struct manager { bdaddr_t src; /* Local adapter BT address */ GSList *servers; /* Network registered servers paths */ + GSList *connections; /* Network registered connections paths */ }; static DBusConnection *connection = NULL; -static DBusHandlerResult list_servers(DBusConnection *conn, - DBusMessage *msg, void *data) +static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, + GSList *list) { - struct manager *mgr = data; DBusMessage *reply; - GSList *l; DBusMessageIter iter; DBusMessageIter array_iter; @@ -66,11 +66,12 @@ static DBusHandlerResult list_servers(DBusConnection *conn, dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &array_iter); - for (l = mgr->servers; l; l = l->next) { - const char *server = l->data; - - dbus_message_iter_append_basic(&array_iter, - DBUS_TYPE_STRING, &server); + if (g_slist_length(list)) { + for (; list; list = list->next) { + dbus_message_iter_append_basic(&array_iter, + DBUS_TYPE_STRING, + &list->data); + } } dbus_message_iter_close_container(&iter, &array_iter); @@ -78,6 +79,14 @@ static DBusHandlerResult list_servers(DBusConnection *conn, return send_message_and_unref(conn, reply); } +static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, + void *data) +{ + struct manager *mgr = data; + + return list_paths(conn, msg, mgr->servers); +} + static DBusHandlerResult create_server(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -116,10 +125,9 @@ static DBusHandlerResult create_server(DBusConnection *conn, return send_message_and_unref(connection, reply); } -static DBusHandlerResult remove_server(DBusConnection *conn, - DBusMessage *msg, void *data) +static DBusHandlerResult remove_path(DBusConnection *conn, + DBusMessage *msg, GSList **list) { - struct manager *mgr = data; const char *path; DBusMessage *reply; DBusError derr; @@ -134,11 +142,12 @@ static DBusHandlerResult remove_server(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } - l = g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp); + l = g_slist_find_custom(*list, path, (GCompareFunc) strcmp); if (!l) return err_does_not_exist(conn, msg, "Server doesn't exist"); - mgr->servers = g_slist_remove(mgr->servers, l->data); + g_free(l->data); + *list = g_slist_remove(*list, l->data); reply = dbus_message_new_method_return(msg); if (!reply) @@ -150,22 +159,67 @@ static DBusHandlerResult remove_server(DBusConnection *conn, return send_message_and_unref(conn, reply); } +static DBusHandlerResult remove_server(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + struct manager *mgr = data; + + return remove_path(conn, msg, &mgr->servers); +} + static DBusHandlerResult list_connections(DBusConnection *conn, DBusMessage *msg, void *data) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + struct manager *mgr = data; + + return list_paths(conn, msg, mgr->connections); } static DBusHandlerResult create_connection(DBusConnection *conn, DBusMessage *msg, void *data) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + struct manager *mgr = data; + static int uid = 0; + DBusMessage *reply; + DBusError derr; + const char *addr; + const char *uuid; + char *path; + + dbus_error_init(&derr); + if (!dbus_message_get_args(msg, &derr, + DBUS_TYPE_STRING, &addr, + DBUS_TYPE_STRING, &uuid, + DBUS_TYPE_INVALID)) { + err_generic(conn, msg, derr.name, derr.message); + dbus_error_free(&derr); + return DBUS_HANDLER_RESULT_HANDLED; + } + + path = g_new0(char, 32); + snprintf(path, 32, NETWORK_PATH "/connection%d", uid++); + if (connection_register(conn, path) != -1) { + mgr->connections = g_slist_append(mgr->connections, + g_strdup(path)); + } + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + g_free(path); + return send_message_and_unref(connection, reply); } -static DBusHandlerResult remove_connections(DBusConnection *conn, +static DBusHandlerResult remove_connection(DBusConnection *conn, DBusMessage *msg, void *data) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + struct manager *mgr = data; + + return remove_path(conn, msg, &mgr->connections); } static DBusHandlerResult manager_message(DBusConnection *conn, @@ -200,8 +254,8 @@ static DBusHandlerResult manager_message(DBusConnection *conn, if (strcmp(member, "CreateConnection") == 0) return create_connection(conn, msg, data); - if (strcmp(member, "RemoveConnections") == 0) - return remove_connections(conn, msg, data); + if (strcmp(member, "RemoveConnection") == 0) + return remove_connection(conn, msg, data); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -214,6 +268,9 @@ static void manager_free(struct manager *mgr) if (mgr->servers) g_slist_free(mgr->servers); + if (mgr->connections) + g_slist_free(mgr->connections); + g_free (mgr); } @@ -303,7 +360,8 @@ void internal_service(const char *identifier) DBUS_TYPE_STRING, &name, DBUS_TYPE_STRING, &desc, DBUS_TYPE_INVALID); - reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, NULL); + reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, + NULL); if (!reply) { error("Can't register service"); return; -- cgit From 11676370a14d77b9fc04af03143fe56ab58753cd Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 21 Mar 2007 18:04:04 +0000 Subject: Remove duplicate code and some minor fixes. --- network/manager.c | 107 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 39 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 4d17bfc1..42853811 100644 --- a/network/manager.c +++ b/network/manager.c @@ -66,12 +66,10 @@ static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &array_iter); - if (g_slist_length(list)) { - for (; list; list = list->next) { - dbus_message_iter_append_basic(&array_iter, - DBUS_TYPE_STRING, - &list->data); - } + for (; list; list = list->next) { + dbus_message_iter_append_basic(&array_iter, + DBUS_TYPE_STRING, + &list->data); } dbus_message_iter_close_container(&iter, &array_iter); @@ -87,11 +85,39 @@ static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, return list_paths(conn, msg, mgr->servers); } +static DBusHandlerResult create_path(DBusConnection *conn, + DBusMessage *msg, char *path, + const char *sname) +{ + DBusMessage *reply, *signal; + + /* emit signal when it is a new path */ + if (sname) { + signal = dbus_message_new_signal(NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, sname); + + dbus_message_append_args(signal, + DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + send_message_and_unref(conn, signal); + } + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + g_free(path); + return send_message_and_unref(conn, reply); +} + static DBusHandlerResult create_server(DBusConnection *conn, DBusMessage *msg, void *data) { struct manager *mgr = data; - DBusMessage *reply; DBusError derr; const char *uuid; char *path; @@ -107,29 +133,28 @@ static DBusHandlerResult create_server(DBusConnection *conn, path = g_new0(char, 32); snprintf(path, 32, NETWORK_PATH "/server/%s", uuid); - if (!g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) { - if (server_register(conn, path) != -1) { - mgr->servers = g_slist_append(mgr->servers, - g_strdup(path)); - } - } - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; + /* Path already registered */ + if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) + return create_path(conn, msg, path, NULL); - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); + if (server_register(conn, path) == -1) { + err_failed(conn, msg, "D-Bus path registration failed"); + g_free(path); + return DBUS_HANDLER_RESULT_HANDLED; + } - g_free(path); - return send_message_and_unref(connection, reply); + mgr->servers = g_slist_append(mgr->servers, g_strdup(path)); + + return create_path(conn, msg, path, "ServerCreated"); } static DBusHandlerResult remove_path(DBusConnection *conn, - DBusMessage *msg, GSList **list) + DBusMessage *msg, GSList **list, + const char *sname) { const char *path; - DBusMessage *reply; + DBusMessage *reply, *signal; DBusError derr; GSList *l; @@ -144,7 +169,7 @@ static DBusHandlerResult remove_path(DBusConnection *conn, l = g_slist_find_custom(*list, path, (GCompareFunc) strcmp); if (!l) - return err_does_not_exist(conn, msg, "Server doesn't exist"); + return err_does_not_exist(conn, msg, "Path doesn't exist"); g_free(l->data); *list = g_slist_remove(*list, l->data); @@ -154,7 +179,16 @@ static DBusHandlerResult remove_path(DBusConnection *conn, return DBUS_HANDLER_RESULT_NEED_MEMORY; if (!dbus_connection_unregister_object_path(conn, path)) - error("Network server path unregister failed"); + error("Network path unregister failed"); + + signal = dbus_message_new_signal(NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, sname); + + dbus_message_append_args(signal, + DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + send_message_and_unref(conn, signal); return send_message_and_unref(conn, reply); } @@ -164,7 +198,7 @@ static DBusHandlerResult remove_server(DBusConnection *conn, { struct manager *mgr = data; - return remove_path(conn, msg, &mgr->servers); + return remove_path(conn, msg, &mgr->servers, "ServerRemoved"); } static DBusHandlerResult list_connections(DBusConnection *conn, @@ -180,7 +214,6 @@ static DBusHandlerResult create_connection(DBusConnection *conn, { struct manager *mgr = data; static int uid = 0; - DBusMessage *reply; DBusError derr; const char *addr; const char *uuid; @@ -198,20 +231,16 @@ static DBusHandlerResult create_connection(DBusConnection *conn, path = g_new0(char, 32); snprintf(path, 32, NETWORK_PATH "/connection%d", uid++); - if (connection_register(conn, path) != -1) { - mgr->connections = g_slist_append(mgr->connections, - g_strdup(path)); - } - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; + if (connection_register(conn, path, addr, uuid) == -1) { + err_failed(conn, msg, "D-Bus path registration failed"); + g_free(path); + return DBUS_HANDLER_RESULT_HANDLED; + } - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); + mgr->connections = g_slist_append(mgr->connections, g_strdup(path)); - g_free(path); - return send_message_and_unref(connection, reply); + return create_path(conn, msg, path, "ConnectionCreated"); } static DBusHandlerResult remove_connection(DBusConnection *conn, @@ -219,7 +248,7 @@ static DBusHandlerResult remove_connection(DBusConnection *conn, { struct manager *mgr = data; - return remove_path(conn, msg, &mgr->connections); + return remove_path(conn, msg, &mgr->connections, "ConnectionRemoved"); } static DBusHandlerResult manager_message(DBusConnection *conn, @@ -360,7 +389,7 @@ void internal_service(const char *identifier) DBUS_TYPE_STRING, &name, DBUS_TYPE_STRING, &desc, DBUS_TYPE_INVALID); - reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, + reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, NULL); if (!reply) { error("Can't register service"); -- cgit From d1e15b83b04cf2cfe3f154678b1d72ebaf783512 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 22 Mar 2007 14:21:01 +0000 Subject: network: Added Server.GetUUID() --- network/manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 42853811..a73c3147 100644 --- a/network/manager.c +++ b/network/manager.c @@ -138,7 +138,7 @@ static DBusHandlerResult create_server(DBusConnection *conn, if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) return create_path(conn, msg, path, NULL); - if (server_register(conn, path) == -1) { + if (server_register(conn, path, uuid) == -1) { err_failed(conn, msg, "D-Bus path registration failed"); g_free(path); return DBUS_HANDLER_RESULT_HANDLED; -- cgit From f844fe4f4284e2961cc4a6ee17cc7ede18a9aaf8 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 22 Mar 2007 17:07:24 +0000 Subject: network: removed err_generic function --- network/manager.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index a73c3147..c9a8d4e4 100644 --- a/network/manager.c +++ b/network/manager.c @@ -126,7 +126,7 @@ static DBusHandlerResult create_server(DBusConnection *conn, if (!dbus_message_get_args(msg, &derr, DBUS_TYPE_STRING, &uuid, DBUS_TYPE_INVALID)) { - err_generic(conn, msg, derr.name, derr.message); + err_invalid_args(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } @@ -162,7 +162,7 @@ static DBusHandlerResult remove_path(DBusConnection *conn, if (!dbus_message_get_args(msg, &derr, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) { - err_generic(conn, msg, derr.name, derr.message); + err_invalid_args(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } @@ -224,7 +224,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, DBUS_TYPE_STRING, &addr, DBUS_TYPE_STRING, &uuid, DBUS_TYPE_INVALID)) { - err_generic(conn, msg, derr.name, derr.message); + err_invalid_args(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } -- cgit From 29809147d7deb7a7326790ded39fc2488f725f44 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 22 Mar 2007 20:26:04 +0000 Subject: Add bnep_init and bnep_cleanup to manager. --- network/manager.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index c9a8d4e4..dde8c908 100644 --- a/network/manager.c +++ b/network/manager.c @@ -42,6 +42,7 @@ #include "manager.h" #include "server.h" #include "connection.h" +#include "common.h" struct manager { bdaddr_t src; /* Local adapter BT address */ @@ -301,6 +302,7 @@ static void manager_free(struct manager *mgr) g_slist_free(mgr->connections); g_free (mgr); + bnep_kill_all_connections(); } static void manager_unregister(DBusConnection *conn, void *data) @@ -414,6 +416,11 @@ int network_init(void) return -1; } + if (bnep_init()) { + error("Can't init bnep module"); + return -1; + } + return network_dbus_init(); } @@ -422,6 +429,7 @@ void network_exit(void) if (bridge_remove("pan0") < 0) error("Can't remove bridge"); + bnep_cleanup(); bridge_cleanup(); network_dbus_exit(); -- cgit From 2e39ac58720cba4fc6e889ec5f18a8ce1d67276c Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 23 Mar 2007 19:10:37 +0000 Subject: network: Fixed string/service id/uuid convertion functions --- network/manager.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index dde8c908..ff4d05d4 100644 --- a/network/manager.c +++ b/network/manager.c @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -120,26 +121,32 @@ static DBusHandlerResult create_server(DBusConnection *conn, { struct manager *mgr = data; DBusError derr; - const char *uuid; + const char *str; char *path; + uint16_t id; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &uuid, + DBUS_TYPE_STRING, &str, DBUS_TYPE_INVALID)) { err_invalid_args(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } + id = bnep_service_id(str); + if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) + return err_invalid_args(conn, msg, "Not supported"); + path = g_new0(char, 32); - snprintf(path, 32, NETWORK_PATH "/server/%s", uuid); + snprintf(path, 32, NETWORK_PATH "/server/%X", id); /* Path already registered */ if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) - return create_path(conn, msg, path, NULL); + return create_path(conn, msg, path, NULL); /* Return already exist error */ - if (server_register(conn, path, uuid) == -1) { + /* FIXME: define which type should be used -- string/uuid str/uui128 */ + if (server_register(conn, path, str) == -1) { err_failed(conn, msg, "D-Bus path registration failed"); g_free(path); return DBUS_HANDLER_RESULT_HANDLED; @@ -217,23 +224,25 @@ static DBusHandlerResult create_connection(DBusConnection *conn, static int uid = 0; DBusError derr; const char *addr; - const char *uuid; + const char *str; char *path; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, DBUS_TYPE_STRING, &addr, - DBUS_TYPE_STRING, &uuid, + DBUS_TYPE_STRING, &str, DBUS_TYPE_INVALID)) { err_invalid_args(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } + /* FIXME: Check for supported/implemented client connection */ + path = g_new0(char, 32); snprintf(path, 32, NETWORK_PATH "/connection%d", uid++); - if (connection_register(conn, path, addr, uuid) == -1) { + if (connection_register(conn, path, addr, str) == -1) { err_failed(conn, msg, "D-Bus path registration failed"); g_free(path); return DBUS_HANDLER_RESULT_HANDLED; -- cgit From ef3649fd9e62bd989ff67a125a05c962d5640fd3 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 23 Mar 2007 21:04:08 +0000 Subject: network: using service class identifier instead of the uuid 128 string for server registration --- network/manager.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index ff4d05d4..6740f100 100644 --- a/network/manager.c +++ b/network/manager.c @@ -139,14 +139,13 @@ static DBusHandlerResult create_server(DBusConnection *conn, return err_invalid_args(conn, msg, "Not supported"); path = g_new0(char, 32); - snprintf(path, 32, NETWORK_PATH "/server/%X", id); + snprintf(path, 32, NETWORK_PATH "/server/%s", bnep_name(id)); /* Path already registered */ if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) return create_path(conn, msg, path, NULL); /* Return already exist error */ - /* FIXME: define which type should be used -- string/uuid str/uui128 */ - if (server_register(conn, path, str) == -1) { + if (server_register(conn, path, id) == -1) { err_failed(conn, msg, "D-Bus path registration failed"); g_free(path); return DBUS_HANDLER_RESULT_HANDLED; -- cgit From d98a405d8fc5e9b3e5919b63c7498e6b11989663 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 23 Mar 2007 21:15:40 +0000 Subject: network: Added invalid service class verification for Manager.CreateConnection --- network/manager.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 6740f100..52e6bffa 100644 --- a/network/manager.c +++ b/network/manager.c @@ -225,6 +225,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, const char *addr; const char *str; char *path; + uint16_t id; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, @@ -236,12 +237,14 @@ static DBusHandlerResult create_connection(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } - /* FIXME: Check for supported/implemented client connection */ + id = bnep_service_id(str); + if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) + return err_invalid_args(conn, msg, "Not supported"); path = g_new0(char, 32); snprintf(path, 32, NETWORK_PATH "/connection%d", uid++); - if (connection_register(conn, path, addr, str) == -1) { + if (connection_register(conn, path, addr, id) == -1) { err_failed(conn, msg, "D-Bus path registration failed"); g_free(path); return DBUS_HANDLER_RESULT_HANDLED; -- cgit From 9bea84c70ceca8efd7f1137c5aa3425e77c196cf Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 26 Mar 2007 13:35:30 +0000 Subject: Fix service exit. --- network/manager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 52e6bffa..42542c9a 100644 --- a/network/manager.c +++ b/network/manager.c @@ -437,11 +437,11 @@ int network_init(void) void network_exit(void) { + network_dbus_exit(); + if (bridge_remove("pan0") < 0) error("Can't remove bridge"); bnep_cleanup(); bridge_cleanup(); - - network_dbus_exit(); } -- cgit From daf9e4f8a6fd95b682d26e3bdd965248de30c148 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 26 Mar 2007 18:59:34 +0000 Subject: network: added function to create the server(NAP/GN) service record --- network/manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 42542c9a..83cbaa14 100644 --- a/network/manager.c +++ b/network/manager.c @@ -145,7 +145,7 @@ static DBusHandlerResult create_server(DBusConnection *conn, if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) return create_path(conn, msg, path, NULL); /* Return already exist error */ - if (server_register(conn, path, id) == -1) { + if (server_register(conn, path, id) < 0) { err_failed(conn, msg, "D-Bus path registration failed"); g_free(path); return DBUS_HANDLER_RESULT_HANDLED; -- cgit From 1e3f6fcf0d53335e6fd8456c11357c5b13d51006 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 26 Mar 2007 19:11:57 +0000 Subject: network: removed memory leak(servers/connections list) --- network/manager.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 83cbaa14..915f1a4b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -306,11 +306,15 @@ static void manager_free(struct manager *mgr) if (!mgr) return; - if (mgr->servers) + if (mgr->servers) { + g_slist_foreach(mgr->servers, (GFunc)g_free, NULL); g_slist_free(mgr->servers); + } - if (mgr->connections) + if (mgr->connections) { + g_slist_foreach(mgr->connections, (GFunc)g_free, NULL); g_slist_free(mgr->connections); + } g_free (mgr); bnep_kill_all_connections(); -- cgit From 3ee5b90642bb7c8d2e88904600edac9d0d33efb4 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 27 Mar 2007 10:21:45 +0000 Subject: Improve D-Bus system bus integration --- network/manager.c | 55 +++++++++++++++---------------------------------------- 1 file changed, 15 insertions(+), 40 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 915f1a4b..60471429 100644 --- a/network/manager.c +++ b/network/manager.c @@ -341,17 +341,13 @@ int network_dbus_init(void) bdaddr_t src; int dev_id; - connection = init_dbus(NULL, NULL, NULL); - if (!connection) - return -1; - dbus_connection_set_exit_on_disconnect(connection, TRUE); mgr = g_new0(struct manager, 1); /* Fallback to catch invalid network path */ - if (!dbus_connection_register_fallback(connection, NETWORK_PATH, - &manager_table, mgr)) { + if (dbus_connection_register_fallback(connection, NETWORK_PATH, + &manager_table, mgr) == FALSE) { error("D-Bus failed to register %s path", NETWORK_PATH); goto fail; } @@ -384,43 +380,12 @@ fail: void network_dbus_exit(void) { dbus_connection_unregister_object_path(connection, NETWORK_PATH); - - dbus_connection_unref(connection); } -void internal_service(const char *identifier) +int network_init(DBusConnection *conn) { - DBusMessage *msg, *reply; - const char *name = "Network service", *desc = ""; - - info("Registering service"); + int err; - msg = dbus_message_new_method_call("org.bluez", "/org/bluez", - "org.bluez.Database", "RegisterService"); - if (!msg) { - error("Can't create service register method"); - return; - } - - dbus_message_append_args(msg, DBUS_TYPE_STRING, &identifier, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &desc, DBUS_TYPE_INVALID); - - reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, - NULL); - if (!reply) { - error("Can't register service"); - return; - } - - dbus_message_unref(msg); - dbus_message_unref(reply); - - dbus_connection_flush(connection); -} - -int network_init(void) -{ if (bridge_init() < 0) { error("Can't init bridge module"); return -1; @@ -436,13 +401,23 @@ int network_init(void) return -1; } - return network_dbus_init(); + connection = dbus_connection_ref(conn); + + err = network_dbus_init(); + if (err < 0) + dbus_connection_unref(connection); + + return err; } void network_exit(void) { network_dbus_exit(); + dbus_connection_unref(connection); + + connection = NULL; + if (bridge_remove("pan0") < 0) error("Can't remove bridge"); -- cgit From 71aaf58c77b00f192a2903a4e43b35a88869782b Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 27 Mar 2007 10:38:17 +0000 Subject: The service must start even without any adapters attached --- network/manager.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 60471429..a8b9974f 100644 --- a/network/manager.c +++ b/network/manager.c @@ -339,7 +339,9 @@ int network_dbus_init(void) { struct manager *mgr; bdaddr_t src; +#if 0 int dev_id; +#endif dbus_connection_set_exit_on_disconnect(connection, TRUE); @@ -356,6 +358,7 @@ int network_dbus_init(void) /* Set the default adapter */ bacpy(&src, BDADDR_ANY); +#if 0 dev_id = hci_get_route(&src); if (dev_id < 0) { error("Bluetooth device not available"); @@ -366,6 +369,7 @@ int network_dbus_init(void) error("Can't get local adapter device info"); goto fail; } +#endif bacpy(&mgr->src, &src); -- cgit From fab1c990ee59d3f41331f6c612ba302c2543710b Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 27 Mar 2007 21:58:58 +0000 Subject: Add code to check server capabilities. --- network/manager.c | 322 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 251 insertions(+), 71 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index a8b9974f..58c335bb 100644 --- a/network/manager.c +++ b/network/manager.c @@ -51,40 +51,28 @@ struct manager { GSList *connections; /* Network registered connections paths */ }; +struct pending_reply { + DBusConnection *conn; + DBusMessage *msg; + struct manager *mgr; + uint16_t id; + char *addr; + char *path; + char *adapter_path; +}; + static DBusConnection *connection = NULL; -static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, - GSList *list) +static void pending_reply_free(struct pending_reply *pr) { - DBusMessage *reply; - DBusMessageIter iter; - DBusMessageIter array_iter; - - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; + if (pr->addr) + g_free(pr->addr); - dbus_message_iter_init_append(reply, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, - DBUS_TYPE_STRING_AS_STRING, &array_iter); + if (pr->path) + g_free(pr->path); - for (; list; list = list->next) { - dbus_message_iter_append_basic(&array_iter, - DBUS_TYPE_STRING, - &list->data); - } - - dbus_message_iter_close_container(&iter, &array_iter); - - return send_message_and_unref(conn, reply); -} - -static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, - void *data) -{ - struct manager *mgr = data; - - return list_paths(conn, msg, mgr->servers); + if (pr->adapter_path) + g_free(pr->adapter_path); } static DBusHandlerResult create_path(DBusConnection *conn, @@ -116,44 +104,29 @@ static DBusHandlerResult create_path(DBusConnection *conn, return send_message_and_unref(conn, reply); } -static DBusHandlerResult create_server(DBusConnection *conn, - DBusMessage *msg, void *data) +static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, + GSList *list) { - struct manager *mgr = data; - DBusError derr; - const char *str; - char *path; - uint16_t id; - - dbus_error_init(&derr); - if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &str, - DBUS_TYPE_INVALID)) { - err_invalid_args(conn, msg, derr.message); - dbus_error_free(&derr); - return DBUS_HANDLER_RESULT_HANDLED; - } - - id = bnep_service_id(str); - if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) - return err_invalid_args(conn, msg, "Not supported"); + DBusMessage *reply; + DBusMessageIter iter; + DBusMessageIter array_iter; - path = g_new0(char, 32); - snprintf(path, 32, NETWORK_PATH "/server/%s", bnep_name(id)); + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; - /* Path already registered */ - if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) - return create_path(conn, msg, path, NULL); /* Return already exist error */ + dbus_message_iter_init_append(reply, &iter); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, + DBUS_TYPE_STRING_AS_STRING, &array_iter); - if (server_register(conn, path, id) < 0) { - err_failed(conn, msg, "D-Bus path registration failed"); - g_free(path); - return DBUS_HANDLER_RESULT_HANDLED; + for (; list; list = list->next) { + dbus_message_iter_append_basic(&array_iter, + DBUS_TYPE_STRING, + &list->data); } + dbus_message_iter_close_container(&iter, &array_iter); - mgr->servers = g_slist_append(mgr->servers, g_strdup(path)); - - return create_path(conn, msg, path, "ServerCreated"); + return send_message_and_unref(conn, reply); } static DBusHandlerResult remove_path(DBusConnection *conn, @@ -200,6 +173,206 @@ static DBusHandlerResult remove_path(DBusConnection *conn, return send_message_and_unref(conn, reply); } +static void pan_record_reply(DBusPendingCall *call, void *data) +{ + struct pending_reply *pr = data; + DBusMessage *reply = dbus_pending_call_steal_reply(call); + DBusError derr; + int len; + uint8_t *rec_bin; + + dbus_error_init(&derr); + if (dbus_set_error_from_message(&derr, reply)) { + if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) + err_connection_failed(pr->conn, pr->msg, derr.message); + else + err_not_supported(pr->conn, pr->msg); + + error("GetRemoteServiceRecord failed: %s(%s)", derr.name, + derr.message); + goto fail; + } + + if (!dbus_message_get_args(reply, &derr, + DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &rec_bin, &len, + DBUS_TYPE_INVALID)) { + err_not_supported(pr->conn, pr->msg); + error("%s: %s", derr.name, derr.message); + goto fail; + } + + if (len == 0) { + err_not_supported(pr->conn, pr->msg); + error("Invalid PAN service record length"); + goto fail; + } + + + if (connection_register(pr->conn, pr->path, pr->addr, pr->id) == -1) { + err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); + goto fail; + } + + pr->mgr->connections = g_slist_append(pr->mgr->connections, + g_strdup(pr->path)); + + create_path(pr->conn, pr->msg, g_strdup (pr->path), "ConnectionCreated"); +fail: + dbus_error_free(&derr); + pending_reply_free(pr); + dbus_message_unref(reply); + dbus_pending_call_unref(call); +} + +static int get_record(struct pending_reply *pr, uint32_t handle, + DBusPendingCallNotifyFunction cb) +{ + DBusMessage *msg; + DBusPendingCall *pending; + + msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, + "org.bluez.Adapter", "GetRemoteServiceRecord"); + if (!msg) + return -1; + + dbus_message_append_args(msg, + DBUS_TYPE_STRING, &pr->addr, + DBUS_TYPE_UINT32, &handle, + DBUS_TYPE_INVALID); + + if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { + error("Can't send D-Bus message."); + return -1; + } + + dbus_pending_call_set_notify(pending, cb, pr, NULL); + dbus_message_unref(msg); + + return 0; +} + +static void pan_handle_reply(DBusPendingCall *call, void *data) +{ + struct pending_reply *pr = data; + DBusMessage *reply = dbus_pending_call_steal_reply(call); + DBusError derr; + uint32_t *phandle; + int len; + + dbus_error_init(&derr); + if (dbus_set_error_from_message(&derr, reply)) { + if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) + err_connection_failed(pr->conn, pr->msg, derr.message); + else + err_not_supported(pr->conn, pr->msg); + + error("GetRemoteServiceHandles: %s(%s)", derr.name, derr.message); + goto fail; + } + + if (!dbus_message_get_args(reply, &derr, + DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle, &len, + DBUS_TYPE_INVALID)) { + err_not_supported(pr->conn, pr->msg); + error("%s: %s", derr.name, derr.message); + goto fail; + } + + if (!len) { + err_not_supported(pr->conn, pr->msg); + goto fail; + } + + if (get_record(pr, *phandle, pan_record_reply) < 0) { + err_not_supported(pr->conn, pr->msg); + goto fail; + } + + dbus_message_unref(reply); + dbus_pending_call_unref(call); + return; +fail: + dbus_error_free(&derr); + pending_reply_free(pr); +} + +static int get_handles(struct pending_reply *pr, DBusPendingCallNotifyFunction cb) +{ + DBusMessage *msg; + DBusPendingCall *pending; + const char *uuid; + + msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, + "org.bluez.Adapter", "GetRemoteServiceHandles"); + if (!msg) + return -1; + + uuid = bnep_uuid(pr->id); + dbus_message_append_args(msg, + DBUS_TYPE_STRING, &pr->addr, + DBUS_TYPE_STRING, &uuid, + DBUS_TYPE_INVALID); + + if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { + error("Can't send D-Bus message."); + return -1; + } + + dbus_pending_call_set_notify(pending, cb, pr, NULL); + dbus_message_unref(msg); + + return 0; +} + +static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, + void *data) +{ + struct manager *mgr = data; + + return list_paths(conn, msg, mgr->servers); +} + +static DBusHandlerResult create_server(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + struct manager *mgr = data; + DBusError derr; + const char *str; + char *path; + int id; + + dbus_error_init(&derr); + if (!dbus_message_get_args(msg, &derr, + DBUS_TYPE_STRING, &str, + DBUS_TYPE_INVALID)) { + err_invalid_args(conn, msg, derr.message); + dbus_error_free(&derr); + return DBUS_HANDLER_RESULT_HANDLED; + } + + id = bnep_service_id(str); + if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) + return err_invalid_args(conn, msg, "Not supported"); + + path = g_new0(char, 32); + snprintf(path, 32, NETWORK_PATH "/server/%X", id); + + /* Path already registered */ + if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) + return create_path(conn, msg, path, NULL); /* Return already exist error */ + + /* FIXME: define which type should be used -- string/uuid str/uui128 */ + if (server_register(conn, path, id) == -1) { + err_failed(conn, msg, "D-Bus path registration failed"); + g_free(path); + return DBUS_HANDLER_RESULT_HANDLED; + } + + mgr->servers = g_slist_append(mgr->servers, g_strdup(path)); + + return create_path(conn, msg, path, "ServerCreated"); +} + static DBusHandlerResult remove_server(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -220,11 +393,12 @@ static DBusHandlerResult create_connection(DBusConnection *conn, DBusMessage *msg, void *data) { struct manager *mgr = data; + struct pending_reply *pr; static int uid = 0; DBusError derr; + char src_addr[18]; const char *addr; const char *str; - char *path; uint16_t id; dbus_error_init(&derr); @@ -241,18 +415,24 @@ static DBusHandlerResult create_connection(DBusConnection *conn, if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) return err_invalid_args(conn, msg, "Not supported"); - path = g_new0(char, 32); - snprintf(path, 32, NETWORK_PATH "/connection%d", uid++); - - if (connection_register(conn, path, addr, id) == -1) { + pr = g_new(struct pending_reply, 1); + pr->conn = conn; + pr->msg = dbus_message_ref(msg); + pr->mgr = mgr; + pr->addr = g_strdup(addr); + pr->id = id; + pr->path = g_new0(char, 48); + snprintf(pr->path, 48, NETWORK_PATH "/connection%d", uid++); + ba2str(&mgr->src, src_addr); + pr->adapter_path = g_new0(char, 32); + snprintf(pr->adapter_path , 32, "/org/bluez/hci%d", hci_devid(src_addr)); + + if (get_handles(pr, pan_handle_reply) < 0) { err_failed(conn, msg, "D-Bus path registration failed"); - g_free(path); - return DBUS_HANDLER_RESULT_HANDLED; + pending_reply_free(pr); } - mgr->connections = g_slist_append(mgr->connections, g_strdup(path)); - - return create_path(conn, msg, path, "ConnectionCreated"); + return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult remove_connection(DBusConnection *conn, -- cgit From fe648edb4d67bb603509f392d3c82ebfe8334921 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 29 Mar 2007 14:01:25 +0000 Subject: Add code to extract record attributes. --- network/manager.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 58c335bb..2f745c1c 100644 --- a/network/manager.c +++ b/network/manager.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include @@ -178,8 +180,9 @@ static void pan_record_reply(DBusPendingCall *call, void *data) struct pending_reply *pr = data; DBusMessage *reply = dbus_pending_call_steal_reply(call); DBusError derr; - int len; + int len, scanned; uint8_t *rec_bin; + sdp_record_t *rec; dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { @@ -207,8 +210,10 @@ static void pan_record_reply(DBusPendingCall *call, void *data) goto fail; } + rec = sdp_extract_pdu(rec_bin, &scanned); - if (connection_register(pr->conn, pr->path, pr->addr, pr->id) == -1) { + if (connection_register(pr->conn, pr->path, pr->addr, pr->id, + rec) == -1) { err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); goto fail; } @@ -218,6 +223,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data) create_path(pr->conn, pr->msg, g_strdup (pr->path), "ConnectionCreated"); fail: + sdp_record_free(rec); dbus_error_free(&derr); pending_reply_free(pr); dbus_message_unref(reply); -- cgit From 3b82e98cb01ce9632701c0872e5e64f1290a0c8a Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 29 Mar 2007 20:23:05 +0000 Subject: Fixes to use DefaultAdapter when an adapter is necessary. --- network/manager.c | 107 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 36 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 2f745c1c..1accb8a2 100644 --- a/network/manager.c +++ b/network/manager.c @@ -48,7 +48,6 @@ #include "common.h" struct manager { - bdaddr_t src; /* Local adapter BT address */ GSList *servers; /* Network registered servers paths */ GSList *connections; /* Network registered connections paths */ }; @@ -182,11 +181,12 @@ static void pan_record_reply(DBusPendingCall *call, void *data) DBusError derr; int len, scanned; uint8_t *rec_bin; - sdp_record_t *rec; + sdp_record_t *rec = NULL; dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { - if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) + if (dbus_error_has_name(&derr, + "org.bluez.Error.ConnectionAttemptFailed")) err_connection_failed(pr->conn, pr->msg, derr.message); else err_not_supported(pr->conn, pr->msg); @@ -267,18 +267,20 @@ static void pan_handle_reply(DBusPendingCall *call, void *data) dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { - if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) + if (dbus_error_has_name(&derr, + "org.bluez.Error.ConnectionAttemptFailed")) err_connection_failed(pr->conn, pr->msg, derr.message); else err_not_supported(pr->conn, pr->msg); - error("GetRemoteServiceHandles: %s(%s)", derr.name, derr.message); + error("GetRemoteServiceHandles: %s(%s)", derr.name, + derr.message); goto fail; } if (!dbus_message_get_args(reply, &derr, - DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle, &len, - DBUS_TYPE_INVALID)) { + DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle, + &len, DBUS_TYPE_INVALID)) { err_not_supported(pr->conn, pr->msg); error("%s: %s", derr.name, derr.message); goto fail; @@ -302,7 +304,8 @@ fail: pending_reply_free(pr); } -static int get_handles(struct pending_reply *pr, DBusPendingCallNotifyFunction cb) +static int get_handles(struct pending_reply *pr, + DBusPendingCallNotifyFunction cb) { DBusMessage *msg; DBusPendingCall *pending; @@ -330,6 +333,65 @@ static int get_handles(struct pending_reply *pr, DBusPendingCallNotifyFunction c return 0; } +static void default_adapter_reply(DBusPendingCall *call, void *data) +{ + struct pending_reply *pr = data; + DBusMessage *reply = dbus_pending_call_steal_reply(call); + DBusError derr; + const char *adapter; + + dbus_error_init(&derr); + if (dbus_set_error_from_message(&derr, reply)) { + err_connection_failed(pr->conn, pr->msg, derr.message); + error("DefaultAdapter: %s(%s)", derr.name, derr.message); + goto fail; + } + + if (!dbus_message_get_args(reply, &derr, + DBUS_TYPE_STRING, &adapter, + DBUS_TYPE_INVALID)) { + err_connection_failed(pr->conn, pr->msg, derr.message); + error("%s: %s", derr.name, derr.message); + goto fail; + } + + pr->adapter_path = g_strdup(adapter); + + if (get_handles(pr, pan_handle_reply) < 0) { + err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); + goto fail; + } + + dbus_message_unref(reply); + dbus_pending_call_unref(call); + return; +fail: + dbus_error_free(&derr); + pending_reply_free(pr); +} + +static int get_default_adapter(struct pending_reply *pr, + DBusPendingCallNotifyFunction cb) +{ + DBusMessage *msg; + DBusPendingCall *pending; + + msg = dbus_message_new_method_call("org.bluez", "/org/bluez", + "org.bluez.Manager", "DefaultAdapter"); + if (!msg) + return -1; + + if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { + error("Can't send D-Bus message."); + return -1; + } + + dbus_pending_call_set_notify(pending, cb, pr, NULL); + dbus_message_unref(msg); + + return 0; +} + static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -402,7 +464,6 @@ static DBusHandlerResult create_connection(DBusConnection *conn, struct pending_reply *pr; static int uid = 0; DBusError derr; - char src_addr[18]; const char *addr; const char *str; uint16_t id; @@ -429,11 +490,8 @@ static DBusHandlerResult create_connection(DBusConnection *conn, pr->id = id; pr->path = g_new0(char, 48); snprintf(pr->path, 48, NETWORK_PATH "/connection%d", uid++); - ba2str(&mgr->src, src_addr); - pr->adapter_path = g_new0(char, 32); - snprintf(pr->adapter_path , 32, "/org/bluez/hci%d", hci_devid(src_addr)); - if (get_handles(pr, pan_handle_reply) < 0) { + if (get_default_adapter(pr, default_adapter_reply) < 0) { err_failed(conn, msg, "D-Bus path registration failed"); pending_reply_free(pr); } @@ -524,12 +582,6 @@ static const DBusObjectPathVTable manager_table = { int network_dbus_init(void) { struct manager *mgr; - bdaddr_t src; -#if 0 - int dev_id; -#endif - - dbus_connection_set_exit_on_disconnect(connection, TRUE); mgr = g_new0(struct manager, 1); @@ -542,23 +594,6 @@ int network_dbus_init(void) info("Registered manager path:%s", NETWORK_PATH); - /* Set the default adapter */ - bacpy(&src, BDADDR_ANY); -#if 0 - dev_id = hci_get_route(&src); - if (dev_id < 0) { - error("Bluetooth device not available"); - goto fail; - } - - if (hci_devba(dev_id, &src) < 0) { - error("Can't get local adapter device info"); - goto fail; - } -#endif - - bacpy(&mgr->src, &src); - return 0; fail: -- cgit From e9e95fcbedbb256e0dbcb4f9f79cd5e7db1465fc Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 30 Mar 2007 14:38:32 +0000 Subject: Return an error when server already exist. --- network/manager.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 1accb8a2..33cbd36f 100644 --- a/network/manager.c +++ b/network/manager.c @@ -425,11 +425,9 @@ static DBusHandlerResult create_server(DBusConnection *conn, path = g_new0(char, 32); snprintf(path, 32, NETWORK_PATH "/server/%X", id); - /* Path already registered */ if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) - return create_path(conn, msg, path, NULL); /* Return already exist error */ + return err_already_exists(conn, msg, "Server Already exists"); - /* FIXME: define which type should be used -- string/uuid str/uui128 */ if (server_register(conn, path, id) == -1) { err_failed(conn, msg, "D-Bus path registration failed"); g_free(path); -- cgit From 0f09acbace55a146315d240d45132faf62ad45cf Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 2 Apr 2007 18:23:50 +0000 Subject: Add storage code. --- network/manager.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 82 insertions(+), 15 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 33cbd36f..ace1f602 100644 --- a/network/manager.c +++ b/network/manager.c @@ -77,7 +77,7 @@ static void pending_reply_free(struct pending_reply *pr) } static DBusHandlerResult create_path(DBusConnection *conn, - DBusMessage *msg, char *path, + DBusMessage *msg, const char *path, const char *sname) { DBusMessage *reply, *signal; @@ -101,7 +101,6 @@ static DBusHandlerResult create_path(DBusConnection *conn, dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID); - g_free(path); return send_message_and_unref(conn, reply); } @@ -221,7 +220,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data) pr->mgr->connections = g_slist_append(pr->mgr->connections, g_strdup(pr->path)); - create_path(pr->conn, pr->msg, g_strdup (pr->path), "ConnectionCreated"); + create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); fail: sdp_record_free(rec); dbus_error_free(&derr); @@ -333,6 +332,64 @@ static int get_handles(struct pending_reply *pr, return 0; } +static void get_address_reply(DBusPendingCall *call, void *data) +{ + struct pending_reply *pr = data; + DBusMessage *reply = dbus_pending_call_steal_reply(call); + DBusError derr; + const char *address; + + dbus_error_init(&derr); + if (dbus_set_error_from_message(&derr, reply)) { + error("GetAddress: %s(%s)", derr.name, derr.message); + goto fail; + } + + if (!dbus_message_get_args(reply, &derr, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_INVALID)) { + error("%s: %s", derr.name, derr.message); + goto fail; + } + + if (server_register(pr->conn, address, pr->path, pr->id) < 0) { + err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); + goto fail; + } + + pr->mgr->servers = g_slist_append(pr->mgr->servers, + g_strdup(pr->path)); + + create_path(pr->conn, pr->msg, pr->path, "ServerCreated"); +fail: + dbus_error_free(&derr); + dbus_message_unref(reply); + dbus_pending_call_unref(call); + return; +} + +static int get_address(struct pending_reply *pr, + DBusPendingCallNotifyFunction cb) +{ + DBusMessage *msg; + DBusPendingCall *pending; + + msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, + "org.bluez.Adapter", "GetAddress"); + if (!msg) + return -1; + + if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { + error("Can't send D-Bus message."); + return -1; + } + + dbus_pending_call_set_notify(pending, cb, pr, NULL); + dbus_message_unref(msg); + + return 0; +} + static void default_adapter_reply(DBusPendingCall *call, void *data) { struct pending_reply *pr = data; @@ -357,7 +414,10 @@ static void default_adapter_reply(DBusPendingCall *call, void *data) pr->adapter_path = g_strdup(adapter); - if (get_handles(pr, pan_handle_reply) < 0) { + if (pr->id == BNEP_SVC_PANU && (get_handles(pr, pan_handle_reply) < 0)) { + err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); + goto fail; + } else if (get_address(pr, get_address_reply) < 0) { err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); goto fail; } @@ -404,9 +464,9 @@ static DBusHandlerResult create_server(DBusConnection *conn, DBusMessage *msg, void *data) { struct manager *mgr = data; + struct pending_reply *pr; DBusError derr; const char *str; - char *path; int id; dbus_error_init(&derr); @@ -422,21 +482,28 @@ static DBusHandlerResult create_server(DBusConnection *conn, if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) return err_invalid_args(conn, msg, "Not supported"); - path = g_new0(char, 32); - snprintf(path, 32, NETWORK_PATH "/server/%X", id); - - if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) - return err_already_exists(conn, msg, "Server Already exists"); + pr = g_new(struct pending_reply, 1); + pr->conn = conn; + pr->msg = dbus_message_ref(msg); + pr->mgr = mgr; + pr->addr = NULL; + pr->id = id; + pr->path = g_new0(char, 32); + snprintf(pr->path, 32, NETWORK_PATH "/server/%s", bnep_name(id)); - if (server_register(conn, path, id) == -1) { - err_failed(conn, msg, "D-Bus path registration failed"); - g_free(path); + if (g_slist_find_custom(mgr->servers, pr->path, + (GCompareFunc) strcmp)) { + err_already_exists(conn, msg, "Server Already exists"); + pending_reply_free(pr); return DBUS_HANDLER_RESULT_HANDLED; } - mgr->servers = g_slist_append(mgr->servers, g_strdup(path)); + if (get_default_adapter(pr, default_adapter_reply) < 0) { + err_failed(conn, msg, "D-Bus path registration failed"); + pending_reply_free(pr); + } - return create_path(conn, msg, path, "ServerCreated"); + return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult remove_server(DBusConnection *conn, -- cgit From a2ace90c14ede86b8179a930fb104de4aca93849 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 5 Apr 2007 15:00:54 +0000 Subject: Fix bug while disconnecting. --- network/manager.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index ace1f602..1cbb9c70 100644 --- a/network/manager.c +++ b/network/manager.c @@ -414,9 +414,11 @@ static void default_adapter_reply(DBusPendingCall *call, void *data) pr->adapter_path = g_strdup(adapter); - if (pr->id == BNEP_SVC_PANU && (get_handles(pr, pan_handle_reply) < 0)) { - err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); - goto fail; + if (pr->addr) { + if (get_handles(pr, pan_handle_reply) < 0) { + err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); + goto fail; + } } else if (get_address(pr, get_address_reply) < 0) { err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); goto fail; -- cgit From 6b9efc12eaf7ae2196bf7b80f3fc33366f97390e Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 5 Apr 2007 18:58:41 +0000 Subject: network: missing pending_reply initialization and connection ref/unref --- network/manager.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 1cbb9c70..408e0ab3 100644 --- a/network/manager.c +++ b/network/manager.c @@ -68,12 +68,14 @@ static void pending_reply_free(struct pending_reply *pr) { if (pr->addr) g_free(pr->addr); - if (pr->path) g_free(pr->path); - if (pr->adapter_path) g_free(pr->adapter_path); + if (pr->msg) + dbus_message_unref(pr->msg); + if (pr->conn) + dbus_connection_unref(pr->conn); } static DBusHandlerResult create_path(DBusConnection *conn, @@ -484,8 +486,8 @@ static DBusHandlerResult create_server(DBusConnection *conn, if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) return err_invalid_args(conn, msg, "Not supported"); - pr = g_new(struct pending_reply, 1); - pr->conn = conn; + pr = g_new0(struct pending_reply, 1); + pr->conn = dbus_connection_ref(conn);; pr->msg = dbus_message_ref(msg); pr->mgr = mgr; pr->addr = NULL; @@ -549,8 +551,8 @@ static DBusHandlerResult create_connection(DBusConnection *conn, if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) return err_invalid_args(conn, msg, "Not supported"); - pr = g_new(struct pending_reply, 1); - pr->conn = conn; + pr = g_new0(struct pending_reply, 1); + pr->conn = dbus_connection_ref(conn); pr->msg = dbus_message_ref(msg); pr->mgr = mgr; pr->addr = g_strdup(addr); -- cgit From 9743174631a196c41c50d30af936d62488e9b843 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 12 Apr 2007 12:19:39 +0000 Subject: network: code cleanup --- network/manager.c | 63 ++++++++++++++++++++----------------------------------- 1 file changed, 23 insertions(+), 40 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 408e0ab3..0195c960 100644 --- a/network/manager.c +++ b/network/manager.c @@ -53,13 +53,13 @@ struct manager { }; struct pending_reply { - DBusConnection *conn; - DBusMessage *msg; - struct manager *mgr; - uint16_t id; - char *addr; - char *path; - char *adapter_path; + DBusConnection *conn; + DBusMessage *msg; + struct manager *mgr; + char *addr; + char *path; + char *adapter_path; + uint16_t id; }; static DBusConnection *connection = NULL; @@ -648,37 +648,9 @@ static const DBusObjectPathVTable manager_table = { .unregister_function = manager_unregister, }; -int network_dbus_init(void) -{ - struct manager *mgr; - - mgr = g_new0(struct manager, 1); - - /* Fallback to catch invalid network path */ - if (dbus_connection_register_fallback(connection, NETWORK_PATH, - &manager_table, mgr) == FALSE) { - error("D-Bus failed to register %s path", NETWORK_PATH); - goto fail; - } - - info("Registered manager path:%s", NETWORK_PATH); - - return 0; - -fail: - manager_free(mgr); - - return -1; -} - -void network_dbus_exit(void) -{ - dbus_connection_unregister_object_path(connection, NETWORK_PATH); -} - int network_init(DBusConnection *conn) { - int err; + struct manager *mgr; if (bridge_init() < 0) { error("Can't init bridge module"); @@ -697,16 +669,27 @@ int network_init(DBusConnection *conn) connection = dbus_connection_ref(conn); - err = network_dbus_init(); - if (err < 0) + /* FIXME: make manager global */ + mgr = g_new0(struct manager, 1); + + /* Fallback to catch invalid network path */ + if (dbus_connection_register_fallback(connection, NETWORK_PATH, + &manager_table, mgr) == FALSE) { + error("D-Bus failed to register %s path", NETWORK_PATH); + manager_free(mgr); dbus_connection_unref(connection); - return err; + return -1; + } + + info("Registered manager path:%s", NETWORK_PATH); + + return 0; } void network_exit(void) { - network_dbus_exit(); + dbus_connection_unregister_object_path(connection, NETWORK_PATH); dbus_connection_unref(connection); -- cgit From ed62b516d4db8930b0f768caf462c53bbaecaa4e Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 12 Apr 2007 12:49:55 +0000 Subject: network: use global server/connection list for manager --- network/manager.c | 74 +++++++++++++++++-------------------------------------- 1 file changed, 22 insertions(+), 52 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 0195c960..b2b47aaa 100644 --- a/network/manager.c +++ b/network/manager.c @@ -47,15 +47,12 @@ #include "connection.h" #include "common.h" -struct manager { - GSList *servers; /* Network registered servers paths */ - GSList *connections; /* Network registered connections paths */ -}; +static GSList *server_paths = NULL; /* Network registered servers paths */ +static GSList *connection_paths = NULL; /* Network registered connections paths */ struct pending_reply { DBusConnection *conn; DBusMessage *msg; - struct manager *mgr; char *addr; char *path; char *adapter_path; @@ -219,8 +216,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data) goto fail; } - pr->mgr->connections = g_slist_append(pr->mgr->connections, - g_strdup(pr->path)); + connection_paths = g_slist_append(connection_paths, g_strdup(pr->path)); create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); fail: @@ -359,8 +355,7 @@ static void get_address_reply(DBusPendingCall *call, void *data) goto fail; } - pr->mgr->servers = g_slist_append(pr->mgr->servers, - g_strdup(pr->path)); + server_paths = g_slist_append(server_paths, g_strdup(pr->path)); create_path(pr->conn, pr->msg, pr->path, "ServerCreated"); fail: @@ -459,15 +454,12 @@ static int get_default_adapter(struct pending_reply *pr, static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, void *data) { - struct manager *mgr = data; - - return list_paths(conn, msg, mgr->servers); + return list_paths(conn, msg, server_paths); } static DBusHandlerResult create_server(DBusConnection *conn, DBusMessage *msg, void *data) { - struct manager *mgr = data; struct pending_reply *pr; DBusError derr; const char *str; @@ -489,13 +481,12 @@ static DBusHandlerResult create_server(DBusConnection *conn, pr = g_new0(struct pending_reply, 1); pr->conn = dbus_connection_ref(conn);; pr->msg = dbus_message_ref(msg); - pr->mgr = mgr; pr->addr = NULL; pr->id = id; pr->path = g_new0(char, 32); snprintf(pr->path, 32, NETWORK_PATH "/server/%s", bnep_name(id)); - if (g_slist_find_custom(mgr->servers, pr->path, + if (g_slist_find_custom(server_paths, pr->path, (GCompareFunc) strcmp)) { err_already_exists(conn, msg, "Server Already exists"); pending_reply_free(pr); @@ -513,23 +504,18 @@ static DBusHandlerResult create_server(DBusConnection *conn, static DBusHandlerResult remove_server(DBusConnection *conn, DBusMessage *msg, void *data) { - struct manager *mgr = data; - - return remove_path(conn, msg, &mgr->servers, "ServerRemoved"); + return remove_path(conn, msg, &server_paths, "ServerRemoved"); } static DBusHandlerResult list_connections(DBusConnection *conn, DBusMessage *msg, void *data) { - struct manager *mgr = data; - - return list_paths(conn, msg, mgr->connections); + return list_paths(conn, msg, connection_paths); } static DBusHandlerResult create_connection(DBusConnection *conn, DBusMessage *msg, void *data) { - struct manager *mgr = data; struct pending_reply *pr; static int uid = 0; DBusError derr; @@ -554,7 +540,6 @@ static DBusHandlerResult create_connection(DBusConnection *conn, pr = g_new0(struct pending_reply, 1); pr->conn = dbus_connection_ref(conn); pr->msg = dbus_message_ref(msg); - pr->mgr = mgr; pr->addr = g_strdup(addr); pr->id = id; pr->path = g_new0(char, 48); @@ -571,9 +556,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, static DBusHandlerResult remove_connection(DBusConnection *conn, DBusMessage *msg, void *data) { - struct manager *mgr = data; - - return remove_path(conn, msg, &mgr->connections, "ConnectionRemoved"); + return remove_path(conn, msg, &connection_paths, "ConnectionRemoved"); } static DBusHandlerResult manager_message(DBusConnection *conn, @@ -614,34 +597,25 @@ static DBusHandlerResult manager_message(DBusConnection *conn, return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } -static void manager_free(struct manager *mgr) +static void manager_unregister(DBusConnection *conn, void *data) { - if (!mgr) - return; + info("Unregistered manager path"); - if (mgr->servers) { - g_slist_foreach(mgr->servers, (GFunc)g_free, NULL); - g_slist_free(mgr->servers); + if (server_paths) { + g_slist_foreach(server_paths, (GFunc)g_free, NULL); + g_slist_free(server_paths); + server_paths = NULL; } - if (mgr->connections) { - g_slist_foreach(mgr->connections, (GFunc)g_free, NULL); - g_slist_free(mgr->connections); + if (connection_paths) { + g_slist_foreach(connection_paths, (GFunc)g_free, NULL); + g_slist_free(connection_paths); + connection_paths = NULL; } - g_free (mgr); bnep_kill_all_connections(); } -static void manager_unregister(DBusConnection *conn, void *data) -{ - struct manager *mgr = data; - - info("Unregistered manager path"); - - manager_free(mgr); -} - /* Virtual table to handle manager object path hierarchy */ static const DBusObjectPathVTable manager_table = { .message_function = manager_message, @@ -650,8 +624,6 @@ static const DBusObjectPathVTable manager_table = { int network_init(DBusConnection *conn) { - struct manager *mgr; - if (bridge_init() < 0) { error("Can't init bridge module"); return -1; @@ -669,14 +641,10 @@ int network_init(DBusConnection *conn) connection = dbus_connection_ref(conn); - /* FIXME: make manager global */ - mgr = g_new0(struct manager, 1); - /* Fallback to catch invalid network path */ if (dbus_connection_register_fallback(connection, NETWORK_PATH, - &manager_table, mgr) == FALSE) { + &manager_table, NULL) == FALSE) { error("D-Bus failed to register %s path", NETWORK_PATH); - manager_free(mgr); dbus_connection_unref(connection); return -1; @@ -684,6 +652,8 @@ int network_init(DBusConnection *conn) info("Registered manager path:%s", NETWORK_PATH); + /* FIXME: Missing register stored servers */ + return 0; } -- cgit From b47f37f54576c39dc863c14cdc7a623fc13a729f Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 12 Apr 2007 13:33:23 +0000 Subject: network: added initial code to register stored servers --- network/manager.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 6 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index b2b47aaa..491b3845 100644 --- a/network/manager.c +++ b/network/manager.c @@ -25,6 +25,9 @@ #include #endif +#include +#include + #include #include #include @@ -34,8 +37,9 @@ #include -#include "logging.h" #include "dbus.h" +#include "logging.h" +#include "textfile.h" #define NETWORK_PATH "/org/bluez/network" #define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager" @@ -47,6 +51,8 @@ #include "connection.h" #include "common.h" +#define MAX_PATH_LENGTH 64 /* D-Bus path */ + static GSList *server_paths = NULL; /* Network registered servers paths */ static GSList *connection_paths = NULL; /* Network registered connections paths */ @@ -483,8 +489,8 @@ static DBusHandlerResult create_server(DBusConnection *conn, pr->msg = dbus_message_ref(msg); pr->addr = NULL; pr->id = id; - pr->path = g_new0(char, 32); - snprintf(pr->path, 32, NETWORK_PATH "/server/%s", bnep_name(id)); + pr->path = g_new0(char, MAX_PATH_LENGTH); + snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH "/server/%s", bnep_name(id)); if (g_slist_find_custom(server_paths, pr->path, (GCompareFunc) strcmp)) { @@ -542,8 +548,8 @@ static DBusHandlerResult create_connection(DBusConnection *conn, pr->msg = dbus_message_ref(msg); pr->addr = g_strdup(addr); pr->id = id; - pr->path = g_new0(char, 48); - snprintf(pr->path, 48, NETWORK_PATH "/connection%d", uid++); + pr->path = g_new0(char, MAX_PATH_LENGTH); + snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH "/connection%d", uid++); if (get_default_adapter(pr, default_adapter_reply) < 0) { err_failed(conn, msg, "D-Bus path registration failed"); @@ -622,6 +628,53 @@ static const DBusObjectPathVTable manager_table = { .unregister_function = manager_unregister, }; +static void stored_server(char *key, char *value, void *data) +{ + char path[MAX_PATH_LENGTH]; + char addr[18]; + const bdaddr_t *src = data; + uint16_t id; + + /* FIXME: we need change the path to support multiple sources */ + + ba2str(src, addr); + id = bnep_service_id(key); + snprintf(path, MAX_PATH_LENGTH, "%s/server/%s", NETWORK_PATH, bnep_name(id)); + + if (server_register(connection, addr, path, id) < 0) + error("Register (%s, %s) path failed", addr, path); +} + +static void register_stored_servers(void) +{ + char dirname[PATH_MAX + 1]; + char filename[PATH_MAX + 1]; + struct dirent *de; + DIR *dir; + bdaddr_t src; + + snprintf(dirname, PATH_MAX, "%s", STORAGEDIR); + + dir = opendir(dirname); + if (!dir) + return; + + while ((de = readdir(dir)) != NULL) { + if (!isdigit(de->d_name[0])) + continue; + + create_name(filename, PATH_MAX, STORAGEDIR, + de->d_name, "network"); + + str2ba(de->d_name, &src); + + textfile_foreach(filename, stored_server, &src); + } + + closedir(dir); +} + + int network_init(DBusConnection *conn) { if (bridge_init() < 0) { @@ -652,7 +705,7 @@ int network_init(DBusConnection *conn) info("Registered manager path:%s", NETWORK_PATH); - /* FIXME: Missing register stored servers */ + register_stored_servers(); return 0; } -- cgit From 1cbec5ebe8d67b1b4dcef1768efde2ac1ac51970 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 12 Apr 2007 18:15:13 +0000 Subject: Add FindConnection method, bug fixes for disconnect events. --- network/manager.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 491b3845..d2b627db 100644 --- a/network/manager.c +++ b/network/manager.c @@ -519,6 +519,45 @@ static DBusHandlerResult list_connections(DBusConnection *conn, return list_paths(conn, msg, connection_paths); } +static DBusHandlerResult find_connection(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBusError derr; + const char *pattern; + const char *path; + GSList *list; + DBusMessage *reply; + + dbus_error_init(&derr); + if (!dbus_message_get_args(msg, &derr, + DBUS_TYPE_STRING, &pattern, + DBUS_TYPE_INVALID)) { + err_invalid_args(conn, msg, derr.message); + dbus_error_free(&derr); + return DBUS_HANDLER_RESULT_HANDLED; + } + + for (list = connection_paths; list; list = list->next) { + path = (const char *) list->data; + if (connection_find_data(conn, path, pattern) == 0) + break; + } + + if (list == NULL) { + err_failed(conn, msg, "No such connection"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + return send_message_and_unref(conn, reply); +} + static DBusHandlerResult create_connection(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -594,6 +633,9 @@ static DBusHandlerResult manager_message(DBusConnection *conn, if (strcmp(member, "ListConnections") == 0) return list_connections(conn, msg, data); + if (strcmp(member, "FindConnection") == 0) + return find_connection(conn, msg, data); + if (strcmp(member, "CreateConnection") == 0) return create_connection(conn, msg, data); -- cgit From 4d8f5eb37c895d875a7fdcce45f03c406adfa668 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 12 Apr 2007 18:42:47 +0000 Subject: network: changed the server D-Bus path and moved storage functions to manager.c --- network/manager.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 11 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index d2b627db..c09cbc8b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -28,6 +28,8 @@ #include #include +#include + #include #include #include @@ -53,9 +55,6 @@ #define MAX_PATH_LENGTH 64 /* D-Bus path */ -static GSList *server_paths = NULL; /* Network registered servers paths */ -static GSList *connection_paths = NULL; /* Network registered connections paths */ - struct pending_reply { DBusConnection *conn; DBusMessage *msg; @@ -65,8 +64,13 @@ struct pending_reply { uint16_t id; }; +static GSList *server_paths = NULL; /* Network registered servers paths */ +static GSList *connection_paths = NULL; /* Network registered connections paths */ + static DBusConnection *connection = NULL; +static int net_uid = 0; /* Network objects identifier */ + static void pending_reply_free(struct pending_reply *pr) { if (pr->addr) @@ -342,6 +346,7 @@ static void get_address_reply(DBusPendingCall *call, void *data) DBusMessage *reply = dbus_pending_call_steal_reply(call); DBusError derr; const char *address; + bdaddr_t src; dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { @@ -361,6 +366,9 @@ static void get_address_reply(DBusPendingCall *call, void *data) goto fail; } + str2ba(address, &src); + network_store_info(&src, pr->id, FALSE); + server_paths = g_slist_append(server_paths, g_strdup(pr->path)); create_path(pr->conn, pr->msg, pr->path, "ServerCreated"); @@ -490,7 +498,8 @@ static DBusHandlerResult create_server(DBusConnection *conn, pr->addr = NULL; pr->id = id; pr->path = g_new0(char, MAX_PATH_LENGTH); - snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH "/server/%s", bnep_name(id)); + snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH"/server/%s%d", + bnep_name(id), net_uid++); if (g_slist_find_custom(server_paths, pr->path, (GCompareFunc) strcmp)) { @@ -510,6 +519,7 @@ static DBusHandlerResult create_server(DBusConnection *conn, static DBusHandlerResult remove_server(DBusConnection *conn, DBusMessage *msg, void *data) { + /* FIXME: Remove from the storage */ return remove_path(conn, msg, &server_paths, "ServerRemoved"); } @@ -562,7 +572,6 @@ static DBusHandlerResult create_connection(DBusConnection *conn, DBusMessage *msg, void *data) { struct pending_reply *pr; - static int uid = 0; DBusError derr; const char *addr; const char *str; @@ -588,7 +597,8 @@ static DBusHandlerResult create_connection(DBusConnection *conn, pr->addr = g_strdup(addr); pr->id = id; pr->path = g_new0(char, MAX_PATH_LENGTH); - snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH "/connection%d", uid++); + snprintf(pr->path, MAX_PATH_LENGTH, + NETWORK_PATH"/connection%d", net_uid++); if (get_default_adapter(pr, default_adapter_reply) < 0) { err_failed(conn, msg, "D-Bus path registration failed"); @@ -601,6 +611,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, static DBusHandlerResult remove_connection(DBusConnection *conn, DBusMessage *msg, void *data) { + /* FIXME: Remove from the storage */ return remove_path(conn, msg, &connection_paths, "ConnectionRemoved"); } @@ -677,14 +688,12 @@ static void stored_server(char *key, char *value, void *data) const bdaddr_t *src = data; uint16_t id; - /* FIXME: we need change the path to support multiple sources */ - ba2str(src, addr); id = bnep_service_id(key); - snprintf(path, MAX_PATH_LENGTH, "%s/server/%s", NETWORK_PATH, bnep_name(id)); + snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/%s%d", + bnep_name(id), net_uid++); - if (server_register(connection, addr, path, id) < 0) - error("Register (%s, %s) path failed", addr, path); + server_register(connection, addr, path, id); } static void register_stored_servers(void) @@ -766,3 +775,45 @@ void network_exit(void) bnep_cleanup(); bridge_cleanup(); } + +static inline int create_filename(char *buf, size_t size, + bdaddr_t *bdaddr, const char *name) +{ + char addr[18]; + + ba2str(bdaddr, addr); + + return create_name(buf, size, STORAGEDIR, addr, name); +} + +int network_del_stored_info(bdaddr_t *src, uint16_t uuid) +{ + char filename[PATH_MAX + 1]; + const char *str; + int err; + + create_filename(filename, PATH_MAX, src, "network"); + + str = bnep_uuid(uuid); + + err = textfile_del(filename, str); + + return err; +} + +int network_store_info(bdaddr_t *src, uint16_t uuid, gboolean enable) +{ + char filename[PATH_MAX + 1]; + const char *str; + int err; + + create_filename(filename, PATH_MAX, src, "network"); + + str = bnep_uuid(uuid); + + create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + err = textfile_put(filename, str, enable ? "1" : "0"); + + return err; +} -- cgit From bf2e27fac1f9c0af68eaa91e00375d8f8907ebc4 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 13 Apr 2007 13:14:02 +0000 Subject: network: initial skeleton to register stored network NAP/GN/PANU --- network/manager.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index c09cbc8b..2b7d21e8 100644 --- a/network/manager.c +++ b/network/manager.c @@ -681,22 +681,25 @@ static const DBusObjectPathVTable manager_table = { .unregister_function = manager_unregister, }; -static void stored_server(char *key, char *value, void *data) +static void register_stored_nap(const bdaddr_t *src, const char *filename) { - char path[MAX_PATH_LENGTH]; - char addr[18]; - const bdaddr_t *src = data; - uint16_t id; + /* FIXME: extract name, description, secure, enabled, address range, routing ...*/ +} + +static void register_stored_gn(const bdaddr_t *src, const char *filename) +{ + /* FIXME: extract name, description, secure, enabled, address range ...*/ +} - ba2str(src, addr); - id = bnep_service_id(key); - snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/%s%d", - bnep_name(id), net_uid++); +static void register_stored_connection(char *key, char *value, void *data) +{ + + /* Format: XX:XX:XX:XX:XX:XX#{NAP, GN} name:description */ - server_register(connection, addr, path, id); + info("connection - key:%s value:%s", key, value); } -static void register_stored_servers(void) +static void register_stored(void) { char dirname[PATH_MAX + 1]; char filename[PATH_MAX + 1]; @@ -714,18 +717,27 @@ static void register_stored_servers(void) if (!isdigit(de->d_name[0])) continue; + /* Connection objects */ create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "network"); str2ba(de->d_name, &src); + textfile_foreach(filename, register_stored_connection, &src); + + /* NAP objects */ + create_name(filename, PATH_MAX, STORAGEDIR, + de->d_name, "nap"); + register_stored_nap(&src, filename); - textfile_foreach(filename, stored_server, &src); + /* GN objects */ + create_name(filename, PATH_MAX, STORAGEDIR, + de->d_name, "gn"); + register_stored_gn(&src, filename); } closedir(dir); } - int network_init(DBusConnection *conn) { if (bridge_init() < 0) { @@ -756,7 +768,7 @@ int network_init(DBusConnection *conn) info("Registered manager path:%s", NETWORK_PATH); - register_stored_servers(); + register_stored(); return 0; } -- cgit From 54cc7aee9e7d723697ecb807871a65ce9af309a0 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 13 Apr 2007 15:09:31 +0000 Subject: network: added code to parse the network file --- network/manager.c | 71 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 14 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 2b7d21e8..93f0821d 100644 --- a/network/manager.c +++ b/network/manager.c @@ -681,22 +681,65 @@ static const DBusObjectPathVTable manager_table = { .unregister_function = manager_unregister, }; -static void register_stored_nap(const bdaddr_t *src, const char *filename) +static void parse_stored_connection(char *key, char *value, void *data) { - /* FIXME: extract name, description, secure, enabled, address range, routing ...*/ -} + bdaddr_t dst; + char path[MAX_PATH_LENGTH]; + char addr[18]; + const char *ptr; + char *name; + int len, id; -static void register_stored_gn(const bdaddr_t *src, const char *filename) -{ - /* FIXME: extract name, description, secure, enabled, address range ...*/ -} + /* Format: XX:XX:XX:XX:XX:XX#{NAP, GN} name:description */ -static void register_stored_connection(char *key, char *value, void *data) -{ + /* Parsing the key: address#role */ + ptr = strchr(key, '#'); - /* Format: XX:XX:XX:XX:XX:XX#{NAP, GN} name:description */ + /* Empty address or invalid len */ + if (!ptr || ((ptr - key) != 17)) + return; + + memset(addr, 0, 18); + strncpy(addr, key, 17); + str2ba(addr, &dst); + + /* Empty role */ + if (++ptr == NULL) + return; + + if (strcasecmp("nap", ptr) == 0) { + id = BNEP_SVC_NAP; + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/server/nap%d", net_uid++); + } else if (strcasecmp("gn", ptr) == 0) { + id = BNEP_SVC_GN; + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/server/gn%d", net_uid++); + } else { + /* Invalid role */ + return; + } + + /* Parsing the value: name and description */ + ptr = strchr(value, ':'); + + /* Empty name */ + if (!ptr) + return; + + len = ptr-value; + name = g_malloc0(len + 1); + strncpy(name, value, len); + + /* Empty description */ + if (++ptr == NULL) { + g_free(name); + return; + } + + /* FIXME: Change the connection_register prototype */ - info("connection - key:%s value:%s", key, value); + g_free(name); } static void register_stored(void) @@ -722,17 +765,17 @@ static void register_stored(void) de->d_name, "network"); str2ba(de->d_name, &src); - textfile_foreach(filename, register_stored_connection, &src); + textfile_foreach(filename, parse_stored_connection, &src); /* NAP objects */ create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "nap"); - register_stored_nap(&src, filename); + register_nap_from_file(&src, filename); /* GN objects */ create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "gn"); - register_stored_gn(&src, filename); + register_gn_from_file(&src, filename); } closedir(dir); -- cgit From 4706fa6e70ea2e19c7892ade0323a35d4f0b5a47 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 13 Apr 2007 18:51:51 +0000 Subject: network: changed connection_register prototype --- network/manager.c | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 93f0821d..43bc9b71 100644 --- a/network/manager.c +++ b/network/manager.c @@ -58,10 +58,11 @@ struct pending_reply { DBusConnection *conn; DBusMessage *msg; - char *addr; - char *path; - char *adapter_path; - uint16_t id; + bdaddr_t src; /* Source Address */ + char *addr; /* Destination Address*/ + char *path; /* D-Bus object path */ + char *adapter_path; /* Default adapter path */ + uint16_t id; /* Role */ }; static GSList *server_paths = NULL; /* Network registered servers paths */ @@ -187,9 +188,12 @@ static void pan_record_reply(DBusPendingCall *call, void *data) struct pending_reply *pr = data; DBusMessage *reply = dbus_pending_call_steal_reply(call); DBusError derr; + bdaddr_t src, dst; int len, scanned; uint8_t *rec_bin; + sdp_data_t *d; sdp_record_t *rec = NULL; + char *name = NULL, *desc = NULL; dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { @@ -220,8 +224,28 @@ static void pan_record_reply(DBusPendingCall *call, void *data) rec = sdp_extract_pdu(rec_bin, &scanned); - if (connection_register(pr->conn, pr->path, pr->addr, pr->id, - rec) == -1) { + /* Extract service name from record */ + d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY); + if (d) { + name = g_new0(char, d->unitSize); + snprintf(name, d->unitSize, "%.*s", + d->unitSize, d->val.str); + } + + /* Extract service description from record */ + d = sdp_data_get(rec, SDP_ATTR_SVCDESC_PRIMARY); + if (d) { + desc = g_new0(char, d->unitSize); + snprintf(desc, d->unitSize, "%.*s", + d->unitSize, d->val.str); + } + + /* FIXME: it can' t be hard coded */ + bacpy(&src, BDADDR_ANY); + str2ba(pr->addr, &dst); + + if (connection_register(pr->conn, pr->path, &src, + &dst, pr->id, name, desc) < 0) { err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); goto fail; } @@ -230,6 +254,12 @@ static void pan_record_reply(DBusPendingCall *call, void *data) create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); fail: + + if (name) + g_free(name); + if (desc) + g_free(desc); + sdp_record_free(rec); dbus_error_free(&derr); pending_reply_free(pr); @@ -508,6 +538,7 @@ static DBusHandlerResult create_server(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } + /* FIXME: use hci_get_route */ if (get_default_adapter(pr, default_adapter_reply) < 0) { err_failed(conn, msg, "D-Bus path registration failed"); pending_reply_free(pr); @@ -600,6 +631,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH"/connection%d", net_uid++); + /* FIXME: use hci_get_route */ if (get_default_adapter(pr, default_adapter_reply) < 0) { err_failed(conn, msg, "D-Bus path registration failed"); pending_reply_free(pr); @@ -683,7 +715,7 @@ static const DBusObjectPathVTable manager_table = { static void parse_stored_connection(char *key, char *value, void *data) { - bdaddr_t dst; + bdaddr_t dst, *src = data; char path[MAX_PATH_LENGTH]; char addr[18]; const char *ptr; @@ -737,7 +769,7 @@ static void parse_stored_connection(char *key, char *value, void *data) return; } - /* FIXME: Change the connection_register prototype */ + connection_register(connection, path, src, &dst, id, name, ptr); g_free(name); } -- cgit From 235f0862a242772d8e3e51cd4f4dd8277939bbe5 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 13 Apr 2007 20:21:11 +0000 Subject: network: added register_nap_from_file --- network/manager.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 43bc9b71..15209592 100644 --- a/network/manager.c +++ b/network/manager.c @@ -739,18 +739,15 @@ static void parse_stored_connection(char *key, char *value, void *data) if (++ptr == NULL) return; - if (strcasecmp("nap", ptr) == 0) { + if (strcasecmp("nap", ptr) == 0) id = BNEP_SVC_NAP; - snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/server/nap%d", net_uid++); - } else if (strcasecmp("gn", ptr) == 0) { + else if (strcasecmp("gn", ptr) == 0) id = BNEP_SVC_GN; - snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/server/gn%d", net_uid++); - } else { - /* Invalid role */ + else return; - } + + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/connection%d", net_uid++); /* Parsing the value: name and description */ ptr = strchr(value, ':'); @@ -778,8 +775,10 @@ static void register_stored(void) { char dirname[PATH_MAX + 1]; char filename[PATH_MAX + 1]; + char path[MAX_PATH_LENGTH]; struct dirent *de; DIR *dir; + struct stat s; bdaddr_t src; snprintf(dirname, PATH_MAX, "%s", STORAGEDIR); @@ -797,17 +796,27 @@ static void register_stored(void) de->d_name, "network"); str2ba(de->d_name, &src); - textfile_foreach(filename, parse_stored_connection, &src); + + + if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) + textfile_foreach(filename, parse_stored_connection, &src); /* NAP objects */ - create_name(filename, PATH_MAX, STORAGEDIR, - de->d_name, "nap"); - register_nap_from_file(&src, filename); + create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "nap"); + + if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/server/nap%d", net_uid++); + register_nap_from_file(connection, path, &src, filename); + } /* GN objects */ - create_name(filename, PATH_MAX, STORAGEDIR, - de->d_name, "gn"); - register_gn_from_file(&src, filename); + create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "gn"); + if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/server/gn%d", net_uid++); + register_gn_from_file(connection, path, &src, filename); + } } closedir(dir); -- cgit From a4bc8363b53f68c20bed8dcf5bf436c8609be199 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 13 Apr 2007 20:38:37 +0000 Subject: network: moved register_nap_from_file to server_register_from file to support gn and nap registration --- network/manager.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 15209592..450fd872 100644 --- a/network/manager.c +++ b/network/manager.c @@ -803,11 +803,11 @@ static void register_stored(void) /* NAP objects */ create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "nap"); - if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/nap%d", net_uid++); - register_nap_from_file(connection, path, &src, filename); + server_register_from_file(connection, path, + &src, BNEP_SVC_NAP, filename); } /* GN objects */ @@ -815,7 +815,8 @@ static void register_stored(void) if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/gn%d", net_uid++); - register_gn_from_file(connection, path, &src, filename); + server_register_from_file(connection, path, + &src, BNEP_SVC_GN, filename); } } -- cgit From af49fed2e0f5b71203c67fc163d29464ed534399 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 13 Apr 2007 20:58:03 +0000 Subject: network: changed server_register signature and code cleanup --- network/manager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 450fd872..b2ca7fe7 100644 --- a/network/manager.c +++ b/network/manager.c @@ -391,12 +391,12 @@ static void get_address_reply(DBusPendingCall *call, void *data) goto fail; } - if (server_register(pr->conn, address, pr->path, pr->id) < 0) { + str2ba(address, &src); + if (server_register(pr->conn, pr->path, &src, pr->id) < 0) { err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); goto fail; } - str2ba(address, &src); network_store_info(&src, pr->id, FALSE); server_paths = g_slist_append(server_paths, g_strdup(pr->path)); -- cgit From 373808d7a4932c4b5a2616e09f0d8e7d45ccabbe Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 13 Apr 2007 21:38:36 +0000 Subject: network: cleanup and added some FIXME tags --- network/manager.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index b2ca7fe7..ed793592 100644 --- a/network/manager.c +++ b/network/manager.c @@ -887,30 +887,28 @@ int network_del_stored_info(bdaddr_t *src, uint16_t uuid) { char filename[PATH_MAX + 1]; const char *str; - int err; create_filename(filename, PATH_MAX, src, "network"); - str = bnep_uuid(uuid); + /* FIXME: Wrong format */ - err = textfile_del(filename, str); + str = bnep_uuid(uuid); - return err; + return textfile_del(filename, str); } int network_store_info(bdaddr_t *src, uint16_t uuid, gboolean enable) { char filename[PATH_MAX + 1]; const char *str; - int err; create_filename(filename, PATH_MAX, src, "network"); + /* FIXME: Wrong format */ + str = bnep_uuid(uuid); create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - err = textfile_put(filename, str, enable ? "1" : "0"); - - return err; + return textfile_put(filename, str, enable ? "1" : "0"); } -- cgit From 47895f4ab3f4de2682088dfba156106c772a92da Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Sat, 14 Apr 2007 00:19:59 +0000 Subject: network: addded server_store --- network/manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index ed793592..86dc26dc 100644 --- a/network/manager.c +++ b/network/manager.c @@ -397,7 +397,7 @@ static void get_address_reply(DBusPendingCall *call, void *data) goto fail; } - network_store_info(&src, pr->id, FALSE); + server_store(pr->conn, pr->path); server_paths = g_slist_append(server_paths, g_strdup(pr->path)); -- cgit From e5ba646776ba7c5c5c9c9d630bbfc8793f1c3b4e Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Sat, 14 Apr 2007 01:12:34 +0000 Subject: network: added connection_store --- network/manager.c | 1 + 1 file changed, 1 insertion(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 86dc26dc..c546ed0c 100644 --- a/network/manager.c +++ b/network/manager.c @@ -250,6 +250,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data) goto fail; } + connection_store(pr->conn, pr->path); connection_paths = g_slist_append(connection_paths, g_strdup(pr->path)); create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); -- cgit From e968bf544679fbf8565b2354cb4beac3641538e4 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 16 Apr 2007 13:14:07 +0000 Subject: network: added server_remove_stored function --- network/manager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index c546ed0c..f41d395e 100644 --- a/network/manager.c +++ b/network/manager.c @@ -168,6 +168,8 @@ static DBusHandlerResult remove_path(DBusConnection *conn, if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; + /* Remove the nap or gn file from the file system */ + server_remove_stored(conn, path); if (!dbus_connection_unregister_object_path(conn, path)) error("Network path unregister failed"); @@ -551,7 +553,6 @@ static DBusHandlerResult create_server(DBusConnection *conn, static DBusHandlerResult remove_server(DBusConnection *conn, DBusMessage *msg, void *data) { - /* FIXME: Remove from the storage */ return remove_path(conn, msg, &server_paths, "ServerRemoved"); } @@ -644,7 +645,6 @@ static DBusHandlerResult create_connection(DBusConnection *conn, static DBusHandlerResult remove_connection(DBusConnection *conn, DBusMessage *msg, void *data) { - /* FIXME: Remove from the storage */ return remove_path(conn, msg, &connection_paths, "ConnectionRemoved"); } -- cgit From 3723149c0baab5f94d57221fa693e4d0ec19df6b Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 16 Apr 2007 13:26:16 +0000 Subject: network: missing append registered server paths to the list --- network/manager.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index f41d395e..78d69150 100644 --- a/network/manager.c +++ b/network/manager.c @@ -807,8 +807,11 @@ static void register_stored(void) if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/nap%d", net_uid++); - server_register_from_file(connection, path, - &src, BNEP_SVC_NAP, filename); + + if (server_register_from_file(connection, path, + &src, BNEP_SVC_NAP, filename) == 0) + server_paths = g_slist_append(server_paths, + g_strdup(path)); } /* GN objects */ @@ -816,8 +819,11 @@ static void register_stored(void) if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/gn%d", net_uid++); - server_register_from_file(connection, path, - &src, BNEP_SVC_GN, filename); + + if (server_register_from_file(connection, path, + &src, BNEP_SVC_GN, filename) == 0) + server_paths = g_slist_append(server_paths, + g_strdup(path)); } } -- cgit From 8c599674509651cc8e68d12ba21423dbf13305d9 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 16 Apr 2007 13:49:13 +0000 Subject: network: added function to store/update server property --- network/manager.c | 30 ------------------------------ 1 file changed, 30 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 78d69150..16123002 100644 --- a/network/manager.c +++ b/network/manager.c @@ -889,33 +889,3 @@ static inline int create_filename(char *buf, size_t size, return create_name(buf, size, STORAGEDIR, addr, name); } - -int network_del_stored_info(bdaddr_t *src, uint16_t uuid) -{ - char filename[PATH_MAX + 1]; - const char *str; - - create_filename(filename, PATH_MAX, src, "network"); - - /* FIXME: Wrong format */ - - str = bnep_uuid(uuid); - - return textfile_del(filename, str); -} - -int network_store_info(bdaddr_t *src, uint16_t uuid, gboolean enable) -{ - char filename[PATH_MAX + 1]; - const char *str; - - create_filename(filename, PATH_MAX, src, "network"); - - /* FIXME: Wrong format */ - - str = bnep_uuid(uuid); - - create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - - return textfile_put(filename, str, enable ? "1" : "0"); -} -- cgit From d2692a02cf86935b4c96198eff694a01c3001890 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 16 Apr 2007 19:32:49 +0000 Subject: network: fixed default adapter --- network/manager.c | 199 ++++++++++++------------------------------------------ 1 file changed, 44 insertions(+), 155 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 16123002..88dc21e5 100644 --- a/network/manager.c +++ b/network/manager.c @@ -27,6 +27,7 @@ #include #include +#include #include @@ -58,8 +59,9 @@ struct pending_reply { DBusConnection *conn; DBusMessage *msg; - bdaddr_t src; /* Source Address */ - char *addr; /* Destination Address*/ + bdaddr_t src; /* Source address */ + bdaddr_t dst; /* Destination address */ + char *addr; /* Destination address */ char *path; /* D-Bus object path */ char *adapter_path; /* Default adapter path */ uint16_t id; /* Role */ @@ -74,6 +76,7 @@ static int net_uid = 0; /* Network objects identifier */ static void pending_reply_free(struct pending_reply *pr) { + if (pr->addr) g_free(pr->addr); if (pr->path) @@ -190,7 +193,6 @@ static void pan_record_reply(DBusPendingCall *call, void *data) struct pending_reply *pr = data; DBusMessage *reply = dbus_pending_call_steal_reply(call); DBusError derr; - bdaddr_t src, dst; int len, scanned; uint8_t *rec_bin; sdp_data_t *d; @@ -242,12 +244,8 @@ static void pan_record_reply(DBusPendingCall *call, void *data) d->unitSize, d->val.str); } - /* FIXME: it can' t be hard coded */ - bacpy(&src, BDADDR_ANY); - str2ba(pr->addr, &dst); - - if (connection_register(pr->conn, pr->path, &src, - &dst, pr->id, name, desc) < 0) { + if (connection_register(pr->conn, pr->path, &pr->src, + &pr->dst, pr->id, name, desc) < 0) { err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); goto fail; } @@ -373,131 +371,6 @@ static int get_handles(struct pending_reply *pr, return 0; } -static void get_address_reply(DBusPendingCall *call, void *data) -{ - struct pending_reply *pr = data; - DBusMessage *reply = dbus_pending_call_steal_reply(call); - DBusError derr; - const char *address; - bdaddr_t src; - - dbus_error_init(&derr); - if (dbus_set_error_from_message(&derr, reply)) { - error("GetAddress: %s(%s)", derr.name, derr.message); - goto fail; - } - - if (!dbus_message_get_args(reply, &derr, - DBUS_TYPE_STRING, &address, - DBUS_TYPE_INVALID)) { - error("%s: %s", derr.name, derr.message); - goto fail; - } - - str2ba(address, &src); - if (server_register(pr->conn, pr->path, &src, pr->id) < 0) { - err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); - goto fail; - } - - server_store(pr->conn, pr->path); - - server_paths = g_slist_append(server_paths, g_strdup(pr->path)); - - create_path(pr->conn, pr->msg, pr->path, "ServerCreated"); -fail: - dbus_error_free(&derr); - dbus_message_unref(reply); - dbus_pending_call_unref(call); - return; -} - -static int get_address(struct pending_reply *pr, - DBusPendingCallNotifyFunction cb) -{ - DBusMessage *msg; - DBusPendingCall *pending; - - msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, - "org.bluez.Adapter", "GetAddress"); - if (!msg) - return -1; - - if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { - error("Can't send D-Bus message."); - return -1; - } - - dbus_pending_call_set_notify(pending, cb, pr, NULL); - dbus_message_unref(msg); - - return 0; -} - -static void default_adapter_reply(DBusPendingCall *call, void *data) -{ - struct pending_reply *pr = data; - DBusMessage *reply = dbus_pending_call_steal_reply(call); - DBusError derr; - const char *adapter; - - dbus_error_init(&derr); - if (dbus_set_error_from_message(&derr, reply)) { - err_connection_failed(pr->conn, pr->msg, derr.message); - error("DefaultAdapter: %s(%s)", derr.name, derr.message); - goto fail; - } - - if (!dbus_message_get_args(reply, &derr, - DBUS_TYPE_STRING, &adapter, - DBUS_TYPE_INVALID)) { - err_connection_failed(pr->conn, pr->msg, derr.message); - error("%s: %s", derr.name, derr.message); - goto fail; - } - - pr->adapter_path = g_strdup(adapter); - - if (pr->addr) { - if (get_handles(pr, pan_handle_reply) < 0) { - err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); - goto fail; - } - } else if (get_address(pr, get_address_reply) < 0) { - err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); - goto fail; - } - - dbus_message_unref(reply); - dbus_pending_call_unref(call); - return; -fail: - dbus_error_free(&derr); - pending_reply_free(pr); -} - -static int get_default_adapter(struct pending_reply *pr, - DBusPendingCallNotifyFunction cb) -{ - DBusMessage *msg; - DBusPendingCall *pending; - - msg = dbus_message_new_method_call("org.bluez", "/org/bluez", - "org.bluez.Manager", "DefaultAdapter"); - if (!msg) - return -1; - - if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { - error("Can't send D-Bus message."); - return -1; - } - - dbus_pending_call_set_notify(pending, cb, pr, NULL); - dbus_message_unref(msg); - - return 0; -} - static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -507,10 +380,12 @@ static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, static DBusHandlerResult create_server(DBusConnection *conn, DBusMessage *msg, void *data) { - struct pending_reply *pr; + char path[MAX_PATH_LENGTH]; DBusError derr; const char *str; - int id; + bdaddr_t src; + uint16_t id; + int dev_id; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, @@ -525,27 +400,32 @@ static DBusHandlerResult create_server(DBusConnection *conn, if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) return err_invalid_args(conn, msg, "Not supported"); - pr = g_new0(struct pending_reply, 1); - pr->conn = dbus_connection_ref(conn);; - pr->msg = dbus_message_ref(msg); - pr->addr = NULL; - pr->id = id; - pr->path = g_new0(char, MAX_PATH_LENGTH); - snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH"/server/%s%d", + snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/%s%d", bnep_name(id), net_uid++); - if (g_slist_find_custom(server_paths, pr->path, + if (g_slist_find_custom(server_paths, path, (GCompareFunc) strcmp)) { err_already_exists(conn, msg, "Server Already exists"); - pending_reply_free(pr); return DBUS_HANDLER_RESULT_HANDLED; } - /* FIXME: use hci_get_route */ - if (get_default_adapter(pr, default_adapter_reply) < 0) { - err_failed(conn, msg, "D-Bus path registration failed"); - pending_reply_free(pr); - } + bacpy(&src, BDADDR_ANY); + + dev_id = hci_get_route(NULL); + + if (dev_id >= 0) + hci_devba(dev_id, &src); + + if (server_register(conn, path, &src, id) < 0) + return err_failed(conn, msg, + "D-Bus path registration failed"); + + if (bacmp(&src, BDADDR_ANY) != 0) + server_store(conn, path); + + server_paths = g_slist_append(server_paths, g_strdup(path)); + + create_path(conn, msg, path, "ServerCreated"); return DBUS_HANDLER_RESULT_HANDLED; } @@ -608,7 +488,9 @@ static DBusHandlerResult create_connection(DBusConnection *conn, DBusError derr; const char *addr; const char *str; + bdaddr_t src; uint16_t id; + int dev_id; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, @@ -624,20 +506,27 @@ static DBusHandlerResult create_connection(DBusConnection *conn, if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) return err_invalid_args(conn, msg, "Not supported"); + bacpy(&src, BDADDR_ANY); + dev_id = hci_get_route(NULL); + 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->conn = dbus_connection_ref(conn); pr->msg = dbus_message_ref(msg); + bacpy(&pr->src, &src); + str2ba(addr, &pr->dst); pr->addr = g_strdup(addr); pr->id = id; pr->path = g_new0(char, MAX_PATH_LENGTH); snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH"/connection%d", net_uid++); - /* FIXME: use hci_get_route */ - if (get_default_adapter(pr, default_adapter_reply) < 0) { - err_failed(conn, msg, "D-Bus path registration failed"); - pending_reply_free(pr); - } + 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); return DBUS_HANDLER_RESULT_HANDLED; } -- cgit From d3d1ce6e2bc9ecbfb70b5d306e419750ba0936b6 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 16 Apr 2007 19:41:59 +0000 Subject: network: missing append registered connection paths to the list --- network/manager.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 88dc21e5..95699d39 100644 --- a/network/manager.c +++ b/network/manager.c @@ -656,7 +656,11 @@ static void parse_stored_connection(char *key, char *value, void *data) return; } - connection_register(connection, path, src, &dst, id, name, ptr); + if (connection_register(connection, path, src, + &dst, id, name, ptr) == 0) { + connection_paths = g_slist_append(connection_paths, + g_strdup(path)); + } g_free(name); } -- cgit From cc8d980b559908480979eac0f4d33957fce70727 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 19 Apr 2007 17:48:23 +0000 Subject: Unref pending calls. --- network/manager.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 95699d39..898a183b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -291,6 +291,7 @@ static int get_record(struct pending_reply *pr, uint32_t handle, dbus_pending_call_set_notify(pending, cb, pr, NULL); dbus_message_unref(msg); + dbus_pending_call_unref(pending); return 0; } @@ -367,6 +368,7 @@ static int get_handles(struct pending_reply *pr, dbus_pending_call_set_notify(pending, cb, pr, NULL); dbus_message_unref(msg); + dbus_pending_call_unref(pending); return 0; } -- cgit From 36d0506a28a2413467d2c5e793d53c45b2183d34 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 20 Apr 2007 15:41:32 +0000 Subject: Check connection busy before removing it. --- network/manager.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 898a183b..65d8634b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -164,6 +164,9 @@ static DBusHandlerResult remove_path(DBusConnection *conn, if (!l) return err_does_not_exist(conn, msg, "Path doesn't exist"); + if (*list == connection_paths && connection_has_pending (conn, path)) + return err_failed(conn, msg, "Connection is Busy"); + g_free(l->data); *list = g_slist_remove(*list, l->data); -- cgit From 748b15f0a5eb6c1078a4dff64604f042c48a7a4a Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 25 Apr 2007 18:04:47 +0000 Subject: Fix bug while creating connection, unref pending call just once. --- network/manager.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 65d8634b..6f7a5257 100644 --- a/network/manager.c +++ b/network/manager.c @@ -268,7 +268,6 @@ fail: dbus_error_free(&derr); pending_reply_free(pr); dbus_message_unref(reply); - dbus_pending_call_unref(call); } static int get_record(struct pending_reply *pr, uint32_t handle, @@ -339,7 +338,6 @@ static void pan_handle_reply(DBusPendingCall *call, void *data) } dbus_message_unref(reply); - dbus_pending_call_unref(call); return; fail: dbus_error_free(&derr); -- cgit From 3268722532e19150b0084dd3b64c3cf0b0bb03ea Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Tue, 1 May 2007 14:56:05 +0000 Subject: network: minor cleanup --- network/manager.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 6f7a5257..cc13ed62 100644 --- a/network/manager.c +++ b/network/manager.c @@ -428,9 +428,7 @@ static DBusHandlerResult create_server(DBusConnection *conn, server_paths = g_slist_append(server_paths, g_strdup(path)); - create_path(conn, msg, path, "ServerCreated"); - - return DBUS_HANDLER_RESULT_HANDLED; + return create_path(conn, msg, path, "ServerCreated"); } static DBusHandlerResult remove_server(DBusConnection *conn, -- cgit From 4cf3d33cf13dcb613bb50026a1908d18ee7b7f16 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 8 May 2007 13:48:37 +0000 Subject: Fix server load from storage and add FindServer to API. --- network/manager.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index cc13ed62..720f4eb1 100644 --- a/network/manager.c +++ b/network/manager.c @@ -431,6 +431,45 @@ static DBusHandlerResult create_server(DBusConnection *conn, return create_path(conn, msg, path, "ServerCreated"); } +static DBusHandlerResult find_server(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBusError derr; + const char *pattern; + const char *path; + GSList *list; + DBusMessage *reply; + + dbus_error_init(&derr); + if (!dbus_message_get_args(msg, &derr, + DBUS_TYPE_STRING, &pattern, + DBUS_TYPE_INVALID)) { + err_invalid_args(conn, msg, derr.message); + dbus_error_free(&derr); + return DBUS_HANDLER_RESULT_HANDLED; + } + + for (list = server_paths; list; list = list->next) { + path = (const char *) list->data; + if (server_find_data(conn, path, pattern) == 0) + break; + } + + if (list == NULL) { + err_failed(conn, msg, "No such server"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + return send_message_and_unref(conn, reply); +} + static DBusHandlerResult remove_server(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -561,6 +600,9 @@ static DBusHandlerResult manager_message(DBusConnection *conn, if (strcmp(member, "CreateServer") == 0) return create_server(conn, msg, data); + if (strcmp(member, "FindServer") == 0) + return find_server(conn, msg, data); + if (strcmp(member, "RemoveServer") == 0) return remove_server(conn, msg, data); -- cgit From e9143c3e1fd1b882f475c98394f549d2b2aabcea Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 8 May 2007 14:41:11 +0000 Subject: Proceed if the bridge creation fails --- network/manager.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 720f4eb1..9309701b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -25,9 +25,9 @@ #include #endif +#include #include #include -#include #include @@ -773,10 +773,8 @@ int network_init(DBusConnection *conn) return -1; } - if (bridge_create("pan0") < 0) { + if (bridge_create("pan0") < 0) error("Can't create bridge"); - return -1; - } if (bnep_init()) { error("Can't init bnep module"); -- cgit From a0d73b7c7ce83bdd633aca429897a89ac7667490 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Wed, 9 May 2007 14:31:27 +0000 Subject: Switch to using generic dbus framework method dispatching --- network/manager.c | 94 +++++++++++++++++++++---------------------------------- 1 file changed, 36 insertions(+), 58 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 9309701b..8e8a4066 100644 --- a/network/manager.c +++ b/network/manager.c @@ -41,6 +41,7 @@ #include #include "dbus.h" +#include "dbus-helper.h" #include "logging.h" #include "textfile.h" @@ -577,50 +578,6 @@ static DBusHandlerResult remove_connection(DBusConnection *conn, return remove_path(conn, msg, &connection_paths, "ConnectionRemoved"); } -static DBusHandlerResult manager_message(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - const char *path, *iface, *member; - - path = dbus_message_get_path(msg); - iface = dbus_message_get_interface(msg); - member = dbus_message_get_member(msg); - - /* Catching fallback paths */ - if (strcmp(NETWORK_PATH, path) != 0) - return err_unknown_connection(conn, msg); - - /* Accept messages from the manager interface only */ - if (strcmp(NETWORK_MANAGER_INTERFACE, iface)) - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - - if (strcmp(member, "ListServers") == 0) - return list_servers(conn, msg, data); - - if (strcmp(member, "CreateServer") == 0) - return create_server(conn, msg, data); - - if (strcmp(member, "FindServer") == 0) - return find_server(conn, msg, data); - - if (strcmp(member, "RemoveServer") == 0) - return remove_server(conn, msg, data); - - if (strcmp(member, "ListConnections") == 0) - return list_connections(conn, msg, data); - - if (strcmp(member, "FindConnection") == 0) - return find_connection(conn, msg, data); - - if (strcmp(member, "CreateConnection") == 0) - return create_connection(conn, msg, data); - - if (strcmp(member, "RemoveConnection") == 0) - return remove_connection(conn, msg, data); - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - static void manager_unregister(DBusConnection *conn, void *data) { info("Unregistered manager path"); @@ -640,12 +597,6 @@ static void manager_unregister(DBusConnection *conn, void *data) bnep_kill_all_connections(); } -/* Virtual table to handle manager object path hierarchy */ -static const DBusObjectPathVTable manager_table = { - .message_function = manager_message, - .unregister_function = manager_unregister, -}; - static void parse_stored_connection(char *key, char *value, void *data) { bdaddr_t dst, *src = data; @@ -766,6 +717,26 @@ static void register_stored(void) closedir(dir); } +static DBusMethodVTable manager_methods[] = { + { "ListServers", list_servers, "", "as" }, + { "CreateServer", create_server, "s", "s" }, + { "FindServer", find_server, "s", "s" }, + { "RemoveServer", remove_server, "s", "" }, + { "ListConnections", list_connections, "", "as" }, + { "FindConnection", find_connection, "s", "s" }, + { "CreateConnection", create_connection, "ss", "s" }, + { "RemoveConnection", remove_connection, "s", "" }, + { NULL, NULL, NULL, NULL } +}; + +static DBusSignalVTable manager_signals[] = { + { "ServerCreated", "s" }, + { "ServerRemoved", "s" }, + { "ConnectionCreated", "s" }, + { "ConnectionRemoved", "s" }, + { NULL, NULL } +}; + int network_init(DBusConnection *conn) { if (bridge_init() < 0) { @@ -781,17 +752,24 @@ int network_init(DBusConnection *conn) return -1; } - connection = dbus_connection_ref(conn); - - /* Fallback to catch invalid network path */ - if (dbus_connection_register_fallback(connection, NETWORK_PATH, - &manager_table, NULL) == FALSE) { - error("D-Bus failed to register %s path", NETWORK_PATH); - dbus_connection_unref(connection); + if (!dbus_connection_create_object_path(conn, NETWORK_PATH, + NULL, manager_unregister)) { + error("D-Bus failed to create %s path", NETWORK_PATH); + return -1; + } + if (!dbus_connection_register_interface(conn, NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, + manager_methods, + manager_signals, NULL)) { + error("Failed to register %s interface to %s", + NETWORK_MANAGER_INTERFACE, NETWORK_PATH); + dbus_connection_destroy_object_path(connection, NETWORK_PATH); return -1; } + connection = dbus_connection_ref(conn); + info("Registered manager path:%s", NETWORK_PATH); register_stored(); @@ -801,7 +779,7 @@ int network_init(DBusConnection *conn) void network_exit(void) { - dbus_connection_unregister_object_path(connection, NETWORK_PATH); + dbus_connection_destroy_object_path(connection, NETWORK_PATH); dbus_connection_unref(connection); -- cgit From 0ebe9945de9b9e91169619cf1e09a40796aad41b Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Wed, 9 May 2007 14:49:23 +0000 Subject: Use dbus_connection_destroy object path instead of dbus_connection_unregister_object_path --- network/manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 8e8a4066..07f30d46 100644 --- a/network/manager.c +++ b/network/manager.c @@ -177,7 +177,7 @@ static DBusHandlerResult remove_path(DBusConnection *conn, /* Remove the nap or gn file from the file system */ server_remove_stored(conn, path); - if (!dbus_connection_unregister_object_path(conn, path)) + if (!dbus_connection_destroy_object_path(conn, path)) error("Network path unregister failed"); signal = dbus_message_new_signal(NETWORK_PATH, -- cgit From bec9d1838bc0bf9e8ee21f452b6e0431a3abe0bf Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 9 May 2007 19:59:18 +0000 Subject: Use dbus_connection_emit_signal to emit signals. --- network/manager.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 07f30d46..b61233c9 100644 --- a/network/manager.c +++ b/network/manager.c @@ -94,18 +94,14 @@ static DBusHandlerResult create_path(DBusConnection *conn, DBusMessage *msg, const char *path, const char *sname) { - DBusMessage *reply, *signal; + DBusMessage *reply; /* emit signal when it is a new path */ if (sname) { - signal = dbus_message_new_signal(NETWORK_PATH, - NETWORK_MANAGER_INTERFACE, sname); - - dbus_message_append_args(signal, - DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); - - send_message_and_unref(conn, signal); + dbus_connection_emit_signal(conn, NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, + sname, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); } reply = dbus_message_new_method_return(msg); @@ -148,7 +144,7 @@ static DBusHandlerResult remove_path(DBusConnection *conn, const char *sname) { const char *path; - DBusMessage *reply, *signal; + DBusMessage *reply; DBusError derr; GSList *l; @@ -180,14 +176,10 @@ static DBusHandlerResult remove_path(DBusConnection *conn, if (!dbus_connection_destroy_object_path(conn, path)) error("Network path unregister failed"); - signal = dbus_message_new_signal(NETWORK_PATH, - NETWORK_MANAGER_INTERFACE, sname); - - dbus_message_append_args(signal, - DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); - - send_message_and_unref(conn, signal); + dbus_connection_emit_signal(conn, NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, + sname, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); return send_message_and_unref(conn, reply); } -- cgit From 417006053c2c16cd8ae5b947d0a8daae4f151b94 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 16 May 2007 13:13:58 +0000 Subject: Fixes storage problems with connections and fix bug of CreateConnection not checking for present connection with the same destination and profile. --- network/manager.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 8 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index b61233c9..8eac0bee 100644 --- a/network/manager.c +++ b/network/manager.c @@ -161,8 +161,15 @@ static DBusHandlerResult remove_path(DBusConnection *conn, if (!l) return err_does_not_exist(conn, msg, "Path doesn't exist"); - if (*list == connection_paths && connection_has_pending (conn, path)) - return err_failed(conn, msg, "Connection is Busy"); + /* Remove references from the storage */ + if (*list == connection_paths) { + if (connection_has_pending (conn, path)) + return err_failed(conn, msg, "Connection is Busy"); + + connection_remove_stored(conn, path); + } + else + server_remove_stored(conn, path); g_free(l->data); *list = g_slist_remove(*list, l->data); @@ -171,8 +178,6 @@ static DBusHandlerResult remove_path(DBusConnection *conn, if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; - /* Remove the nap or gn file from the file system */ - server_remove_stored(conn, path); if (!dbus_connection_destroy_object_path(conn, path)) error("Network path unregister failed"); @@ -524,6 +529,8 @@ static DBusHandlerResult create_connection(DBusConnection *conn, bdaddr_t src; uint16_t id; int dev_id; + char key[32]; + GSList *l; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, @@ -539,6 +546,17 @@ static DBusHandlerResult create_connection(DBusConnection *conn, if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) return err_invalid_args(conn, msg, "Not supported"); + snprintf(key, 32, "%s#%s", addr, bnep_name(id)); + + /* Checks if the connection was already been made */ + for (l = connection_paths; l; l = l->next) { + if (connection_find_data(conn, l->data, key) == 0) { + err_already_exists(conn, msg, + "Connection Already exists"); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + bacpy(&src, BDADDR_ANY); dev_id = hci_get_route(NULL); if ((dev_id < 0) || (hci_devba(dev_id, &src) < 0)) @@ -644,8 +662,13 @@ static void parse_stored_connection(char *key, char *value, void *data) if (connection_register(connection, path, src, &dst, id, name, ptr) == 0) { - connection_paths = g_slist_append(connection_paths, - g_strdup(path)); + char *rpath = g_strdup(path); + connection_paths = g_slist_append(connection_paths, rpath); + dbus_connection_emit_signal(connection, NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, + "ConnectionCreated", + DBUS_TYPE_STRING, &rpath, + DBUS_TYPE_INVALID); } g_free(name); @@ -688,9 +711,18 @@ static void register_stored(void) NETWORK_PATH"/server/nap%d", net_uid++); if (server_register_from_file(connection, path, - &src, BNEP_SVC_NAP, filename) == 0) + &src, BNEP_SVC_NAP, filename) == 0) { server_paths = g_slist_append(server_paths, g_strdup(path)); + + dbus_connection_emit_signal(connection, + NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, + "ServerCreated", + DBUS_TYPE_STRING, + &path, + DBUS_TYPE_INVALID); + } } /* GN objects */ @@ -700,9 +732,18 @@ static void register_stored(void) NETWORK_PATH"/server/gn%d", net_uid++); if (server_register_from_file(connection, path, - &src, BNEP_SVC_GN, filename) == 0) + &src, BNEP_SVC_GN, filename) == 0) { server_paths = g_slist_append(server_paths, g_strdup(path)); + + dbus_connection_emit_signal(connection, + NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, + "ServerCreated", + DBUS_TYPE_STRING, + &path, + DBUS_TYPE_INVALID); + } } } -- cgit From df7260b7a01d10f92849ca9a862a2a2d6ffac865 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 17 May 2007 17:05:47 +0000 Subject: Add LastConnection, DefaultConnection and ChangeDefaultConnection API methods and some minor fixes. --- network/manager.c | 295 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 237 insertions(+), 58 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 8eac0bee..6d7654f9 100644 --- a/network/manager.c +++ b/network/manager.c @@ -70,6 +70,7 @@ struct pending_reply { static GSList *server_paths = NULL; /* Network registered servers paths */ static GSList *connection_paths = NULL; /* Network registered connections paths */ +static int default_index = -1; /* Network default connection path index */ static DBusConnection *connection = NULL; @@ -139,6 +140,27 @@ static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, return send_message_and_unref(conn, reply); } +static const char * last_connection_used(DBusConnection *conn) +{ + const char *path = NULL; + GSList *l; + int i; + + for (i = g_slist_length (connection_paths) -1; i > -1; i--) { + path = g_slist_nth_data (connection_paths, i); + if (connection_is_connected (conn, path)) + break; + } + + /* No connection connected fallback to last connection */ + if (i == -1) { + l = g_slist_last(connection_paths); + path = l->data; + } + + return path; +} + static DBusHandlerResult remove_path(DBusConnection *conn, DBusMessage *msg, GSList **list, const char *sname) @@ -163,10 +185,17 @@ static DBusHandlerResult remove_path(DBusConnection *conn, /* Remove references from the storage */ if (*list == connection_paths) { - if (connection_has_pending (conn, path)) + if (connection_has_pending(conn, path)) return err_failed(conn, msg, "Connection is Busy"); connection_remove_stored(conn, path); + /* Reset default connection */ + if (l == g_slist_nth(*list, default_index)) { + const char *dpath; + + dpath = last_connection_used(conn); + connection_store(conn, dpath, TRUE); + } } else server_remove_stored(conn, path); @@ -251,7 +280,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data) goto fail; } - connection_store(pr->conn, pr->path); + connection_store(pr->conn, pr->path, FALSE); connection_paths = g_slist_append(connection_paths, g_strdup(pr->path)); create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); @@ -401,7 +430,7 @@ static DBusHandlerResult create_server(DBusConnection *conn, if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) return err_invalid_args(conn, msg, "Not supported"); - snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/%s%d", + snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s%d", bnep_name(id), net_uid++); if (g_slist_find_custom(server_paths, path, @@ -480,6 +509,24 @@ static DBusHandlerResult list_connections(DBusConnection *conn, return list_paths(conn, msg, connection_paths); } +static GSList * find_connection_pattern(DBusConnection *conn, + const char *pattern) +{ + const char *path; + GSList *list; + + if (pattern == NULL) + return NULL; + + for (list = connection_paths; list; list = list->next) { + path = (const char *) list->data; + if (connection_find_data(conn, path, pattern) == 0) + break; + } + + return list; +} + static DBusHandlerResult find_connection(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -498,17 +545,15 @@ static DBusHandlerResult find_connection(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } - for (list = connection_paths; list; list = list->next) { - path = (const char *) list->data; - if (connection_find_data(conn, path, pattern) == 0) - break; - } + list = find_connection_pattern(conn, pattern); if (list == NULL) { err_failed(conn, msg, "No such connection"); return DBUS_HANDLER_RESULT_HANDLED; } + path = list->data; + reply = dbus_message_new_method_return(msg); if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; @@ -588,6 +633,118 @@ static DBusHandlerResult remove_connection(DBusConnection *conn, return remove_path(conn, msg, &connection_paths, "ConnectionRemoved"); } +static DBusHandlerResult last_connection(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + const char *path; + DBusMessage *reply; + + if (connection_paths == NULL || + g_slist_length (connection_paths) == 0) { + err_does_not_exist(conn, msg, "No such connection"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + path = last_connection_used(conn); + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + return send_message_and_unref(conn, reply); +} + +static DBusHandlerResult default_connection(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + const char *path; + DBusMessage *reply; + + if (connection_paths == NULL || + g_slist_length (connection_paths) == 0) { + err_does_not_exist(conn, msg, "No such connection"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + path = g_slist_nth_data (connection_paths, default_index); + + if (path == NULL) { + path = last_connection_used(conn); + connection_store(conn, path, TRUE); + } + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + return send_message_and_unref(conn, reply); +} + +static DBusHandlerResult change_default_connection(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + const char *path; + const char *pattern; + DBusMessage *reply; + DBusError derr; + GSList *list; + + dbus_error_init(&derr); + if (!dbus_message_get_args(msg, &derr, + DBUS_TYPE_STRING, &pattern, + DBUS_TYPE_INVALID)) { + err_invalid_args(conn, msg, derr.message); + dbus_error_free(&derr); + return DBUS_HANDLER_RESULT_HANDLED; + } + + if (connection_paths == NULL || + g_slist_length (connection_paths) == 0) { + err_does_not_exist(conn, msg, "No such connection"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + list = g_slist_find_custom(connection_paths, pattern, (GCompareFunc) strcmp); + + /* Find object path via pattern */ + if (list == NULL) { + list = find_connection_pattern(conn, pattern); + + if (list == NULL) { + err_failed(conn, msg, "No such connection"); + return DBUS_HANDLER_RESULT_HANDLED; + } + else + path = list->data; + } + else + path = list->data; + + default_index = g_slist_position (connection_paths, list); + connection_store(connection, path, TRUE); + + dbus_connection_emit_signal(connection, NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, + "DefaultConnectionChanged", + DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + + return send_message_and_unref(conn, reply); +} + static void manager_unregister(DBusConnection *conn, void *data) { info("Unregistered manager path"); @@ -674,16 +831,77 @@ static void parse_stored_connection(char *key, char *value, void *data) g_free(name); } -static void register_stored(void) +static void register_connections_stored(const char *adapter) +{ + char filename[PATH_MAX + 1]; + char *pattern; + struct stat s; + GSList *list; + bdaddr_t src; + bdaddr_t default_src; + int dev_id; + + create_name(filename, PATH_MAX, STORAGEDIR, adapter, "network"); + + str2ba(adapter, &src); + + bacpy(&default_src, BDADDR_ANY); + dev_id = hci_get_route(NULL); + if (dev_id < 0) + hci_devba(dev_id, &default_src); + + if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { + textfile_foreach(filename, parse_stored_connection, &src); + pattern = textfile_get(filename, "default"); + + list = find_connection_pattern(connection, pattern); + if (list != NULL) + default_index = g_slist_position(connection_paths, list); + else if (bacmp(&src, &default_src) == 0) { + list = g_slist_last(connection_paths); + if (list == NULL) + return; + default_index = g_slist_position(connection_paths, list); + connection_store(connection, list->data, TRUE); + } + } +} + +static void register_servers_stored(const char *adapter, const char *profile) { - char dirname[PATH_MAX + 1]; char filename[PATH_MAX + 1]; char path[MAX_PATH_LENGTH]; - struct dirent *de; - DIR *dir; + const char *ppath = path; + uint16_t id; struct stat s; bdaddr_t src; + if (strcmp(profile, "nap") == 0) + id = BNEP_SVC_NAP; + else + id = BNEP_SVC_GN; + + create_name(filename, PATH_MAX, STORAGEDIR, adapter, profile); + + str2ba(adapter, &src); + + if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/%s%d", profile, net_uid++); + if (server_register_from_file(connection, path, + &src, id, filename) == 0) { + server_paths = g_slist_append(server_paths, + g_strdup(path)); + } + } +} + +static void register_stored(void) +{ + char dirname[PATH_MAX + 1]; + struct dirent *de; + DIR *dir; + snprintf(dirname, PATH_MAX, "%s", STORAGEDIR); dir = opendir(dirname); @@ -695,56 +913,13 @@ static void register_stored(void) continue; /* Connection objects */ - create_name(filename, PATH_MAX, STORAGEDIR, - de->d_name, "network"); - - str2ba(de->d_name, &src); - - - if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) - textfile_foreach(filename, parse_stored_connection, &src); + register_connections_stored(de->d_name); /* NAP objects */ - create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "nap"); - if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { - snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/server/nap%d", net_uid++); - - if (server_register_from_file(connection, path, - &src, BNEP_SVC_NAP, filename) == 0) { - server_paths = g_slist_append(server_paths, - g_strdup(path)); - - dbus_connection_emit_signal(connection, - NETWORK_PATH, - NETWORK_MANAGER_INTERFACE, - "ServerCreated", - DBUS_TYPE_STRING, - &path, - DBUS_TYPE_INVALID); - } - } + register_servers_stored(de->d_name, "nap"); /* GN objects */ - create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "gn"); - if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { - snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/server/gn%d", net_uid++); - - if (server_register_from_file(connection, path, - &src, BNEP_SVC_GN, filename) == 0) { - server_paths = g_slist_append(server_paths, - g_strdup(path)); - - dbus_connection_emit_signal(connection, - NETWORK_PATH, - NETWORK_MANAGER_INTERFACE, - "ServerCreated", - DBUS_TYPE_STRING, - &path, - DBUS_TYPE_INVALID); - } - } + register_servers_stored(de->d_name, "gn"); } closedir(dir); @@ -759,6 +934,9 @@ static DBusMethodVTable manager_methods[] = { { "FindConnection", find_connection, "s", "s" }, { "CreateConnection", create_connection, "ss", "s" }, { "RemoveConnection", remove_connection, "s", "" }, + { "LastConnection", last_connection, "", "s" }, + { "DefaultConnection", default_connection, "", "s" }, + { "ChangeDefaultConnection", change_default_connection, "s", "s"}, { NULL, NULL, NULL, NULL } }; @@ -767,6 +945,7 @@ static DBusSignalVTable manager_signals[] = { { "ServerRemoved", "s" }, { "ConnectionCreated", "s" }, { "ConnectionRemoved", "s" }, + { "DefaultConnectionChanged", "s" }, { NULL, NULL } }; -- cgit From 07ae0be088425610ecdb201dc9c047ba95a73d4c Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 17 May 2007 19:52:32 +0000 Subject: Prevent use of missing function in eglib. --- network/manager.c | 82 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 60 insertions(+), 22 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 6d7654f9..81133b2e 100644 --- a/network/manager.c +++ b/network/manager.c @@ -146,15 +146,22 @@ static const char * last_connection_used(DBusConnection *conn) GSList *l; int i; + l = connection_paths; for (i = g_slist_length (connection_paths) -1; i > -1; i--) { - path = g_slist_nth_data (connection_paths, i); + int n = i; + while (n-- > 0 && l) + l = l->next; + + path = l ? l->data : NULL; if (connection_is_connected (conn, path)) break; } /* No connection connected fallback to last connection */ if (i == -1) { - l = g_slist_last(connection_paths); + l = connection_paths; + while (l->next) + l = l->next; path = l->data; } @@ -185,12 +192,20 @@ static DBusHandlerResult remove_path(DBusConnection *conn, /* Remove references from the storage */ if (*list == connection_paths) { + GSList *l_default; + int n; + if (connection_has_pending(conn, path)) return err_failed(conn, msg, "Connection is Busy"); connection_remove_stored(conn, path); + /* Reset default connection */ - if (l == g_slist_nth(*list, default_index)) { + n = default_index; + l_default = connection_paths; + while (n-- > 0 && l_default) + l_default = l_default->next; + if (l == l_default) { const char *dpath; dpath = last_connection_used(conn); @@ -662,6 +677,8 @@ static DBusHandlerResult default_connection(DBusConnection *conn, { const char *path; DBusMessage *reply; + GSList *link; + int n; if (connection_paths == NULL || g_slist_length (connection_paths) == 0) { @@ -669,7 +686,12 @@ static DBusHandlerResult default_connection(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } - path = g_slist_nth_data (connection_paths, default_index); + link = connection_paths; + n = default_index; + while (n-- > 0 && link) + link = link->next; + + path = link ? link->data : NULL; if (path == NULL) { path = last_connection_used(conn); @@ -686,6 +708,22 @@ static DBusHandlerResult default_connection(DBusConnection *conn, return send_message_and_unref(conn, reply); } +static void default_position(GSList *link) +{ + GSList *list; + int i = 0; + + list = connection_paths; + while (list) { + if (list == link) { + default_index = i; + break; + } + i++; + list = list->next; + } +} + static DBusHandlerResult change_default_connection(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -693,7 +731,7 @@ static DBusHandlerResult change_default_connection(DBusConnection *conn, const char *pattern; DBusMessage *reply; DBusError derr; - GSList *list; + GSList *link; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, @@ -710,24 +748,23 @@ static DBusHandlerResult change_default_connection(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } - list = g_slist_find_custom(connection_paths, pattern, (GCompareFunc) strcmp); + link = g_slist_find_custom(connection_paths, pattern, (GCompareFunc) strcmp); /* Find object path via pattern */ - if (list == NULL) { - list = find_connection_pattern(conn, pattern); + if (link == NULL) { + link = find_connection_pattern(conn, pattern); - if (list == NULL) { + if (link == NULL) { err_failed(conn, msg, "No such connection"); return DBUS_HANDLER_RESULT_HANDLED; } else - path = list->data; + path = link->data; } else - path = list->data; + path = link->data; - default_index = g_slist_position (connection_paths, list); - connection_store(connection, path, TRUE); + default_position(link); dbus_connection_emit_signal(connection, NETWORK_PATH, NETWORK_MANAGER_INTERFACE, @@ -836,7 +873,7 @@ static void register_connections_stored(const char *adapter) char filename[PATH_MAX + 1]; char *pattern; struct stat s; - GSList *list; + GSList *link; bdaddr_t src; bdaddr_t default_src; int dev_id; @@ -854,15 +891,17 @@ static void register_connections_stored(const char *adapter) textfile_foreach(filename, parse_stored_connection, &src); pattern = textfile_get(filename, "default"); - list = find_connection_pattern(connection, pattern); - if (list != NULL) - default_index = g_slist_position(connection_paths, list); + link = find_connection_pattern(connection, pattern); + if (link != NULL) + default_position(link); else if (bacmp(&src, &default_src) == 0) { - list = g_slist_last(connection_paths); - if (list == NULL) + link = connection_paths; + while (link->next) + link = link->next; + if (link == NULL) return; - default_index = g_slist_position(connection_paths, list); - connection_store(connection, list->data, TRUE); + default_position(link); + connection_store(connection, link->data, TRUE); } } } @@ -871,7 +910,6 @@ static void register_servers_stored(const char *adapter, const char *profile) { char filename[PATH_MAX + 1]; char path[MAX_PATH_LENGTH]; - const char *ppath = path; uint16_t id; struct stat s; bdaddr_t src; -- cgit From 00a7a482ac18b339a311c0afb89741d6b3978f0e Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 18 May 2007 18:05:16 +0000 Subject: Revert changes of missing GSList functions. --- network/manager.c | 83 +++++++++++++++---------------------------------------- 1 file changed, 22 insertions(+), 61 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 81133b2e..c27d01c5 100644 --- a/network/manager.c +++ b/network/manager.c @@ -146,22 +146,15 @@ static const char * last_connection_used(DBusConnection *conn) GSList *l; int i; - l = connection_paths; for (i = g_slist_length (connection_paths) -1; i > -1; i--) { - int n = i; - while (n-- > 0 && l) - l = l->next; - - path = l ? l->data : NULL; - if (connection_is_connected (conn, path)) + path = g_slist_nth_data (connection_paths, i); + if (connection_is_connected(conn, path)) break; } /* No connection connected fallback to last connection */ if (i == -1) { - l = connection_paths; - while (l->next) - l = l->next; + l = g_slist_last(connection_paths); path = l->data; } @@ -192,20 +185,12 @@ static DBusHandlerResult remove_path(DBusConnection *conn, /* Remove references from the storage */ if (*list == connection_paths) { - GSList *l_default; - int n; - if (connection_has_pending(conn, path)) return err_failed(conn, msg, "Connection is Busy"); connection_remove_stored(conn, path); - /* Reset default connection */ - n = default_index; - l_default = connection_paths; - while (n-- > 0 && l_default) - l_default = l_default->next; - if (l == l_default) { + if (l == g_slist_nth(*list, default_index)) { const char *dpath; dpath = last_connection_used(conn); @@ -677,8 +662,6 @@ static DBusHandlerResult default_connection(DBusConnection *conn, { const char *path; DBusMessage *reply; - GSList *link; - int n; if (connection_paths == NULL || g_slist_length (connection_paths) == 0) { @@ -686,12 +669,7 @@ static DBusHandlerResult default_connection(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } - link = connection_paths; - n = default_index; - while (n-- > 0 && link) - link = link->next; - - path = link ? link->data : NULL; + path = g_slist_nth_data (connection_paths, default_index); if (path == NULL) { path = last_connection_used(conn); @@ -708,22 +686,6 @@ static DBusHandlerResult default_connection(DBusConnection *conn, return send_message_and_unref(conn, reply); } -static void default_position(GSList *link) -{ - GSList *list; - int i = 0; - - list = connection_paths; - while (list) { - if (list == link) { - default_index = i; - break; - } - i++; - list = list->next; - } -} - static DBusHandlerResult change_default_connection(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -731,7 +693,7 @@ static DBusHandlerResult change_default_connection(DBusConnection *conn, const char *pattern; DBusMessage *reply; DBusError derr; - GSList *link; + GSList *list; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, @@ -748,23 +710,24 @@ static DBusHandlerResult change_default_connection(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } - link = g_slist_find_custom(connection_paths, pattern, (GCompareFunc) strcmp); + list = g_slist_find_custom(connection_paths, pattern, (GCompareFunc) strcmp); /* Find object path via pattern */ - if (link == NULL) { - link = find_connection_pattern(conn, pattern); + if (list == NULL) { + list = find_connection_pattern(conn, pattern); - if (link == NULL) { + if (list == NULL) { err_failed(conn, msg, "No such connection"); return DBUS_HANDLER_RESULT_HANDLED; } else - path = link->data; + path = list->data; } else - path = link->data; + path = list->data; - default_position(link); + default_index = g_slist_position (connection_paths, list); + connection_store(connection, path, TRUE); dbus_connection_emit_signal(connection, NETWORK_PATH, NETWORK_MANAGER_INTERFACE, @@ -873,7 +836,7 @@ static void register_connections_stored(const char *adapter) char filename[PATH_MAX + 1]; char *pattern; struct stat s; - GSList *link; + GSList *list; bdaddr_t src; bdaddr_t default_src; int dev_id; @@ -891,17 +854,15 @@ static void register_connections_stored(const char *adapter) textfile_foreach(filename, parse_stored_connection, &src); pattern = textfile_get(filename, "default"); - link = find_connection_pattern(connection, pattern); - if (link != NULL) - default_position(link); + list = find_connection_pattern(connection, pattern); + if (list != NULL) + default_index = g_slist_position(connection_paths, list); else if (bacmp(&src, &default_src) == 0) { - link = connection_paths; - while (link->next) - link = link->next; - if (link == NULL) + list = g_slist_last(connection_paths); + if (list == NULL) return; - default_position(link); - connection_store(connection, link->data, TRUE); + default_index = g_slist_position(connection_paths, list); + connection_store(connection, list->data, TRUE); } } } -- cgit From 3a653f915b0e7de28e111665ba40b69ae6d6a235 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 20 Jun 2007 20:23:35 +0000 Subject: Remove CreateServer and RemoveServer, servers are always create. --- network/manager.c | 110 ++++++++++++++++++++++-------------------------------- 1 file changed, 44 insertions(+), 66 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index c27d01c5..148dd444 100644 --- a/network/manager.c +++ b/network/manager.c @@ -45,7 +45,6 @@ #include "logging.h" #include "textfile.h" -#define NETWORK_PATH "/org/bluez/network" #define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager" #include "error.h" @@ -55,8 +54,6 @@ #include "connection.h" #include "common.h" -#define MAX_PATH_LENGTH 64 /* D-Bus path */ - struct pending_reply { DBusConnection *conn; DBusMessage *msg; @@ -197,8 +194,6 @@ static DBusHandlerResult remove_path(DBusConnection *conn, connection_store(conn, dpath, TRUE); } } - else - server_remove_stored(conn, path); g_free(l->data); *list = g_slist_remove(*list, l->data); @@ -407,57 +402,6 @@ static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, return list_paths(conn, msg, server_paths); } -static DBusHandlerResult create_server(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - char path[MAX_PATH_LENGTH]; - DBusError derr; - const char *str; - bdaddr_t src; - uint16_t id; - int dev_id; - - dbus_error_init(&derr); - if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &str, - DBUS_TYPE_INVALID)) { - err_invalid_args(conn, msg, derr.message); - dbus_error_free(&derr); - return DBUS_HANDLER_RESULT_HANDLED; - } - - id = bnep_service_id(str); - if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) - return err_invalid_args(conn, msg, "Not supported"); - - snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s%d", - bnep_name(id), net_uid++); - - if (g_slist_find_custom(server_paths, path, - (GCompareFunc) strcmp)) { - err_already_exists(conn, msg, "Server Already exists"); - return DBUS_HANDLER_RESULT_HANDLED; - } - - bacpy(&src, BDADDR_ANY); - - dev_id = hci_get_route(NULL); - - if (dev_id >= 0) - hci_devba(dev_id, &src); - - if (server_register(conn, path, &src, id) < 0) - return err_failed(conn, msg, - "D-Bus path registration failed"); - - if (bacmp(&src, BDADDR_ANY) != 0) - server_store(conn, path); - - server_paths = g_slist_append(server_paths, g_strdup(path)); - - return create_path(conn, msg, path, "ServerCreated"); -} - static DBusHandlerResult find_server(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -497,12 +441,6 @@ static DBusHandlerResult find_server(DBusConnection *conn, return send_message_and_unref(conn, reply); } -static DBusHandlerResult remove_server(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - return remove_path(conn, msg, &server_paths, "ServerRemoved"); -} - static DBusHandlerResult list_connections(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -867,6 +805,34 @@ static void register_connections_stored(const char *adapter) } } +static void register_server(uint16_t id) +{ + char path[MAX_PATH_LENGTH]; + bdaddr_t src; + int dev_id; + + snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s", bnep_name(id)); + + if (g_slist_find_custom(server_paths, path, + (GCompareFunc) strcmp)) + return; + + bacpy(&src, BDADDR_ANY); + + dev_id = hci_get_route(NULL); + + if (dev_id >= 0) + hci_devba(dev_id, &src); + + if (server_register(connection, path, &src, id) < 0) + return; + + if (bacmp(&src, BDADDR_ANY) != 0) + server_store(connection, path); + + server_paths = g_slist_append(server_paths, g_strdup(path)); +} + static void register_servers_stored(const char *adapter, const char *profile) { char filename[PATH_MAX + 1]; @@ -877,8 +843,10 @@ static void register_servers_stored(const char *adapter, const char *profile) if (strcmp(profile, "nap") == 0) id = BNEP_SVC_NAP; - else + else if (strcmp(profile, "gn") == 0) id = BNEP_SVC_GN; + else + id = BNEP_SVC_PANU; create_name(filename, PATH_MAX, STORAGEDIR, adapter, profile); @@ -886,7 +854,7 @@ static void register_servers_stored(const char *adapter, const char *profile) if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/%s%d", profile, net_uid++); + NETWORK_PATH"/%s", profile); if (server_register_from_file(connection, path, &src, id, filename) == 0) { server_paths = g_slist_append(server_paths, @@ -919,6 +887,9 @@ static void register_stored(void) /* GN objects */ register_servers_stored(de->d_name, "gn"); + + /* PANU objects */ + register_servers_stored(de->d_name, "panu"); } closedir(dir); @@ -926,9 +897,7 @@ static void register_stored(void) static DBusMethodVTable manager_methods[] = { { "ListServers", list_servers, "", "as" }, - { "CreateServer", create_server, "s", "s" }, { "FindServer", find_server, "s", "s" }, - { "RemoveServer", remove_server, "s", "" }, { "ListConnections", list_connections, "", "as" }, { "FindConnection", find_connection, "s", "s" }, { "CreateConnection", create_connection, "ss", "s" }, @@ -985,6 +954,15 @@ int network_init(DBusConnection *conn) register_stored(); + /* PAN user server */ + register_server(BNEP_SVC_PANU); + + /* Group Network server */ + register_server(BNEP_SVC_GN); + + /* Network Access Point server */ + register_server(BNEP_SVC_NAP); + return 0; } -- cgit From 7715eed6e31bcd616ff663073c1d2480e199adf5 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 24 Aug 2007 18:35:07 +0000 Subject: network: removed unused signals(ServerCreated and ServerRemoved) --- network/manager.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 148dd444..418f474b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -909,8 +909,6 @@ static DBusMethodVTable manager_methods[] = { }; static DBusSignalVTable manager_signals[] = { - { "ServerCreated", "s" }, - { "ServerRemoved", "s" }, { "ConnectionCreated", "s" }, { "ConnectionRemoved", "s" }, { "DefaultConnectionChanged", "s" }, -- cgit From 7defeed3b398d5ca874bc8e3e2fbda099b47c288 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 24 Aug 2007 21:51:52 +0000 Subject: network: fixed minor memory leak --- network/manager.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 418f474b..0ac6228f 100644 --- a/network/manager.c +++ b/network/manager.c @@ -310,6 +310,7 @@ static int get_record(struct pending_reply *pr, uint32_t handle, if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { error("Can't send D-Bus message."); + dbus_message_unref(msg); return -1; } @@ -386,6 +387,7 @@ static int get_handles(struct pending_reply *pr, if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { error("Can't send D-Bus message."); + dbus_message_unref(msg); return -1; } -- cgit From 1b9cc018822ca0edde9d0485c382a13a90253e43 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 29 Aug 2007 17:50:49 +0000 Subject: network: concat remote name and service name to the connection name --- network/manager.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 0ac6228f..78d65431 100644 --- a/network/manager.c +++ b/network/manager.c @@ -54,6 +54,8 @@ #include "connection.h" #include "common.h" +#define MAX_NAME_SIZE 256 + struct pending_reply { DBusConnection *conn; DBusMessage *msg; @@ -222,7 +224,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data) uint8_t *rec_bin; sdp_data_t *d; sdp_record_t *rec = NULL; - char *name = NULL, *desc = NULL; + char name[MAX_NAME_SIZE], *desc = NULL; dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { @@ -253,11 +255,16 @@ static void pan_record_reply(DBusPendingCall *call, void *data) rec = sdp_extract_pdu(rec_bin, &scanned); - /* Extract service name from record */ + /* Concat remote name and service name */ + memset(name, 0, MAX_NAME_SIZE); + if (read_remote_name(&pr->src, &pr->dst, name, MAX_NAME_SIZE) < 0) + len = 0; + else + len = strlen(name); + d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY); if (d) { - name = g_new0(char, d->unitSize); - snprintf(name, d->unitSize, "%.*s", + snprintf(name + len, MAX_NAME_SIZE - len, "(%.*s)", d->unitSize, d->val.str); } @@ -281,8 +288,6 @@ static void pan_record_reply(DBusPendingCall *call, void *data) create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); fail: - if (name) - g_free(name); if (desc) g_free(desc); -- cgit From c068caff5e03b9a244c40df3b197cb253587162b Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 29 Aug 2007 18:01:27 +0000 Subject: network: CreateConnection - enable PANU to PANU connection --- network/manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 78d65431..26146642 100644 --- a/network/manager.c +++ b/network/manager.c @@ -533,7 +533,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, } id = bnep_service_id(str); - if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP)) + if (id != BNEP_SVC_GN && id != BNEP_SVC_NAP && id != BNEP_SVC_PANU) return err_invalid_args(conn, msg, "Not supported"); snprintf(key, 32, "%s#%s", addr, bnep_name(id)); -- cgit From 176b646a7829d683055d95b5d637a3a5dfdd36c0 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 29 Aug 2007 20:32:05 +0000 Subject: network: server cleanup - added static DBusConnection and server init/exit --- network/manager.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 26146642..b571b44b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -429,7 +429,7 @@ static DBusHandlerResult find_server(DBusConnection *conn, for (list = server_paths; list; list = list->next) { path = (const char *) list->data; - if (server_find_data(conn, path, pattern) == 0) + if (server_find_data(path, pattern) == 0) break; } @@ -831,11 +831,11 @@ static void register_server(uint16_t id) if (dev_id >= 0) hci_devba(dev_id, &src); - if (server_register(connection, path, &src, id) < 0) + if (server_register(path, &src, id) < 0) return; if (bacmp(&src, BDADDR_ANY) != 0) - server_store(connection, path); + server_store(path); server_paths = g_slist_append(server_paths, g_strdup(path)); } @@ -862,8 +862,7 @@ static void register_servers_stored(const char *adapter, const char *profile) if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s", profile); - if (server_register_from_file(connection, path, - &src, id, filename) == 0) { + if (server_register_from_file(path, &src, id, filename) == 0) { server_paths = g_slist_append(server_paths, g_strdup(path)); } @@ -937,6 +936,16 @@ int network_init(DBusConnection *conn) return -1; } + /* + * There is one socket to handle the incomming connections. NAP, + * GN and PANU servers share the same PSM. The initial BNEP message + * (setup connection request) contains the destination service + * field that defines which service the source is connecting to. + */ + if (server_init(conn) < 0) { + return -1; + } + if (!dbus_connection_create_object_path(conn, NETWORK_PATH, NULL, manager_unregister)) { error("D-Bus failed to create %s path", NETWORK_PATH); @@ -959,13 +968,9 @@ int network_init(DBusConnection *conn) register_stored(); - /* PAN user server */ + /* Register PANU, GN and NAP servers if they don't exist */ register_server(BNEP_SVC_PANU); - - /* Group Network server */ register_server(BNEP_SVC_GN); - - /* Network Access Point server */ register_server(BNEP_SVC_NAP); return 0; @@ -973,6 +978,7 @@ int network_init(DBusConnection *conn) void network_exit(void) { + server_exit(); dbus_connection_destroy_object_path(connection, NETWORK_PATH); dbus_connection_unref(connection); -- cgit From 5e4e6d23323b869b36fb02d815dd4b928f94eacb Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 4 Sep 2007 19:51:31 +0000 Subject: Fix connection storage. --- network/manager.c | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index b571b44b..5c619d94 100644 --- a/network/manager.c +++ b/network/manager.c @@ -766,11 +766,6 @@ static void parse_stored_connection(char *key, char *value, void *data) &dst, id, name, ptr) == 0) { char *rpath = g_strdup(path); connection_paths = g_slist_append(connection_paths, rpath); - dbus_connection_emit_signal(connection, NETWORK_PATH, - NETWORK_MANAGER_INTERFACE, - "ConnectionCreated", - DBUS_TYPE_STRING, &rpath, - DBUS_TYPE_INVALID); } g_free(name); @@ -780,7 +775,7 @@ static void register_connections_stored(const char *adapter) { char filename[PATH_MAX + 1]; char *pattern; - struct stat s; + struct stat st; GSList *list; bdaddr_t src; bdaddr_t default_src; @@ -790,26 +785,32 @@ static void register_connections_stored(const char *adapter) str2ba(adapter, &src); + if (stat(filename, &st) < 0) + return; + + if (!(st.st_mode & __S_IFREG)) + return; + + textfile_foreach(filename, parse_stored_connection, &src); + + /* Check default connection for current default adapter */ bacpy(&default_src, BDADDR_ANY); - dev_id = hci_get_route(NULL); + dev_id = hci_get_route(&default_src); if (dev_id < 0) - hci_devba(dev_id, &default_src); + return; - if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { - textfile_foreach(filename, parse_stored_connection, &src); - pattern = textfile_get(filename, "default"); - - list = find_connection_pattern(connection, pattern); - if (list != NULL) - default_index = g_slist_position(connection_paths, list); - else if (bacmp(&src, &default_src) == 0) { - list = g_slist_last(connection_paths); - if (list == NULL) - return; - default_index = g_slist_position(connection_paths, list); - connection_store(connection, list->data, TRUE); - } - } + hci_devba(dev_id, &default_src); + if (bacmp(&default_src, &src) != 0) + return; + + pattern = textfile_get(filename, "default"); + if (!pattern) + return; + + list = find_connection_pattern(connection, pattern); + if (!list) + return; + default_index = g_slist_position(connection_paths, list); } static void register_server(uint16_t id) -- cgit From d474eef5f19a18f6414b042d127582e249953af1 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 13 Sep 2007 15:53:38 +0000 Subject: network: add one space between the remote device name and the service name --- network/manager.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 5c619d94..52e7dd6a 100644 --- a/network/manager.c +++ b/network/manager.c @@ -264,8 +264,12 @@ static void pan_record_reply(DBusPendingCall *call, void *data) d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY); if (d) { - snprintf(name + len, MAX_NAME_SIZE - len, "(%.*s)", - d->unitSize, d->val.str); + if (len) + snprintf(name + len, MAX_NAME_SIZE - len, " (%.*s)", + d->unitSize, d->val.str); + else + snprintf(name, MAX_NAME_SIZE, "%.*s", + d->unitSize, d->val.str); } /* Extract service description from record */ -- cgit From b1490204442e4ebda035d18c529baed048b6b5f5 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 13 Sep 2007 16:15:04 +0000 Subject: Make it look nice --- network/manager.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 52e7dd6a..7bc56142 100644 --- a/network/manager.c +++ b/network/manager.c @@ -264,12 +264,8 @@ static void pan_record_reply(DBusPendingCall *call, void *data) d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY); if (d) { - if (len) - snprintf(name + len, MAX_NAME_SIZE - len, " (%.*s)", - d->unitSize, d->val.str); - else - snprintf(name, MAX_NAME_SIZE, "%.*s", - d->unitSize, d->val.str); + snprintf(name + len, MAX_NAME_SIZE - len, + len ? " (%.*s)" : "%.*s", d->unitSize, d->val.str); } /* Extract service description from record */ -- cgit From 2033d8e42102bb6513e5ea71e147a8a7dcce1420 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:15:53 +0000 Subject: Add support for config file. --- network/manager.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 7bc56142..2bf76e03 100644 --- a/network/manager.c +++ b/network/manager.c @@ -50,8 +50,6 @@ #include "error.h" #include "bridge.h" #include "manager.h" -#include "server.h" -#include "connection.h" #include "common.h" #define MAX_NAME_SIZE 256 -- cgit From b94d1033b7c6919ca4705cf11139fb8224c3ecde Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:19:21 +0000 Subject: Add bridge name support. --- network/manager.c | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 2bf76e03..6ca36955 100644 --- a/network/manager.c +++ b/network/manager.c @@ -65,14 +65,14 @@ struct pending_reply { uint16_t id; /* Role */ }; +static struct network_conf *conf = NULL;/* Network service configuration */ static GSList *server_paths = NULL; /* Network registered servers paths */ static GSList *connection_paths = NULL; /* Network registered connections paths */ static int default_index = -1; /* Network default connection path index */ +static int net_uid = 0; /* Network objects identifier */ static DBusConnection *connection = NULL; -static int net_uid = 0; /* Network objects identifier */ - static void pending_reply_free(struct pending_reply *pr) { @@ -145,7 +145,7 @@ static const char * last_connection_used(DBusConnection *conn) for (i = g_slist_length (connection_paths) -1; i > -1; i--) { path = g_slist_nth_data (connection_paths, i); - if (connection_is_connected(conn, path)) + if (connection_is_connected(path)) break; } @@ -182,16 +182,16 @@ static DBusHandlerResult remove_path(DBusConnection *conn, /* Remove references from the storage */ if (*list == connection_paths) { - if (connection_has_pending(conn, path)) + if (connection_has_pending(path)) return err_failed(conn, msg, "Connection is Busy"); - connection_remove_stored(conn, path); + connection_remove_stored(path); /* Reset default connection */ if (l == g_slist_nth(*list, default_index)) { const char *dpath; dpath = last_connection_used(conn); - connection_store(conn, dpath, TRUE); + connection_store(dpath, TRUE); } } @@ -274,13 +274,13 @@ static void pan_record_reply(DBusPendingCall *call, void *data) d->unitSize, d->val.str); } - if (connection_register(pr->conn, pr->path, &pr->src, - &pr->dst, pr->id, name, desc) < 0) { + if (connection_register(pr->path, &pr->src, &pr->dst, pr->id, name, + desc) < 0) { err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); goto fail; } - connection_store(pr->conn, pr->path, FALSE); + connection_store(pr->path, FALSE); connection_paths = g_slist_append(connection_paths, g_strdup(pr->path)); create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); @@ -463,7 +463,7 @@ static GSList * find_connection_pattern(DBusConnection *conn, for (list = connection_paths; list; list = list->next) { path = (const char *) list->data; - if (connection_find_data(conn, path, pattern) == 0) + if (connection_find_data(path, pattern) == 0) break; } @@ -538,7 +538,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, /* Checks if the connection was already been made */ for (l = connection_paths; l; l = l->next) { - if (connection_find_data(conn, l->data, key) == 0) { + if (connection_find_data(l->data, key) == 0) { err_already_exists(conn, msg, "Connection Already exists"); return DBUS_HANDLER_RESULT_HANDLED; @@ -616,7 +616,7 @@ static DBusHandlerResult default_connection(DBusConnection *conn, if (path == NULL) { path = last_connection_used(conn); - connection_store(conn, path, TRUE); + connection_store(path, TRUE); } reply = dbus_message_new_method_return(msg); @@ -670,7 +670,7 @@ static DBusHandlerResult change_default_connection(DBusConnection *conn, path = list->data; default_index = g_slist_position (connection_paths, list); - connection_store(connection, path, TRUE); + connection_store(path, TRUE); dbus_connection_emit_signal(connection, NETWORK_PATH, NETWORK_MANAGER_INTERFACE, @@ -760,8 +760,7 @@ static void parse_stored_connection(char *key, char *value, void *data) return; } - if (connection_register(connection, path, src, - &dst, id, name, ptr) == 0) { + if (connection_register(path, src, &dst, id, name, ptr) == 0) { char *rpath = g_strdup(path); connection_paths = g_slist_append(connection_paths, rpath); } @@ -920,15 +919,23 @@ static DBusSignalVTable manager_signals[] = { { NULL, NULL } }; -int network_init(DBusConnection *conn) +int network_init(DBusConnection *conn, struct network_conf *service_conf) { + conf = service_conf; + if (bridge_init() < 0) { error("Can't init bridge module"); return -1; } - if (bridge_create("pan0") < 0) - error("Can't create bridge"); + if (bridge_create(conf->server.panu_iface) < 0) + error("Can't create PANU bridge"); + + if (bridge_create(conf->server.gn_iface) < 0) + error("Can't create GN bridge"); + + if (bridge_create(conf->server.nap_iface) < 0) + error("Can't create NAP bridge"); if (bnep_init()) { error("Can't init bnep module"); @@ -941,9 +948,11 @@ int network_init(DBusConnection *conn) * (setup connection request) contains the destination service * field that defines which service the source is connecting to. */ - if (server_init(conn) < 0) { + if (server_init(conn, conf->iface_prefix, &conf->server) < 0) return -1; - } + + if (connection_init(conn, conf->iface_prefix, &conf->conn) < 0) + return -1; if (!dbus_connection_create_object_path(conn, NETWORK_PATH, NULL, manager_unregister)) { -- cgit From 536cb174ec2d4937bf14fee7d713018e1bb31404 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:20:35 +0000 Subject: Fix bridge removal on service exit. --- network/manager.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 6ca36955..5e1ab2f0 100644 --- a/network/manager.c +++ b/network/manager.c @@ -993,8 +993,14 @@ void network_exit(void) connection = NULL; - if (bridge_remove("pan0") < 0) - error("Can't remove bridge"); + if (bridge_remove(conf->server.panu_iface) < 0) + error("Can't remove PANU bridge"); + + if (bridge_remove(conf->server.gn_iface) < 0) + error("Can't remove GN bridge"); + + if (bridge_remove(conf->server.nap_iface) < 0) + error("Can't remove NAP bridge"); bnep_cleanup(); bridge_cleanup(); -- cgit From 6113615ecfb8026a6a3ce0af38fc79ec8abec748 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:23:51 +0000 Subject: Rework configuration file to use roles. --- network/manager.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 5e1ab2f0..c82d1c03 100644 --- a/network/manager.c +++ b/network/manager.c @@ -923,21 +923,18 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) { conf = service_conf; - if (bridge_init() < 0) { + if (bridge_init(conf->gn_iface, conf->nap_iface) < 0) { error("Can't init bridge module"); return -1; } - if (bridge_create(conf->server.panu_iface) < 0) - error("Can't create PANU bridge"); - - if (bridge_create(conf->server.gn_iface) < 0) + if (bridge_create(BNEP_SVC_GN) < 0) error("Can't create GN bridge"); - if (bridge_create(conf->server.nap_iface) < 0) + if (bridge_create(BNEP_SVC_NAP) < 0) error("Can't create NAP bridge"); - if (bnep_init()) { + if (bnep_init(conf->panu_script, conf->gn_script, conf->nap_script)) { error("Can't init bnep module"); return -1; } @@ -948,10 +945,10 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) * (setup connection request) contains the destination service * field that defines which service the source is connecting to. */ - if (server_init(conn, conf->iface_prefix, &conf->server) < 0) + if (server_init(conn, conf->iface_prefix) < 0) return -1; - if (connection_init(conn, conf->iface_prefix, &conf->conn) < 0) + if (connection_init(conn, conf->iface_prefix) < 0) return -1; if (!dbus_connection_create_object_path(conn, NETWORK_PATH, @@ -993,13 +990,10 @@ void network_exit(void) connection = NULL; - if (bridge_remove(conf->server.panu_iface) < 0) - error("Can't remove PANU bridge"); - - if (bridge_remove(conf->server.gn_iface) < 0) + if (bridge_remove(BNEP_SVC_GN) < 0) error("Can't remove GN bridge"); - if (bridge_remove(conf->server.nap_iface) < 0) + if (bridge_remove(BNEP_SVC_NAP) < 0) error("Can't remove NAP bridge"); bnep_cleanup(); -- cgit From ec7083e9e5ba28b679f231c7bc341330feddf2ce Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:25:27 +0000 Subject: Fixes codestyle, bridge creation and some code cleanup. --- network/manager.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index c82d1c03..b5b4f0a8 100644 --- a/network/manager.c +++ b/network/manager.c @@ -928,12 +928,6 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) return -1; } - if (bridge_create(BNEP_SVC_GN) < 0) - error("Can't create GN bridge"); - - if (bridge_create(BNEP_SVC_NAP) < 0) - error("Can't create NAP bridge"); - if (bnep_init(conf->panu_script, conf->gn_script, conf->nap_script)) { error("Can't init bnep module"); return -1; @@ -967,6 +961,12 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) return -1; } + if (bridge_create(BNEP_SVC_GN) < 0) + error("Can't create GN bridge"); + + if (bridge_create(BNEP_SVC_NAP) < 0) + error("Can't create NAP bridge"); + connection = dbus_connection_ref(conn); info("Registered manager path:%s", NETWORK_PATH); @@ -984,10 +984,10 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) void network_exit(void) { server_exit(); + connection_exit(); dbus_connection_destroy_object_path(connection, NETWORK_PATH); dbus_connection_unref(connection); - connection = NULL; if (bridge_remove(BNEP_SVC_GN) < 0) -- cgit From 54943abd65058d7c24fbf9384759181c16913a96 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:30:48 +0000 Subject: Add secure link mode. --- network/manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index b5b4f0a8..053e03bb 100644 --- a/network/manager.c +++ b/network/manager.c @@ -939,7 +939,7 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) * (setup connection request) contains the destination service * field that defines which service the source is connecting to. */ - if (server_init(conn, conf->iface_prefix) < 0) + if (server_init(conn, conf->iface_prefix, conf->security) < 0) return -1; if (connection_init(conn, conf->iface_prefix) < 0) -- cgit From 123ef726b4bb5c465cd8a5e7b7c003e55443b219 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:31:42 +0000 Subject: Fix PANU connection not being restored from storage. --- network/manager.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 053e03bb..355b9665 100644 --- a/network/manager.c +++ b/network/manager.c @@ -737,6 +737,8 @@ static void parse_stored_connection(char *key, char *value, void *data) id = BNEP_SVC_NAP; else if (strcasecmp("gn", ptr) == 0) id = BNEP_SVC_GN; + else if (strcasecmp("panu", ptr) == 0) + id = BNEP_SVC_PANU; else return; -- cgit From a558e0071fe657965e0b3928d72fd2318aa03087 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:37:54 +0000 Subject: Fix problem with server storage. --- network/manager.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 355b9665..683ff0a0 100644 --- a/network/manager.c +++ b/network/manager.c @@ -825,17 +825,16 @@ static void register_server(uint16_t id) return; bacpy(&src, BDADDR_ANY); + dev_id = hci_get_route(&src); + if (dev_id < 0) + return; - dev_id = hci_get_route(NULL); - - if (dev_id >= 0) - hci_devba(dev_id, &src); + hci_devba(dev_id, &src); if (server_register(path, &src, id) < 0) return; - if (bacmp(&src, BDADDR_ANY) != 0) - server_store(path); + server_store(path); server_paths = g_slist_append(server_paths, g_strdup(path)); } -- cgit From c95ffdc65e97a75e65dbbd22e7fae7086346595e Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 22 Oct 2007 20:19:53 +0000 Subject: Fixes cross storage and adapter path. --- network/manager.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 65 insertions(+), 10 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 683ff0a0..26553b7f 100644 --- a/network/manager.c +++ b/network/manager.c @@ -507,6 +507,60 @@ static DBusHandlerResult find_connection(DBusConnection *conn, 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_connection(DBusConnection *conn, } 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_connection(DBusConnection *conn, 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(const char *adapter) /* 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; @@ -826,11 +883,9 @@ static void register_server(uint16_t id) bacpy(&src, BDADDR_ANY); dev_id = hci_get_route(&src); - if (dev_id < 0) + if (dev_id < 0 || hci_devba(dev_id, &src)) return; - hci_devba(dev_id, &src); - if (server_register(path, &src, id) < 0) return; -- cgit From 97fd2ad39b3a08d695f5d45783e2dd0ee377bf3f Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 31 Oct 2007 14:47:39 +0000 Subject: Handle disabling interfaces via configuration file. --- network/manager.c | 101 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 33 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 26553b7f..6355f032 100644 --- a/network/manager.c +++ b/network/manager.c @@ -875,6 +875,9 @@ static void register_server(uint16_t id) bdaddr_t src; int dev_id; + if (!conf->server_enabled) + return; + snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s", bnep_name(id)); if (g_slist_find_custom(server_paths, path, @@ -940,24 +943,26 @@ static void register_stored(void) continue; /* Connection objects */ - register_connections_stored(de->d_name); + if (conf->connection_enabled) + register_connections_stored(de->d_name); - /* NAP objects */ - register_servers_stored(de->d_name, "nap"); + /* Server objects */ + if (conf->server_enabled) { + /* NAP objects */ + register_servers_stored(de->d_name, "nap"); - /* GN objects */ - register_servers_stored(de->d_name, "gn"); + /* GN objects */ + register_servers_stored(de->d_name, "gn"); - /* PANU objects */ - register_servers_stored(de->d_name, "panu"); + /* PANU objects */ + register_servers_stored(de->d_name, "panu"); + } } closedir(dir); } -static DBusMethodVTable manager_methods[] = { - { "ListServers", list_servers, "", "as" }, - { "FindServer", find_server, "s", "s" }, +static DBusMethodVTable connection_methods[] = { { "ListConnections", list_connections, "", "as" }, { "FindConnection", find_connection, "s", "s" }, { "CreateConnection", create_connection, "ss", "s" }, @@ -968,19 +973,49 @@ static DBusMethodVTable manager_methods[] = { { NULL, NULL, NULL, NULL } }; -static DBusSignalVTable manager_signals[] = { +static DBusSignalVTable connection_signals[] = { { "ConnectionCreated", "s" }, { "ConnectionRemoved", "s" }, { "DefaultConnectionChanged", "s" }, { NULL, NULL } }; +static DBusMethodVTable server_methods[] = { + { "ListServers", list_servers, "", "as" }, + { "FindServer", find_server, "s", "s" }, + { NULL, NULL, NULL, NULL } +}; + +static DBusMethodVTable manager_methods[] = { + { "ListServers", list_servers, "", "as" }, + { "FindServer", find_server, "s", "s" }, + { "ListConnections", list_connections, "", "as" }, + { "FindConnection", find_connection, "s", "s" }, + { "CreateConnection", create_connection, "ss", "s" }, + { "RemoveConnection", remove_connection, "s", "" }, + { "LastConnection", last_connection, "", "s" }, + { "DefaultConnection", default_connection, "", "s" }, + { "ChangeDefaultConnection", change_default_connection, "s", "s"}, + { NULL, NULL, NULL, NULL } +}; + int network_init(DBusConnection *conn, struct network_conf *service_conf) { + DBusMethodVTable *methods = NULL; + DBusSignalVTable *signals = NULL; + conf = service_conf; - if (bridge_init(conf->gn_iface, conf->nap_iface) < 0) { - error("Can't init bridge module"); + if (conf->server_enabled && conf->connection_enabled) { + methods = manager_methods; + signals = connection_signals; + } else if (conf->connection_enabled) { + methods = connection_methods; + signals = connection_signals; + } else if (conf->server_enabled) + methods = server_methods; + else { + error ("All interfaces were disabled"); return -1; } @@ -995,11 +1030,20 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) * (setup connection request) contains the destination service * field that defines which service the source is connecting to. */ - if (server_init(conn, conf->iface_prefix, conf->security) < 0) - return -1; + if (conf->server_enabled) { + if (bridge_init(conf->gn_iface, conf->nap_iface) < 0) { + error("Can't init bridge module"); + return -1; + } - if (connection_init(conn, conf->iface_prefix) < 0) - return -1; + if (server_init(conn, conf->iface_prefix, conf->security) < 0) + return -1; + } + + if (conf->connection_enabled) { + if (connection_init(conn, conf->iface_prefix) < 0) + return -1; + } if (!dbus_connection_create_object_path(conn, NETWORK_PATH, NULL, manager_unregister)) { @@ -1009,20 +1053,13 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) if (!dbus_connection_register_interface(conn, NETWORK_PATH, NETWORK_MANAGER_INTERFACE, - manager_methods, - manager_signals, NULL)) { + methods, signals, NULL)) { error("Failed to register %s interface to %s", NETWORK_MANAGER_INTERFACE, NETWORK_PATH); dbus_connection_destroy_object_path(connection, NETWORK_PATH); return -1; } - if (bridge_create(BNEP_SVC_GN) < 0) - error("Can't create GN bridge"); - - if (bridge_create(BNEP_SVC_NAP) < 0) - error("Can't create NAP bridge"); - connection = dbus_connection_ref(conn); info("Registered manager path:%s", NETWORK_PATH); @@ -1039,19 +1076,17 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) void network_exit(void) { - server_exit(); - connection_exit(); + if (conf->server_enabled) + server_exit(); + + if (conf->connection_enabled) + connection_exit(); + dbus_connection_destroy_object_path(connection, NETWORK_PATH); dbus_connection_unref(connection); connection = NULL; - if (bridge_remove(BNEP_SVC_GN) < 0) - error("Can't remove GN bridge"); - - if (bridge_remove(BNEP_SVC_NAP) < 0) - error("Can't remove NAP bridge"); - bnep_cleanup(); bridge_cleanup(); } -- cgit From 7e88afe4f8307c092172ff3c3b76c2f95ab00293 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Mon, 26 Nov 2007 13:43:17 +0000 Subject: Update services to new error codes and helper functions --- network/manager.c | 60 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 28 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 6355f032..5855cf1f 100644 --- a/network/manager.c +++ b/network/manager.c @@ -171,19 +171,19 @@ static DBusHandlerResult remove_path(DBusConnection *conn, if (!dbus_message_get_args(msg, &derr, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) { - err_invalid_args(conn, msg, derr.message); + error_invalid_arguments(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } l = g_slist_find_custom(*list, path, (GCompareFunc) strcmp); if (!l) - return err_does_not_exist(conn, msg, "Path doesn't exist"); + return error_does_not_exist(conn, msg, "Path doesn't exist"); /* Remove references from the storage */ if (*list == connection_paths) { if (connection_has_pending(path)) - return err_failed(conn, msg, "Connection is Busy"); + return error_failed(conn, msg, "Connection is Busy"); connection_remove_stored(path); /* Reset default connection */ @@ -226,11 +226,13 @@ static void pan_record_reply(DBusPendingCall *call, void *data) dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { + /* FIXME: forward error as is */ if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) - err_connection_failed(pr->conn, pr->msg, derr.message); + error_connection_attempt_failed(pr->conn, pr->msg, + EINVAL); else - err_not_supported(pr->conn, pr->msg); + error_not_supported(pr->conn, pr->msg); error("GetRemoteServiceRecord failed: %s(%s)", derr.name, derr.message); @@ -240,13 +242,13 @@ static void pan_record_reply(DBusPendingCall *call, void *data) if (!dbus_message_get_args(reply, &derr, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &rec_bin, &len, DBUS_TYPE_INVALID)) { - err_not_supported(pr->conn, pr->msg); + error_not_supported(pr->conn, pr->msg); error("%s: %s", derr.name, derr.message); goto fail; } if (len == 0) { - err_not_supported(pr->conn, pr->msg); + error_not_supported(pr->conn, pr->msg); error("Invalid PAN service record length"); goto fail; } @@ -276,7 +278,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data) if (connection_register(pr->path, &pr->src, &pr->dst, pr->id, name, desc) < 0) { - err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); + error_failed(pr->conn, pr->msg, "D-Bus path registration failed"); goto fail; } @@ -334,11 +336,13 @@ static void pan_handle_reply(DBusPendingCall *call, void *data) dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { + /* FIXME : forward error as is */ if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) - err_connection_failed(pr->conn, pr->msg, derr.message); + error_connection_attempt_failed(pr->conn, pr->msg, + EINVAL); else - err_not_supported(pr->conn, pr->msg); + error_not_supported(pr->conn, pr->msg); error("GetRemoteServiceHandles: %s(%s)", derr.name, derr.message); @@ -348,18 +352,18 @@ static void pan_handle_reply(DBusPendingCall *call, void *data) if (!dbus_message_get_args(reply, &derr, DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle, &len, DBUS_TYPE_INVALID)) { - err_not_supported(pr->conn, pr->msg); + error_not_supported(pr->conn, pr->msg); error("%s: %s", derr.name, derr.message); goto fail; } if (!len) { - err_not_supported(pr->conn, pr->msg); + error_not_supported(pr->conn, pr->msg); goto fail; } if (get_record(pr, *phandle, pan_record_reply) < 0) { - err_not_supported(pr->conn, pr->msg); + error_not_supported(pr->conn, pr->msg); goto fail; } @@ -420,7 +424,7 @@ static DBusHandlerResult find_server(DBusConnection *conn, if (!dbus_message_get_args(msg, &derr, DBUS_TYPE_STRING, &pattern, DBUS_TYPE_INVALID)) { - err_invalid_args(conn, msg, derr.message); + error_invalid_arguments(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } @@ -432,7 +436,7 @@ static DBusHandlerResult find_server(DBusConnection *conn, } if (list == NULL) { - err_failed(conn, msg, "No such server"); + error_does_not_exist(conn, msg, "No such server"); return DBUS_HANDLER_RESULT_HANDLED; } @@ -483,7 +487,7 @@ static DBusHandlerResult find_connection(DBusConnection *conn, if (!dbus_message_get_args(msg, &derr, DBUS_TYPE_STRING, &pattern, DBUS_TYPE_INVALID)) { - err_invalid_args(conn, msg, derr.message); + error_invalid_arguments(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } @@ -491,7 +495,7 @@ static DBusHandlerResult find_connection(DBusConnection *conn, list = find_connection_pattern(conn, pattern); if (list == NULL) { - err_failed(conn, msg, "No such connection"); + error_does_not_exist(conn, msg, "No such connection"); return DBUS_HANDLER_RESULT_HANDLED; } @@ -579,21 +583,21 @@ static DBusHandlerResult create_connection(DBusConnection *conn, DBUS_TYPE_STRING, &addr, DBUS_TYPE_STRING, &str, DBUS_TYPE_INVALID)) { - err_invalid_args(conn, msg, derr.message); + error_invalid_arguments(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } id = bnep_service_id(str); if (id != BNEP_SVC_GN && id != BNEP_SVC_NAP && id != BNEP_SVC_PANU) - return err_invalid_args(conn, msg, "Not supported"); + return error_invalid_arguments(conn, msg, "Not supported"); snprintf(key, 32, "%s#%s", addr, bnep_name(id)); /* Checks if the connection was already been made */ for (l = connection_paths; l; l = l->next) { if (connection_find_data(l->data, key) == 0) { - err_already_exists(conn, msg, + error_already_exists(conn, msg, "Connection Already exists"); return DBUS_HANDLER_RESULT_HANDLED; } @@ -602,14 +606,14 @@ static DBusHandlerResult create_connection(DBusConnection *conn, bacpy(&src, BDADDR_ANY); dev_id = hci_get_route(&src); if (dev_id < 0 || hci_devba(dev_id, &src) < 0) - return err_failed(conn, msg, "Adapter not available"); + return error_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"); + return error_failed(conn, msg, "Adapter not available"); } pr->conn = dbus_connection_ref(conn); @@ -623,7 +627,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, NETWORK_PATH"/connection%d", net_uid++); if (get_handles(pr, pan_handle_reply) < 0) - return err_not_supported(conn, msg); + return error_not_supported(conn, msg); return DBUS_HANDLER_RESULT_HANDLED; } @@ -642,7 +646,7 @@ static DBusHandlerResult last_connection(DBusConnection *conn, if (connection_paths == NULL || g_slist_length (connection_paths) == 0) { - err_does_not_exist(conn, msg, "No such connection"); + error_does_not_exist(conn, msg, "No such connection"); return DBUS_HANDLER_RESULT_HANDLED; } @@ -666,7 +670,7 @@ static DBusHandlerResult default_connection(DBusConnection *conn, if (connection_paths == NULL || g_slist_length (connection_paths) == 0) { - err_does_not_exist(conn, msg, "No such connection"); + error_does_not_exist(conn, msg, "No such connection"); return DBUS_HANDLER_RESULT_HANDLED; } @@ -700,14 +704,14 @@ static DBusHandlerResult change_default_connection(DBusConnection *conn, if (!dbus_message_get_args(msg, &derr, DBUS_TYPE_STRING, &pattern, DBUS_TYPE_INVALID)) { - err_invalid_args(conn, msg, derr.message); + error_invalid_arguments(conn, msg, derr.message); dbus_error_free(&derr); return DBUS_HANDLER_RESULT_HANDLED; } if (connection_paths == NULL || g_slist_length (connection_paths) == 0) { - err_does_not_exist(conn, msg, "No such connection"); + error_does_not_exist(conn, msg, "No such connection"); return DBUS_HANDLER_RESULT_HANDLED; } @@ -718,7 +722,7 @@ static DBusHandlerResult change_default_connection(DBusConnection *conn, list = find_connection_pattern(conn, pattern); if (list == NULL) { - err_failed(conn, msg, "No such connection"); + error_does_not_exist(conn, msg, "No such connection"); return DBUS_HANDLER_RESULT_HANDLED; } else -- cgit From e823c15e43a6f924779e466d434c51157002d9ee Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 2 Feb 2008 03:37:05 +0000 Subject: Update copyright information --- network/manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 5855cf1f..1647e34e 100644 --- a/network/manager.c +++ b/network/manager.c @@ -2,7 +2,7 @@ * * BlueZ - Bluetooth protocol stack for Linux * - * Copyright (C) 2004-2007 Marcel Holtmann + * Copyright (C) 2004-2008 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify -- cgit From 88e798a8b8126d997ded2adcebafbc3fb1fcb509 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 22 Mar 2008 15:49:07 +0000 Subject: Convert network service into a plugin --- network/manager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 1647e34e..0808706e 100644 --- a/network/manager.c +++ b/network/manager.c @@ -1003,7 +1003,7 @@ static DBusMethodVTable manager_methods[] = { { NULL, NULL, NULL, NULL } }; -int network_init(DBusConnection *conn, struct network_conf *service_conf) +int network_manager_init(DBusConnection *conn, struct network_conf *service_conf) { DBusMethodVTable *methods = NULL; DBusSignalVTable *signals = NULL; @@ -1078,7 +1078,7 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) return 0; } -void network_exit(void) +void network_manager_exit(void) { if (conf->server_enabled) server_exit(); -- cgit From f9ba262724b4605bf45d0a1fd2c87eeeac714917 Mon Sep 17 00:00:00 2001 From: Vinicius Gomes Date: Thu, 27 Mar 2008 13:23:21 +0000 Subject: network: removing some blocking dbus calls from manager.c --- network/manager.c | 59 +++---------------------------------------------------- 1 file changed, 3 insertions(+), 56 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 0808706e..a65f56a5 100644 --- a/network/manager.c +++ b/network/manager.c @@ -229,7 +229,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data) /* FIXME: forward error as is */ if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) - error_connection_attempt_failed(pr->conn, pr->msg, + error_connection_attempt_failed(pr->conn, pr->msg, EINVAL); else error_not_supported(pr->conn, pr->msg); @@ -511,60 +511,6 @@ static DBusHandlerResult find_connection(DBusConnection *conn, 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) { @@ -610,7 +556,8 @@ static DBusHandlerResult create_connection(DBusConnection *conn, pr = g_new0(struct pending_reply, 1); - pr->adapter_path = find_adapter(conn, &src); + /* FIXME just to maintain compatibility */ + pr->adapter_path = g_strdup_printf("/org/bluez/hci%d", dev_id); if (!pr->adapter_path) { pending_reply_free (pr); return error_failed(conn, msg, "Adapter not available"); -- cgit From ca1711891647c07d70fbcce29ef7e7576e45c016 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 7 May 2008 21:58:19 +0000 Subject: Fix dbus internals calls. --- network/manager.c | 163 +++++++----------------------------------------------- 1 file changed, 19 insertions(+), 144 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index a65f56a5..2ad0a97d 100644 --- a/network/manager.c +++ b/network/manager.c @@ -44,6 +44,7 @@ #include "dbus-helper.h" #include "logging.h" #include "textfile.h" +#include "glib-helper.h" #define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager" @@ -213,47 +214,26 @@ static DBusHandlerResult remove_path(DBusConnection *conn, return send_message_and_unref(conn, reply); } -static void pan_record_reply(DBusPendingCall *call, void *data) +static void records_cb(sdp_list_t *recs, int err, gpointer data) { struct pending_reply *pr = data; - DBusMessage *reply = dbus_pending_call_steal_reply(call); - DBusError derr; - int len, scanned; - uint8_t *rec_bin; + int len; sdp_data_t *d; sdp_record_t *rec = NULL; char name[MAX_NAME_SIZE], *desc = NULL; - dbus_error_init(&derr); - if (dbus_set_error_from_message(&derr, reply)) { - /* FIXME: forward error as is */ - if (dbus_error_has_name(&derr, - "org.bluez.Error.ConnectionAttemptFailed")) - error_connection_attempt_failed(pr->conn, pr->msg, - EINVAL); - else - error_not_supported(pr->conn, pr->msg); - - error("GetRemoteServiceRecord failed: %s(%s)", derr.name, - derr.message); + if (err < 0) { + error_connection_attempt_failed(pr->conn, pr->msg, -err); goto fail; } - if (!dbus_message_get_args(reply, &derr, - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &rec_bin, &len, - DBUS_TYPE_INVALID)) { + if (!recs || !recs->data) { error_not_supported(pr->conn, pr->msg); - error("%s: %s", derr.name, derr.message); + error("Invalid PAN service record"); goto fail; } - if (len == 0) { - error_not_supported(pr->conn, pr->msg); - error("Invalid PAN service record length"); - goto fail; - } - - rec = sdp_extract_pdu(rec_bin, &scanned); + rec = recs->data; /* Concat remote name and service name */ memset(name, 0, MAX_NAME_SIZE); @@ -276,6 +256,8 @@ static void pan_record_reply(DBusPendingCall *call, void *data) d->unitSize, d->val.str); } + sdp_list_free(recs, (sdp_free_func_t) sdp_record_free); + if (connection_register(pr->path, &pr->src, &pr->dst, pr->id, name, desc) < 0) { error_failed(pr->conn, pr->msg, "D-Bus path registration failed"); @@ -286,125 +268,12 @@ static void pan_record_reply(DBusPendingCall *call, void *data) connection_paths = g_slist_append(connection_paths, g_strdup(pr->path)); create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); -fail: - - if (desc) - g_free(desc); - - sdp_record_free(rec); - dbus_error_free(&derr); - pending_reply_free(pr); - dbus_message_unref(reply); -} - -static int get_record(struct pending_reply *pr, uint32_t handle, - DBusPendingCallNotifyFunction cb) -{ - DBusMessage *msg; - DBusPendingCall *pending; - - msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, - "org.bluez.Adapter", "GetRemoteServiceRecord"); - if (!msg) - return -1; - - dbus_message_append_args(msg, - DBUS_TYPE_STRING, &pr->addr, - DBUS_TYPE_UINT32, &handle, - DBUS_TYPE_INVALID); - - if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { - error("Can't send D-Bus message."); - dbus_message_unref(msg); - return -1; - } - - dbus_pending_call_set_notify(pending, cb, pr, NULL); - dbus_message_unref(msg); - dbus_pending_call_unref(pending); - - return 0; -} - -static void pan_handle_reply(DBusPendingCall *call, void *data) -{ - struct pending_reply *pr = data; - DBusMessage *reply = dbus_pending_call_steal_reply(call); - DBusError derr; - uint32_t *phandle; - int len; - dbus_error_init(&derr); - if (dbus_set_error_from_message(&derr, reply)) { - /* FIXME : forward error as is */ - if (dbus_error_has_name(&derr, - "org.bluez.Error.ConnectionAttemptFailed")) - error_connection_attempt_failed(pr->conn, pr->msg, - EINVAL); - else - error_not_supported(pr->conn, pr->msg); - - error("GetRemoteServiceHandles: %s(%s)", derr.name, - derr.message); - goto fail; - } - - if (!dbus_message_get_args(reply, &derr, - DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle, - &len, DBUS_TYPE_INVALID)) { - error_not_supported(pr->conn, pr->msg); - error("%s: %s", derr.name, derr.message); - goto fail; - } - - if (!len) { - error_not_supported(pr->conn, pr->msg); - goto fail; - } - - if (get_record(pr, *phandle, pan_record_reply) < 0) { - error_not_supported(pr->conn, pr->msg); - goto fail; - } - - dbus_message_unref(reply); - return; fail: - dbus_error_free(&derr); + g_free(desc); pending_reply_free(pr); } -static int get_handles(struct pending_reply *pr, - DBusPendingCallNotifyFunction cb) -{ - DBusMessage *msg; - DBusPendingCall *pending; - const char *uuid; - - msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, - "org.bluez.Adapter", "GetRemoteServiceHandles"); - if (!msg) - return -1; - - uuid = bnep_uuid(pr->id); - dbus_message_append_args(msg, - DBUS_TYPE_STRING, &pr->addr, - DBUS_TYPE_STRING, &uuid, - DBUS_TYPE_INVALID); - - if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { - error("Can't send D-Bus message."); - dbus_message_unref(msg); - return -1; - } - - dbus_pending_call_set_notify(pending, cb, pr, NULL); - dbus_message_unref(msg); - dbus_pending_call_unref(pending); - - return 0; -} - static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -520,9 +389,10 @@ static DBusHandlerResult create_connection(DBusConnection *conn, const char *str; bdaddr_t src; uint16_t id; - int dev_id; + int dev_id, err; char key[32]; GSList *l; + uuid_t uuid; dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, @@ -573,8 +443,13 @@ static DBusHandlerResult create_connection(DBusConnection *conn, snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH"/connection%d", net_uid++); - if (get_handles(pr, pan_handle_reply) < 0) + sdp_uuid16_create(&uuid, pr->id); + err = bt_search_service(&pr->src, &pr->dst, &uuid, records_cb, pr, + NULL); + if (err < 0) { + pending_reply_free(pr); return error_not_supported(conn, msg); + } return DBUS_HANDLER_RESULT_HANDLED; } -- cgit From e7d668ac9e813bc9922ee7d771848bd8822d5d1f Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 8 May 2008 20:23:45 +0000 Subject: Move D-Bus watch functions into libgdbus --- network/manager.c | 1 - 1 file changed, 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 2ad0a97d..14bea175 100644 --- a/network/manager.c +++ b/network/manager.c @@ -40,7 +40,6 @@ #include -#include "dbus.h" #include "dbus-helper.h" #include "logging.h" #include "textfile.h" -- cgit From 15ea15b3a752f0487bc50d0ea04925f1b9d33dcb Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 8 May 2008 22:19:14 +0000 Subject: Move D-Bus object and interface helpers into libgdbus --- network/manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 14bea175..39aaa6e0 100644 --- a/network/manager.c +++ b/network/manager.c @@ -39,8 +39,8 @@ #include #include +#include -#include "dbus-helper.h" #include "logging.h" #include "textfile.h" #include "glib-helper.h" -- cgit From af457e55d1a46fbf3ecef32fc29e299ee4be21cf Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 27 May 2008 20:41:14 +0000 Subject: Convert network manager interface to use gdbus API --- network/manager.c | 378 ++++++++++++++++++++++-------------------------------- 1 file changed, 153 insertions(+), 225 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 39aaa6e0..5005f0e8 100644 --- a/network/manager.c +++ b/network/manager.c @@ -75,7 +75,6 @@ static DBusConnection *connection = NULL; static void pending_reply_free(struct pending_reply *pr) { - if (pr->addr) g_free(pr->addr); if (pr->path) @@ -88,12 +87,39 @@ static void pending_reply_free(struct pending_reply *pr) dbus_connection_unref(pr->conn); } -static DBusHandlerResult create_path(DBusConnection *conn, - DBusMessage *msg, const char *path, - const char *sname) +static inline DBusMessage *does_not_exist(DBusMessage *msg) { - DBusMessage *reply; + return g_dbus_create_error(msg, ERROR_INTERFACE ".AlreadyExists", + "No such connection"); +} +static inline DBusMessage *already_exists(DBusMessage *msg) +{ + return g_dbus_create_error(msg, ERROR_INTERFACE ".AlreadyExists", + "Connection already exists"); +} + +static inline DBusMessage *not_supported(DBusMessage *msg) +{ + return g_dbus_create_error(msg, ERROR_INTERFACE ".NotSupported", + "Not supported"); +} + +static inline DBusMessage *connection_is_busy(DBusMessage *msg) +{ + return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed", + "Connection is Busy"); +} + +static inline DBusMessage *adapter_not_available(DBusMessage *msg) +{ + return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed", + "Adapter not available"); +} + +static void create_path(DBusConnection *conn, DBusMessage *msg, + const char *path, const char *sname) +{ /* emit signal when it is a new path */ if (sname) { dbus_connection_emit_signal(conn, NETWORK_PATH, @@ -102,17 +128,11 @@ static DBusHandlerResult create_path(DBusConnection *conn, DBUS_TYPE_INVALID); } - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + g_dbus_send_reply(conn, msg, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); } -static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, +static DBusMessage *list_paths(DBusConnection *conn, DBusMessage *msg, GSList *list) { DBusMessage *reply; @@ -120,8 +140,8 @@ static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, DBusMessageIter array_iter; reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; + if (reply == NULL) + return NULL; dbus_message_iter_init_append(reply, &iter); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, @@ -132,12 +152,13 @@ static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, DBUS_TYPE_STRING, &list->data); } + dbus_message_iter_close_container(&iter, &array_iter); - return send_message_and_unref(conn, reply); + return reply; } -static const char * last_connection_used(DBusConnection *conn) +static const char *last_connection_used(DBusConnection *conn) { const char *path = NULL; GSList *l; @@ -158,32 +179,25 @@ static const char * last_connection_used(DBusConnection *conn) return path; } -static DBusHandlerResult remove_path(DBusConnection *conn, +static DBusMessage *remove_path(DBusConnection *conn, DBusMessage *msg, GSList **list, const char *sname) { const char *path; - DBusMessage *reply; - DBusError derr; GSList *l; - dbus_error_init(&derr); - if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID)) { - error_invalid_arguments(conn, msg, derr.message); - dbus_error_free(&derr); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID) == FALSE) + return NULL; l = g_slist_find_custom(*list, path, (GCompareFunc) strcmp); if (!l) - return error_does_not_exist(conn, msg, "Path doesn't exist"); + return does_not_exist(msg); /* Remove references from the storage */ if (*list == connection_paths) { if (connection_has_pending(path)) - return error_failed(conn, msg, "Connection is Busy"); + return connection_is_busy(msg); connection_remove_stored(path); /* Reset default connection */ @@ -198,19 +212,14 @@ static DBusHandlerResult remove_path(DBusConnection *conn, g_free(l->data); *list = g_slist_remove(*list, l->data); - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - if (!dbus_connection_destroy_object_path(conn, path)) - error("Network path unregister failed"); - dbus_connection_emit_signal(conn, NETWORK_PATH, NETWORK_MANAGER_INTERFACE, sname, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID); - return send_message_and_unref(conn, reply); + g_dbus_unregister_interface(conn, path, NETWORK_CONNECTION_INTERFACE); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } static void records_cb(sdp_list_t *recs, int err, gpointer data) @@ -273,29 +282,22 @@ fail: pending_reply_free(pr); } -static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, - void *data) +static DBusMessage *list_servers(DBusConnection *conn, + DBusMessage *msg, void *data) { return list_paths(conn, msg, server_paths); } -static DBusHandlerResult find_server(DBusConnection *conn, - DBusMessage *msg, void *data) +static DBusMessage *find_server(DBusConnection *conn, + DBusMessage *msg, void *data) { - DBusError derr; const char *pattern; const char *path; GSList *list; - DBusMessage *reply; - dbus_error_init(&derr); - if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &pattern, - DBUS_TYPE_INVALID)) { - error_invalid_arguments(conn, msg, derr.message); - dbus_error_free(&derr); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern, + DBUS_TYPE_INVALID) == FALSE) + return NULL; for (list = server_paths; list; list = list->next) { path = (const char *) list->data; @@ -303,29 +305,21 @@ static DBusHandlerResult find_server(DBusConnection *conn, break; } - if (list == NULL) { - error_does_not_exist(conn, msg, "No such server"); - return DBUS_HANDLER_RESULT_HANDLED; - } - - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; + if (list == NULL) + return does_not_exist(msg); - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); } -static DBusHandlerResult list_connections(DBusConnection *conn, +static DBusMessage *list_connections(DBusConnection *conn, DBusMessage *msg, void *data) { return list_paths(conn, msg, connection_paths); } -static GSList * find_connection_pattern(DBusConnection *conn, - const char *pattern) +static GSList *find_connection_pattern(DBusConnection *conn, + const char *pattern) { const char *path; GSList *list; @@ -342,48 +336,31 @@ static GSList * find_connection_pattern(DBusConnection *conn, return list; } -static DBusHandlerResult find_connection(DBusConnection *conn, +static DBusMessage *find_connection(DBusConnection *conn, DBusMessage *msg, void *data) { - DBusError derr; const char *pattern; const char *path; GSList *list; - DBusMessage *reply; - dbus_error_init(&derr); - if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &pattern, - DBUS_TYPE_INVALID)) { - error_invalid_arguments(conn, msg, derr.message); - dbus_error_free(&derr); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern, + DBUS_TYPE_INVALID) == FALSE) + return NULL; list = find_connection_pattern(conn, pattern); - - if (list == NULL) { - error_does_not_exist(conn, msg, "No such connection"); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (list == NULL) + return does_not_exist(msg); path = list->data; - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); } -static DBusHandlerResult create_connection(DBusConnection *conn, +static DBusMessage *create_connection(DBusConnection *conn, DBusMessage *msg, void *data) { struct pending_reply *pr; - DBusError derr; const char *addr; const char *str; bdaddr_t src; @@ -393,35 +370,26 @@ static DBusHandlerResult create_connection(DBusConnection *conn, GSList *l; uuid_t uuid; - dbus_error_init(&derr); - if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &addr, - DBUS_TYPE_STRING, &str, - DBUS_TYPE_INVALID)) { - error_invalid_arguments(conn, msg, derr.message); - dbus_error_free(&derr); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &addr, + DBUS_TYPE_STRING, &str, DBUS_TYPE_INVALID) == FALSE) + return NULL; id = bnep_service_id(str); if (id != BNEP_SVC_GN && id != BNEP_SVC_NAP && id != BNEP_SVC_PANU) - return error_invalid_arguments(conn, msg, "Not supported"); + return not_supported(msg); snprintf(key, 32, "%s#%s", addr, bnep_name(id)); /* Checks if the connection was already been made */ for (l = connection_paths; l; l = l->next) { - if (connection_find_data(l->data, key) == 0) { - error_already_exists(conn, msg, - "Connection Already exists"); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (connection_find_data(l->data, key) == 0) + return already_exists(msg); } bacpy(&src, BDADDR_ANY); dev_id = hci_get_route(&src); if (dev_id < 0 || hci_devba(dev_id, &src) < 0) - return error_failed(conn, msg, "Adapter not available"); + return adapter_not_available(msg); pr = g_new0(struct pending_reply, 1); @@ -429,7 +397,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn, pr->adapter_path = g_strdup_printf("/org/bluez/hci%d", dev_id); if (!pr->adapter_path) { pending_reply_free (pr); - return error_failed(conn, msg, "Adapter not available"); + return adapter_not_available(msg); } pr->conn = dbus_connection_ref(conn); @@ -440,60 +408,48 @@ static DBusHandlerResult create_connection(DBusConnection *conn, pr->id = id; pr->path = g_new0(char, MAX_PATH_LENGTH); snprintf(pr->path, MAX_PATH_LENGTH, - NETWORK_PATH"/connection%d", net_uid++); + NETWORK_PATH "/connection%d", net_uid++); sdp_uuid16_create(&uuid, pr->id); err = bt_search_service(&pr->src, &pr->dst, &uuid, records_cb, pr, NULL); if (err < 0) { pending_reply_free(pr); - return error_not_supported(conn, msg); + return not_supported(msg); } - return DBUS_HANDLER_RESULT_HANDLED; + return NULL; } -static DBusHandlerResult remove_connection(DBusConnection *conn, +static DBusMessage *remove_connection(DBusConnection *conn, DBusMessage *msg, void *data) { return remove_path(conn, msg, &connection_paths, "ConnectionRemoved"); } -static DBusHandlerResult last_connection(DBusConnection *conn, +static DBusMessage *last_connection(DBusConnection *conn, DBusMessage *msg, void *data) { const char *path; - DBusMessage *reply; if (connection_paths == NULL || - g_slist_length (connection_paths) == 0) { - error_does_not_exist(conn, msg, "No such connection"); - return DBUS_HANDLER_RESULT_HANDLED; - } + g_slist_length(connection_paths) == 0) + return does_not_exist(msg); path = last_connection_used(conn); - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); } -static DBusHandlerResult default_connection(DBusConnection *conn, +static DBusMessage *default_connection(DBusConnection *conn, DBusMessage *msg, void *data) { const char *path; - DBusMessage *reply; if (connection_paths == NULL || - g_slist_length (connection_paths) == 0) { - error_does_not_exist(conn, msg, "No such connection"); - return DBUS_HANDLER_RESULT_HANDLED; - } + g_slist_length (connection_paths) == 0) + return does_not_exist(msg); path = g_slist_nth_data (connection_paths, default_index); @@ -502,57 +458,39 @@ static DBusHandlerResult default_connection(DBusConnection *conn, connection_store(path, TRUE); } - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); } -static DBusHandlerResult change_default_connection(DBusConnection *conn, +static DBusMessage *change_default_connection(DBusConnection *conn, DBusMessage *msg, void *data) { const char *path; const char *pattern; - DBusMessage *reply; - DBusError derr; GSList *list; - dbus_error_init(&derr); - if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &pattern, - DBUS_TYPE_INVALID)) { - error_invalid_arguments(conn, msg, derr.message); - dbus_error_free(&derr); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern, + DBUS_TYPE_INVALID) == FALSE) + return NULL; if (connection_paths == NULL || - g_slist_length (connection_paths) == 0) { - error_does_not_exist(conn, msg, "No such connection"); - return DBUS_HANDLER_RESULT_HANDLED; - } + g_slist_length(connection_paths) == 0) + return does_not_exist(msg); - list = g_slist_find_custom(connection_paths, pattern, (GCompareFunc) strcmp); + list = g_slist_find_custom(connection_paths, pattern, + (GCompareFunc) strcmp); /* Find object path via pattern */ if (list == NULL) { list = find_connection_pattern(conn, pattern); + if (list == NULL) + return does_not_exist(msg); - if (list == NULL) { - error_does_not_exist(conn, msg, "No such connection"); - return DBUS_HANDLER_RESULT_HANDLED; - } - else - path = list->data; - } - else + path = list->data; + } else path = list->data; - default_index = g_slist_position (connection_paths, list); + default_index = g_slist_position(connection_paths, list); connection_store(path, TRUE); dbus_connection_emit_signal(connection, NETWORK_PATH, @@ -561,28 +499,22 @@ static DBusHandlerResult change_default_connection(DBusConnection *conn, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID); - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); } -static void manager_unregister(DBusConnection *conn, void *data) +static void manager_unregister(void *data) { info("Unregistered manager path"); if (server_paths) { - g_slist_foreach(server_paths, (GFunc)g_free, NULL); + g_slist_foreach(server_paths, (GFunc) g_free, NULL); g_slist_free(server_paths); server_paths = NULL; } if (connection_paths) { - g_slist_foreach(connection_paths, (GFunc)g_free, NULL); + g_slist_foreach(connection_paths, (GFunc) g_free, NULL); g_slist_free(connection_paths); connection_paths = NULL; } @@ -626,7 +558,7 @@ static void parse_stored_connection(char *key, char *value, void *data) return; snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/connection%d", net_uid++); + NETWORK_PATH "/connection%d", net_uid++); /* Parsing the value: name and description */ ptr = strchr(value, ':'); @@ -703,7 +635,7 @@ static void register_server(uint16_t id) if (!conf->server_enabled) return; - snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s", bnep_name(id)); + snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH "/%s", bnep_name(id)); if (g_slist_find_custom(server_paths, path, (GCompareFunc) strcmp)) @@ -742,8 +674,7 @@ static void register_servers_stored(const char *adapter, const char *profile) str2ba(adapter, &src); if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { - snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/%s", profile); + snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH "/%s", profile); if (server_register_from_file(path, &src, id, filename) == 0) { server_paths = g_slist_append(server_paths, g_strdup(path)); @@ -787,47 +718,49 @@ static void register_stored(void) closedir(dir); } -static DBusMethodVTable connection_methods[] = { - { "ListConnections", list_connections, "", "as" }, - { "FindConnection", find_connection, "s", "s" }, - { "CreateConnection", create_connection, "ss", "s" }, - { "RemoveConnection", remove_connection, "s", "" }, - { "LastConnection", last_connection, "", "s" }, - { "DefaultConnection", default_connection, "", "s" }, - { "ChangeDefaultConnection", change_default_connection, "s", "s"}, - { NULL, NULL, NULL, NULL } +static GDBusMethodTable connection_methods[] = { + { "ListConnections", "", "as", list_connections }, + { "FindConnection", "s", "s", find_connection }, + { "CreateConnection", "ss", "s", create_connection, + G_DBUS_METHOD_FLAG_ASYNC }, + { "RemoveConnection", "s", "", remove_connection }, + { "LastConnection", "", "s", last_connection }, + { "DefaultConnection", "", "s", default_connection }, + { "ChangeDefaultConnection", "s", "s", change_default_connection }, + { } }; -static DBusSignalVTable connection_signals[] = { - { "ConnectionCreated", "s" }, - { "ConnectionRemoved", "s" }, - { "DefaultConnectionChanged", "s" }, - { NULL, NULL } +static GDBusSignalTable connection_signals[] = { + { "ConnectionCreated", "s" }, + { "ConnectionRemoved", "s" }, + { "DefaultConnectionChanged", "s" }, + { } }; -static DBusMethodVTable server_methods[] = { - { "ListServers", list_servers, "", "as" }, - { "FindServer", find_server, "s", "s" }, - { NULL, NULL, NULL, NULL } +static GDBusMethodTable server_methods[] = { + { "ListServers", "", "as", list_servers }, + { "FindServer", "s", "s", find_server }, + { } }; -static DBusMethodVTable manager_methods[] = { - { "ListServers", list_servers, "", "as" }, - { "FindServer", find_server, "s", "s" }, - { "ListConnections", list_connections, "", "as" }, - { "FindConnection", find_connection, "s", "s" }, - { "CreateConnection", create_connection, "ss", "s" }, - { "RemoveConnection", remove_connection, "s", "" }, - { "LastConnection", last_connection, "", "s" }, - { "DefaultConnection", default_connection, "", "s" }, - { "ChangeDefaultConnection", change_default_connection, "s", "s"}, - { NULL, NULL, NULL, NULL } +static GDBusMethodTable manager_methods[] = { + { "ListServers", "", "as", list_servers }, + { "FindServer", "s", "s", find_server }, + { "ListConnections", "", "as", list_connections }, + { "FindConnection", "s", "s", find_connection }, + { "CreateConnection", "ss", "s", create_connection, + G_DBUS_METHOD_FLAG_ASYNC }, + { "RemoveConnection", "s", "", remove_connection }, + { "LastConnection", "", "s", last_connection }, + { "DefaultConnection", "", "s", default_connection }, + { "ChangeDefaultConnection", "s", "s", change_default_connection }, + { } }; int network_manager_init(DBusConnection *conn, struct network_conf *service_conf) { - DBusMethodVTable *methods = NULL; - DBusSignalVTable *signals = NULL; + GDBusMethodTable *methods = NULL; + GDBusSignalTable *signals = NULL; conf = service_conf; @@ -870,18 +803,12 @@ int network_manager_init(DBusConnection *conn, struct network_conf *service_conf return -1; } - if (!dbus_connection_create_object_path(conn, NETWORK_PATH, - NULL, manager_unregister)) { - error("D-Bus failed to create %s path", NETWORK_PATH); - return -1; - } - - if (!dbus_connection_register_interface(conn, NETWORK_PATH, - NETWORK_MANAGER_INTERFACE, - methods, signals, NULL)) { + if (g_dbus_register_interface(conn, NETWORK_PATH, + NETWORK_MANAGER_INTERFACE, + methods, signals, NULL, + NULL, manager_unregister) == FALSE) { error("Failed to register %s interface to %s", NETWORK_MANAGER_INTERFACE, NETWORK_PATH); - dbus_connection_destroy_object_path(connection, NETWORK_PATH); return -1; } @@ -907,7 +834,8 @@ void network_manager_exit(void) if (conf->connection_enabled) connection_exit(); - dbus_connection_destroy_object_path(connection, NETWORK_PATH); + g_dbus_unregister_interface(connection, NETWORK_PATH, + NETWORK_MANAGER_INTERFACE); dbus_connection_unref(connection); connection = NULL; -- cgit From f80a7215275b229a597cf8d2bbc7e4e208af522c Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 7 Jun 2008 19:30:24 +0000 Subject: Use g_dbus_emit_signal for sending D-Bus signals --- network/manager.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'network/manager.c') diff --git a/network/manager.c b/network/manager.c index 5005f0e8..dd23b58d 100644 --- a/network/manager.c +++ b/network/manager.c @@ -122,7 +122,7 @@ static void create_path(DBusConnection *conn, DBusMessage *msg, { /* emit signal when it is a new path */ if (sname) { - dbus_connection_emit_signal(conn, NETWORK_PATH, + g_dbus_emit_signal(conn, NETWORK_PATH, NETWORK_MANAGER_INTERFACE, sname, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID); @@ -212,7 +212,7 @@ static DBusMessage *remove_path(DBusConnection *conn, g_free(l->data); *list = g_slist_remove(*list, l->data); - dbus_connection_emit_signal(conn, NETWORK_PATH, + g_dbus_emit_signal(conn, NETWORK_PATH, NETWORK_MANAGER_INTERFACE, sname, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID); @@ -493,7 +493,7 @@ static DBusMessage *change_default_connection(DBusConnection *conn, default_index = g_slist_position(connection_paths, list); connection_store(path, TRUE); - dbus_connection_emit_signal(connection, NETWORK_PATH, + g_dbus_emit_signal(connection, NETWORK_PATH, NETWORK_MANAGER_INTERFACE, "DefaultConnectionChanged", DBUS_TYPE_STRING, &path, -- cgit