diff options
-rw-r--r-- | network/common.h | 2 | ||||
-rw-r--r-- | network/connection.h | 3 | ||||
-rw-r--r-- | network/main.c | 22 | ||||
-rw-r--r-- | network/manager.c | 55 | ||||
-rw-r--r-- | network/manager.h | 3 | ||||
-rw-r--r-- | network/server.h | 1 |
6 files changed, 36 insertions, 50 deletions
diff --git a/network/common.h b/network/common.h index 36bb66b2..820a2b3a 100644 --- a/network/common.h +++ b/network/common.h @@ -20,7 +20,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ -/* BNEP functions */ + int bnep_init(void); int bnep_cleanup(void); diff --git a/network/connection.h b/network/connection.h index 70966b2c..08861a72 100644 --- a/network/connection.h +++ b/network/connection.h @@ -20,5 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ + int connection_register(DBusConnection *conn, const char *path, - const char *addr, uint16_t id); + const char *addr, uint16_t id); diff --git a/network/main.c b/network/main.c index 16a173c5..74675184 100644 --- a/network/main.c +++ b/network/main.c @@ -48,6 +48,7 @@ static void sig_term(int sig) int main(int argc, char *argv[]) { + DBusConnection *conn; struct sigaction sa; start_logging("network", "Bluetooth Network daemon"); @@ -64,18 +65,26 @@ int main(int argc, char *argv[]) enable_debug(); - /* Create event loop */ main_loop = g_main_loop_new(NULL, FALSE); - hal_init(NULL); + conn = dbus_bus_system_setup_with_main_loop(NULL, NULL, NULL); + if (!conn) { + g_main_loop_unref(main_loop); + exit(1); + } + + hal_init(conn); hal_create_device(NULL); - if (network_init() == -1) - goto fail; + if (network_init(conn) < 0) { + dbus_connection_unref(conn); + g_main_loop_unref(main_loop); + exit(1); + } if (argc > 1 && !strcmp(argv[1], "-s")) - internal_service("network"); + register_external_service(conn, "network", "Network service", ""); g_main_loop_run(main_loop); @@ -85,7 +94,8 @@ int main(int argc, char *argv[]) hal_cleanup(); -fail: + dbus_connection_unref(conn); + g_main_loop_unref(main_loop); info("Exit"); 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"); diff --git a/network/manager.h b/network/manager.h index 81467c1a..d37ca3cd 100644 --- a/network/manager.h +++ b/network/manager.h @@ -21,6 +21,5 @@ * */ -int network_init(void); +int network_init(DBusConnection *conn); void network_exit(void); -void internal_service(const char *identifier); diff --git a/network/server.h b/network/server.h index bb15e4d7..27b38ba6 100644 --- a/network/server.h +++ b/network/server.h @@ -20,4 +20,5 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ + int server_register(DBusConnection *conn, const char *path, uint16_t id); |