diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2008-12-01 19:20:45 +0100 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2008-12-01 19:20:45 +0100 | 
| commit | a9aef73a05fe26cc930fa9f73116ce5ae97f5b98 (patch) | |
| tree | a0e08a9e6f35e5fd0a78d5b67629b893c7ebd488 | |
| parent | 519ec3b59a3598efef0fca2726af9f451aebe3b8 (diff) | |
| parent | 82c82fe3270f9d33f5a2c7b2e7009fc9f4c7a131 (diff) | |
Merge branch 'for-upstream' of git://gitorious.org/bluez/vudentzs-clone
| -rw-r--r-- | network/connection.c | 33 | 
1 files changed, 28 insertions, 5 deletions
| diff --git a/network/connection.c b/network/connection.c index 1bb7bd92..8d4a2ed7 100644 --- a/network/connection.c +++ b/network/connection.c @@ -66,6 +66,7 @@ struct network_conn {  	uint16_t	id;		/* Role: Service Class Identifier */  	conn_state	state;  	int		sk; +	guint		watch;		/* Disconnect watch */  	struct network_peer *peer;  }; @@ -152,6 +153,10 @@ static gboolean bnep_watchdog_cb(GIOChannel *chan, GIOCondition cond,  		emit_property_changed(connection, nc->peer->path,  					NETWORK_PEER_INTERFACE, "UUID",  					DBUS_TYPE_STRING, &property); +		if (nc->watch) { +			g_dbus_remove_watch(connection, nc->watch); +			nc->watch = 0; +		}  	}  	info("%s disconnected", nc->dev); @@ -345,6 +350,19 @@ failed:  	g_dbus_send_message(connection, reply);  } +static void connection_destroy(DBusConnection *conn, void *user_data) +{ +	struct network_conn *nc = user_data; + +	nc->watch = 0; + +	if (nc->state == CONNECTED) { +		bnep_if_down(nc->dev); +		bnep_kill_connection(&nc->peer->dst); +	} else +		close(nc->sk); +} +  /* Connect and initiate BNEP session */  static DBusMessage *connection_connect(DBusConnection *conn,  						DBusMessage *msg, void *data) @@ -369,6 +387,10 @@ static DBusMessage *connection_connect(DBusConnection *conn,  	nc->state = CONNECTING;  	nc->msg = dbus_message_ref(msg); +	nc->watch = g_dbus_add_disconnect_watch(conn, +						dbus_message_get_sender(msg), +						connection_destroy, +						nc, NULL);  	err = bt_l2cap_connect(&peer->src, &peer->dst, BNEP_PSM, BNEP_MTU,  							connect_cb, nc); @@ -388,11 +410,12 @@ static DBusMessage *connection_cancel(DBusConnection *conn,  {  	struct network_conn *nc = data; -	if (nc->state == CONNECTED) { -		bnep_if_down(nc->dev); -		bnep_kill_connection(&nc->peer->dst); -	} else -		close(nc->sk); +	if (nc->watch) { +		g_dbus_remove_watch(conn, nc->watch); +		nc->watch = 0; +	} + +	connection_destroy(conn, data);  	return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);  } | 
