summaryrefslogtreecommitdiff
path: root/network
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-07-13 10:50:18 -0300
committerMarcel Holtmann <marcel@holtmann.org>2010-07-13 10:50:18 -0300
commite85f7a782b74d35559b03579e23c9b151ab015e7 (patch)
tree7806fd9d1022c0351c0bd3a593a3214ec8797570 /network
parentbba79d2da1793931c659e50767b155354191c264 (diff)
downloadbluez-e85f7a782b74d35559b03579e23c9b151ab015e7.tar.gz
Handle network server application disconnects
Diffstat (limited to 'network')
-rw-r--r--network/server.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/network/server.c b/network/server.c
index efc65622f..8cf1bff8a 100644
--- a/network/server.c
+++ b/network/server.c
@@ -80,6 +80,7 @@ struct network_server {
uint16_t id; /* Service class identifier */
GSList *sessions; /* Active connections */
struct network_adapter *na; /* Adapter reference */
+ guint watch_id; /* Client service watch */
};
static DBusConnection *connection = NULL;
@@ -570,6 +571,21 @@ static inline DBusMessage *invalid_arguments(DBusMessage *msg,
description);
}
+static void server_disconnect(DBusConnection *conn, void *user_data)
+{
+ struct network_server *ns = user_data;
+
+ ns->watch_id = 0;
+
+ if (ns->record_id) {
+ remove_record_from_server(ns->record_id);
+ ns->record_id = 0;
+ }
+
+ g_free(ns->bridge);
+ ns->bridge = NULL;
+}
+
static DBusMessage *register_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -598,6 +614,10 @@ static DBusMessage *register_server(DBusConnection *conn,
g_free(ns->bridge);
ns->bridge = g_strdup(bridge);
+ ns->watch_id = g_dbus_add_disconnect_watch(conn,
+ dbus_message_get_sender(msg),
+ server_disconnect, ns, NULL);
+
return reply;
}
@@ -619,13 +639,9 @@ static DBusMessage *unregister_server(DBusConnection *conn,
if (!reply)
return NULL;
- if (ns->record_id) {
- remove_record_from_server(ns->record_id);
- ns->record_id = 0;
- }
+ g_dbus_remove_watch(conn, ns->watch_id);
- g_free(ns->bridge);
- ns->bridge = NULL;
+ server_disconnect(conn, ns);
return reply;
}