From cc0f97ec2cb298bde87cd3753fd96f11ce41ff64 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Thu, 29 May 2008 14:43:27 +0000 Subject: Change name_listener API to libgdbus watch API --- daemon/database.c | 8 +++--- gdbus/gdbus.h | 16 +++++------ gdbus/watch.c | 63 +++++++++---------------------------------- hcid/adapter.c | 49 ++++++++++++++++----------------- hcid/agent.c | 11 ++++---- hcid/dbus-database.c | 14 +++++----- hcid/dbus-hci.c | 22 ++++++++------- hcid/dbus-security.c | 76 ++++++++++++++++++++-------------------------------- hcid/dbus-test.c | 21 ++++++++------- serial/manager.c | 40 +++++++++++---------------- serial/port.c | 17 ++++++------ 11 files changed, 141 insertions(+), 196 deletions(-) diff --git a/daemon/database.c b/daemon/database.c index 47e21915..be6ca28c 100644 --- a/daemon/database.c +++ b/daemon/database.c @@ -69,7 +69,7 @@ static struct record_data *find_record(uint32_t handle, const char *sender) return NULL; } -static void exit_callback(const char *name, void *user_data) +static void exit_callback(void *user_data) { struct record_data *user_record = user_data; @@ -145,9 +145,9 @@ static DBusHandlerResult add_service_record_from_xml(DBusConnection *conn, records = g_slist_append(records, user_record); - user_record->listener_id = name_listener_add(conn, sender, + user_record->listener_id = g_dbus_add_disconnect_watch(conn, sender, exit_callback, - user_record); + user_record, NULL); reply = dbus_message_new_method_return(msg); if (!reply) @@ -176,7 +176,7 @@ static DBusHandlerResult remove_service_record(DBusConnection *conn, if (!user_record) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - name_listener_id_remove(user_record->listener_id); + g_dbus_remove_watch(conn, user_record->listener_id); remove_record_from_server(handle); diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h index 6f3ddb79..22c10569 100644 --- a/gdbus/gdbus.h +++ b/gdbus/gdbus.h @@ -185,14 +185,14 @@ gboolean g_dbus_send_reply(DBusConnection *connection, gboolean g_dbus_send_reply_valist(DBusConnection *connection, DBusMessage *message, int type, va_list args); -typedef void (*name_cb_t)(const char *name, void *user_data); - -guint name_listener_add(DBusConnection *connection, const char *name, - name_cb_t func, void *user_data); -int name_listener_remove(DBusConnection *connection, const char *name, - name_cb_t func, void *user_data); -gboolean name_listener_id_remove(guint id); -int name_listener_indicate_disconnect(DBusConnection *connection); +typedef void (* GDBusWatchFunction) (void *user_data); + +guint g_dbus_add_disconnect_watch(DBusConnection *connection, + const char *name, + GDBusWatchFunction function, + void *user_data, GDBusDestroyFunction destroy); +gboolean g_dbus_remove_watch(DBusConnection *connection, guint tag); +void g_dbus_remove_all_watches(DBusConnection *connection); #ifdef __cplusplus } diff --git a/gdbus/watch.c b/gdbus/watch.c index 80be3a6a..3c7a03a4 100644 --- a/gdbus/watch.c +++ b/gdbus/watch.c @@ -41,7 +41,7 @@ static guint listener_id = 0; static GSList *name_listeners = NULL; struct name_callback { - name_cb_t func; + GDBusWatchFunction func; void *user_data; guint id; }; @@ -74,7 +74,7 @@ static struct name_data *name_data_find(DBusConnection *connection, } static struct name_callback *name_callback_find(GSList *callbacks, - name_cb_t func, void *user_data) + GDBusWatchFunction func, void *user_data) { GSList *current; @@ -94,7 +94,7 @@ static void name_data_call_and_free(struct name_data *data) for (l = data->callbacks; l != NULL; l = l->next) { struct name_callback *cb = l->data; if (cb->func) - cb->func(data->name, cb->user_data); + cb->func(cb->user_data); g_free(cb); } @@ -116,7 +116,7 @@ static void name_data_free(struct name_data *data) } static int name_data_add(DBusConnection *connection, const char *name, - name_cb_t func, void *user_data, guint id) + GDBusWatchFunction func, void *user_data, guint id) { int first = 1; struct name_data *data = NULL; @@ -147,7 +147,7 @@ done: } static void name_data_remove(DBusConnection *connection, - const char *name, name_cb_t func, void *user_data) + const char *name, GDBusWatchFunction func, void *user_data) { struct name_data *data; struct name_callback *cb = NULL; @@ -246,7 +246,7 @@ static DBusHandlerResult name_exit_filter(DBusConnection *connection, for (l = data->callbacks; l != NULL; l = l->next) { struct name_callback *cb = l->data; - cb->func(name, cb->user_data); + cb->func(cb->user_data); } name_listeners = g_slist_remove(name_listeners, data); @@ -257,8 +257,10 @@ static DBusHandlerResult name_exit_filter(DBusConnection *connection, return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } -guint name_listener_add(DBusConnection *connection, const char *name, - name_cb_t func, void *user_data) +guint g_dbus_add_disconnect_watch(DBusConnection *connection, + const char *name, + GDBusWatchFunction func, + void *user_data, GDBusDestroyFunction destroy) { int first; @@ -289,44 +291,7 @@ guint name_listener_add(DBusConnection *connection, const char *name, return listener_id; } -int name_listener_remove(DBusConnection *connection, const char *name, - name_cb_t func, void *user_data) -{ - struct name_data *data; - struct name_callback *cb; - - data = name_data_find(connection, name); - if (!data) { - error("remove_name_listener: no listener for %s", name); - return -1; - } - - cb = name_callback_find(data->callbacks, func, user_data); - if (!cb) { - error("No matching callback found for %s", name); - return -1; - } - - data->callbacks = g_slist_remove(data->callbacks, cb); - g_free(cb); - - /* Don't remove the filter if other callbacks exist */ - if (data->callbacks) - return 0; - - if (name) { - debug("name_listener_remove(%s)", name); - - if (!remove_match(connection, name)) - return -1; - } - - name_data_remove(connection, name, func, user_data); - - return 0; -} - -gboolean name_listener_id_remove(guint id) +gboolean g_dbus_remove_watch(DBusConnection *connection, guint id) { struct name_data *data; struct name_callback *cb; @@ -362,19 +327,17 @@ remove: return TRUE; } -int name_listener_indicate_disconnect(DBusConnection *connection) +void g_dbus_remove_all_watches(DBusConnection *connection) { struct name_data *data; data = name_data_find(connection, NULL); if (!data) { error("name_listener_indicate_disconnect: no listener found"); - return -1; + return; } debug("name_listener_indicate_disconnect"); name_data_call_and_free(data); - - return 0; } diff --git a/hcid/adapter.c b/hcid/adapter.c index 81e9ac4c..3c731745 100644 --- a/hcid/adapter.c +++ b/hcid/adapter.c @@ -725,10 +725,10 @@ static void confirm_mode_cb(struct agent *agent, DBusError *err, void *data) return; cleanup: - dbus_connection_unref(req->conn); dbus_message_unref(req->msg); if (req->id) - name_listener_id_remove(req->id); + g_dbus_remove_watch(req->conn, req->id); + dbus_connection_unref(req->conn); g_free(req); } @@ -2576,15 +2576,15 @@ failed: remove_pending_device(adapter); cleanup: - name_listener_id_remove(adapter->bonding->listener_id); - + g_dbus_remove_watch(adapter->bonding->conn, + adapter->bonding->listener_id); bonding_request_free(adapter->bonding); adapter->bonding = NULL; return FALSE; } -static void create_bond_req_exit(const char *name, void *user_data) +static void create_bond_req_exit(void *user_data) { struct adapter *adapter = user_data; char path[MAX_PATH_LENGTH]; @@ -2592,8 +2592,7 @@ static void create_bond_req_exit(const char *name, void *user_data) snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, adapter->dev_id); - debug("CreateConnection requestor (%s) exited before bonding was completed", - name); + debug("CreateConnection requestor exited before bonding was completed"); cancel_passkey_agent_requests(adapter->passkey_agents, path, &adapter->bonding->bdaddr); @@ -2680,9 +2679,10 @@ static DBusHandlerResult create_bonding(DBusConnection *conn, DBusMessage *msg, (GIOFunc) create_bonding_conn_complete, adapter); - bonding->listener_id = name_listener_add(conn, - dbus_message_get_sender(msg), - create_bond_req_exit, adapter); + bonding->listener_id = g_dbus_add_disconnect_watch(conn, + dbus_message_get_sender(msg), + create_bond_req_exit, adapter, + NULL); adapter->bonding = bonding; @@ -2940,11 +2940,11 @@ static DBusHandlerResult adapter_get_encryption_key_size(DBusConnection *conn, return send_message_and_unref(conn, reply); } -static void periodic_discover_req_exit(const char *name, void *user_data) +static void periodic_discover_req_exit(void *user_data) { struct adapter *adapter = user_data; - debug("PeriodicDiscovery requestor (%s) exited", name); + debug("PeriodicDiscovery requestor exited"); /* Cleanup the discovered devices list and send the cmd to exit from * periodic inquiry or cancel remote name request. The return value can @@ -3027,10 +3027,10 @@ static DBusHandlerResult adapter_start_periodic(DBusConnection *conn, /* track the request owner to cancel it automatically if the owner * exits */ - adapter->pdiscov_listener = name_listener_add(conn, + adapter->pdiscov_listener = g_dbus_add_disconnect_watch(conn, dbus_message_get_sender(msg), periodic_discover_req_exit, - adapter); + adapter, NULL); return send_message_and_unref(conn, reply); } @@ -3141,11 +3141,11 @@ static DBusHandlerResult adapter_get_pdiscov_resolve(DBusConnection *conn, return send_message_and_unref(conn, reply); } -static void discover_devices_req_exit(const char *name, void *user_data) +static void discover_devices_req_exit(void *user_data) { struct adapter *adapter = user_data; - debug("DiscoverDevices requestor (%s) exited", name); + debug("DiscoverDevices requestor exited"); /* Cleanup the discovered devices list and send the command to cancel * inquiry or cancel remote name request. The return can be ignored. */ @@ -3225,10 +3225,10 @@ static DBusHandlerResult adapter_discover_devices(DBusConnection *conn, /* track the request owner to cancel it automatically if the owner * exits */ - adapter->discov_listener = name_listener_add(conn, + adapter->discov_listener = g_dbus_add_disconnect_watch(conn, dbus_message_get_sender(msg), discover_devices_req_exit, - adapter); + adapter, NULL); return send_message_and_unref(conn, reply); } @@ -3718,7 +3718,7 @@ static DBusHandlerResult set_property(DBusConnection *conn, return error_invalid_arguments(conn, msg, NULL); } -static void session_exit(const char *name, void *data) +static void session_exit(void *data) { struct mode_req *req = data; struct adapter *adapter = req->adapter; @@ -3766,8 +3766,9 @@ static DBusHandlerResult request_mode(DBusConnection *conn, req->conn = dbus_connection_ref(conn); req->msg = dbus_message_ref(msg); req->mode = new_mode; - req->id = name_listener_add(conn, dbus_message_get_sender(msg), - session_exit, req); + req->id = g_dbus_add_disconnect_watch(conn, + dbus_message_get_sender(msg), + session_exit, req, NULL); if (!adapter->sessions) adapter->global_mode = adapter->mode; @@ -3785,9 +3786,9 @@ static DBusHandlerResult request_mode(DBusConnection *conn, ret = agent_confirm_mode_change(adapter->agent, mode, confirm_mode_cb, req); if (ret < 0) { - dbus_connection_unref(req->conn); dbus_message_unref(req->msg); - name_listener_id_remove(req->id); + g_dbus_remove_watch(req->conn, req->id); + dbus_connection_unref(req->conn); g_free(req); return error_invalid_arguments(conn, msg, NULL); } @@ -3807,7 +3808,7 @@ static DBusHandlerResult release_mode(DBusConnection *conn, if (!l) return error_failed(conn, msg, "No Mode to release"); - session_exit(dbus_message_get_sender(msg), l->data); + session_exit(l->data); reply = dbus_message_new_method_return(msg); if (!reply) diff --git a/hcid/agent.c b/hcid/agent.c index 831f68b2..b2fbe03c 100644 --- a/hcid/agent.c +++ b/hcid/agent.c @@ -126,11 +126,11 @@ static void agent_request_free(struct agent_request *req) g_free(req); } -static void agent_exited(const char *name, void *user_data) +static void agent_exited(void *user_data) { struct agent *agent = user_data; - debug("Agent %s exited without calling Unregister", name); + debug("Agent exited without calling Unregister"); agent_destroy(agent, TRUE); } @@ -172,7 +172,7 @@ static void agent_free(struct agent *agent) g_source_remove(agent->timeout); if (!agent->exited) { - name_listener_id_remove(agent->listener_id); + g_dbus_remove_watch(connection, agent->listener_id); agent_release(agent); } @@ -217,8 +217,9 @@ struct agent *agent_create(struct adapter *adapter, const char *name, (GSourceFunc) agent_timeout, agent); } - agent->listener_id = name_listener_add(connection, name, agent_exited, - agent); + agent->listener_id = g_dbus_add_disconnect_watch(connection, name, + agent_exited, agent, + NULL); return agent; } diff --git a/hcid/dbus-database.c b/hcid/dbus-database.c index cf2369b1..41702d9b 100644 --- a/hcid/dbus-database.c +++ b/hcid/dbus-database.c @@ -74,7 +74,7 @@ static struct record_data *find_record(uint32_t handle, const char *sender) return NULL; } -static void exit_callback(const char *name, void *user_data) +static void exit_callback(void *user_data) { struct record_data *user_record = user_data; @@ -134,9 +134,10 @@ static DBusHandlerResult add_service_record(DBusConnection *conn, records = g_slist_append(records, user_record); - user_record->listener_id = name_listener_add(conn, sender, - exit_callback, - user_record); + user_record->listener_id = g_dbus_add_disconnect_watch(conn, sender, + exit_callback, + user_record, + NULL); reply = dbus_message_new_method_return(msg); if (!reply) @@ -174,7 +175,8 @@ int add_xml_record(DBusConnection *conn, const char *sender, bdaddr_t *src, records = g_slist_append(records, user_record); - name_listener_add(conn, sender, exit_callback, user_record); + g_dbus_add_disconnect_watch(conn, sender, exit_callback, user_record, + NULL); *handle = user_record->handle; @@ -317,7 +319,7 @@ int remove_record(DBusConnection *conn, const char *sender, if (!user_record) return -1; - name_listener_id_remove(user_record->listener_id); + g_dbus_remove_watch(conn, user_record->listener_id); records = g_slist_remove(records, user_record); diff --git a/hcid/dbus-hci.c b/hcid/dbus-hci.c index c8d01f7f..fec4d3bb 100644 --- a/hcid/dbus-hci.c +++ b/hcid/dbus-hci.c @@ -334,7 +334,8 @@ static void reply_pending_requests(const char *path, struct adapter *adapter) remove_pending_device(adapter); - name_listener_id_remove(adapter->bonding->listener_id); + g_dbus_remove_watch(adapter->bonding->conn, + adapter->bonding->listener_id); if (adapter->bonding->io_id) g_source_remove(adapter->bonding->io_id); @@ -416,14 +417,14 @@ int unregister_adapter_path(const char *path) } if (adapter->discov_requestor) { - name_listener_id_remove(adapter->discov_listener); + g_dbus_remove_watch(connection, adapter->discov_listener); adapter->discov_listener = 0; g_free(adapter->discov_requestor); adapter->discov_requestor = NULL; } if (adapter->pdiscov_requestor) { - name_listener_id_remove(adapter->pdiscov_listener); + g_dbus_remove_watch(connection, adapter->pdiscov_listener); adapter->pdiscov_listener = 0; g_free(adapter->pdiscov_requestor); adapter->pdiscov_requestor = NULL; @@ -830,14 +831,14 @@ int hcid_dbus_stop_device(uint16_t id) release_passkey_agents(adapter, NULL); if (adapter->discov_requestor) { - name_listener_id_remove(adapter->discov_listener); + g_dbus_remove_watch(connection, adapter->discov_listener); adapter->discov_listener = 0; g_free(adapter->discov_requestor); adapter->discov_requestor = NULL; } if (adapter->pdiscov_requestor) { - name_listener_id_remove(adapter->pdiscov_listener); + g_dbus_remove_watch(connection, adapter->pdiscov_listener); adapter->pdiscov_listener = 0; g_free(adapter->pdiscov_requestor); adapter->pdiscov_requestor = NULL; @@ -1136,7 +1137,7 @@ proceed: } cleanup: - name_listener_id_remove(adapter->bonding->listener_id); + g_dbus_remove_watch(connection, adapter->bonding->listener_id); if (adapter->bonding->io_id) g_source_remove(adapter->bonding->io_id); @@ -1408,7 +1409,7 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local) adapter->found_devices = NULL; if (adapter->discov_requestor) { - name_listener_id_remove(adapter->discov_listener); + g_dbus_remove_watch(connection, adapter->discov_listener); adapter->discov_listener = 0; g_free(adapter->discov_requestor); adapter->discov_requestor = NULL; @@ -1516,7 +1517,7 @@ void hcid_dbus_periodic_inquiry_exit(bdaddr_t *local, uint8_t status) adapter->oor_devices = NULL; if (adapter->pdiscov_requestor) { - name_listener_id_remove(adapter->pdiscov_listener); + g_dbus_remove_watch(connection, adapter->pdiscov_listener); adapter->pdiscov_listener = 0; g_free(adapter->pdiscov_requestor); adapter->pdiscov_requestor = NULL; @@ -1848,7 +1849,7 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, /* The discovery completed signal must be sent only for discover * devices request WITH name resolving */ if (adapter->discov_requestor) { - name_listener_id_remove(adapter->discov_listener); + g_dbus_remove_watch(connection, adapter->discov_listener); adapter->discov_listener = 0; g_free(adapter->discov_requestor); adapter->discov_requestor = NULL; @@ -2022,7 +2023,8 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status, send_message_and_unref(connection, reply); } - name_listener_id_remove(adapter->bonding->listener_id); + g_dbus_remove_watch(adapter->bonding->conn, + adapter->bonding->listener_id); if (adapter->bonding->io_id) g_source_remove(adapter->bonding->io_id); diff --git a/hcid/dbus-security.c b/hcid/dbus-security.c index 11de85c6..b6f15ebc 100644 --- a/hcid/dbus-security.c +++ b/hcid/dbus-security.c @@ -136,26 +136,17 @@ static void passkey_agent_free(struct passkey_agent *agent) g_free(agent); } -static void agent_exited(const char *name, void *user_data) +static void agent_exited(void *user_data) { - struct adapter *adapter = user_data; - GSList *cur, *next; - - debug("Passkey agent %s exited without calling Unregister", name); - - for (cur = adapter->passkey_agents; cur != NULL; cur = next) { - struct passkey_agent *agent = cur->data; - - next = cur->next; + struct passkey_agent *agent = user_data; + struct adapter *adapter = agent->adapter; - if (strcmp(agent->name, name)) - continue; + debug("Passkey agent exited without calling Unregister"); - agent->exited = 1; + agent->exited = 1; - adapter->passkey_agents = g_slist_remove(adapter->passkey_agents, agent); - passkey_agent_free(agent); - } + adapter->passkey_agents = g_slist_remove(adapter->passkey_agents, agent); + passkey_agent_free(agent); } static gboolean agent_timeout(struct passkey_agent *agent) @@ -174,15 +165,10 @@ static gboolean agent_timeout(struct passkey_agent *agent) return FALSE; } -static void default_agent_exited(const char *name, void *data) +static void default_agent_exited(void *data) { - debug("%s exited without unregistering the default passkey agent", name); - - if (!default_agent || strcmp(name, default_agent->name)) { - /* This should never happen (there's a bug in the code if it does) */ - debug("default_agent_exited: mismatch with actual default_agent"); - return; - } + debug("D-Bus client exited without unregistering the" + " default passkey agent"); default_agent->exited = 1; @@ -289,9 +275,11 @@ static DBusHandlerResult register_passkey_agent(DBusConnection *conn, /* Only add a name listener if there isn't one already for this name */ ref.addr = NULL; ref.path = NULL; - if (!g_slist_find_custom(adapter->passkey_agents, &ref, (GCompareFunc) agent_cmp)) - agent->listener_id = name_listener_add(conn, ref.name, - agent_exited, adapter); + if (!g_slist_find_custom(adapter->passkey_agents, &ref, + (GCompareFunc) agent_cmp)) + agent->listener_id = g_dbus_add_disconnect_watch(conn, ref.name, + agent_exited, agent, + NULL); agent->timeout = g_timeout_add(AGENT_TIMEOUT, (GSourceFunc)agent_timeout, agent); @@ -334,7 +322,7 @@ static DBusHandlerResult unregister_passkey_agent(DBusConnection *conn, agent = match->data; - name_listener_id_remove(agent->listener_id); + g_dbus_remove_watch(agent->conn, agent->listener_id); adapter->passkey_agents = g_slist_remove(adapter->passkey_agents, agent); agent->exited = 1; @@ -370,8 +358,8 @@ static DBusHandlerResult register_default_passkey_agent(DBusConnection *conn, if (!reply) goto need_memory; - name_listener_add(conn, default_agent->name, - (name_cb_t) default_agent_exited, NULL); + g_dbus_add_disconnect_watch(conn, default_agent->name, + default_agent_exited, NULL, NULL); info("Default passkey agent (%s, %s) registered", default_agent->name, default_agent->path); @@ -411,7 +399,7 @@ static DBusHandlerResult unregister_default_passkey_agent(DBusConnection *conn, if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; - name_listener_id_remove(default_agent->listener_id); + g_dbus_remove_watch(default_agent->conn, default_agent->listener_id); info("Default passkey agent (%s, %s) unregistered", default_agent->name, default_agent->path); @@ -522,17 +510,10 @@ static struct authorization_agent *auth_agent_new(DBusConnection *conn, return agent; } -static void default_auth_agent_exited(const char *name, void *data) +static void default_auth_agent_exited(void *data) { - debug("%s exited without unregistering the " - "default authorization agent", name); - - if (!default_auth_agent || strcmp(name, default_auth_agent->name)) { - /* This should never happen! */ - debug("default_auth_agent_exited: mismatch with " - "actual default_auth_agent"); - return; - } + debug("D-Bus client exited without unregistering the " + "default authorization agent"); auth_agent_cancel_requests(default_auth_agent); auth_agent_free(default_auth_agent); @@ -557,7 +538,7 @@ static void auth_agent_release(struct authorization_agent *agent) send_message_and_unref(agent->conn, message); if (agent == default_auth_agent) - name_listener_id_remove(agent->listener_id); + g_dbus_remove_watch(agent->conn, agent->listener_id); } static DBusHandlerResult register_default_auth_agent(DBusConnection *conn, @@ -584,8 +565,8 @@ static DBusHandlerResult register_default_auth_agent(DBusConnection *conn, if (!reply) goto need_memory; - name_listener_add(conn, default_auth_agent->name, - (name_cb_t) default_auth_agent_exited, NULL); + g_dbus_add_disconnect_watch(conn, default_auth_agent->name, + default_auth_agent_exited, NULL, NULL); info("Default authorization agent (%s, %s) registered", default_auth_agent->name, default_auth_agent->path); @@ -626,7 +607,8 @@ static DBusHandlerResult unregister_default_auth_agent(DBusConnection *conn, if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; - name_listener_id_remove(default_auth_agent->listener_id); + g_dbus_remove_watch(default_auth_agent->conn, + default_auth_agent->listener_id); info("Default authorization agent (%s, %s) unregistered", default_auth_agent->name, default_auth_agent->path); @@ -1280,7 +1262,7 @@ static void release_agent(struct passkey_agent *agent) send_message_and_unref(agent->conn, message); if (agent == default_agent) - name_listener_id_remove(agent->listener_id); + g_dbus_remove_watch(agent->conn, agent->listener_id); else { struct passkey_agent ref; @@ -1290,7 +1272,7 @@ static void release_agent(struct passkey_agent *agent) ref.name = agent->name; if (!g_slist_find_custom(agent->adapter->passkey_agents, &ref, (GCompareFunc) agent_cmp)) - name_listener_id_remove(agent->listener_id); + g_dbus_remove_watch(agent->conn, agent->listener_id); } } diff --git a/hcid/dbus-test.c b/hcid/dbus-test.c index 23876c07..87d106a3 100644 --- a/hcid/dbus-test.c +++ b/hcid/dbus-test.c @@ -129,11 +129,11 @@ static void send_audit_status(struct audit *audit, const char *name) DBUS_TYPE_INVALID); } -static void audit_requestor_exited(const char *name, void *user_data) +static void audit_requestor_exited(void *user_data) { struct audit *audit = user_data; - debug("AuditRemoteDevice requestor %s exited", name); + debug("AuditRemoteDevice requestor exited"); audits = g_slist_remove(audits, audit); if (audit->io) { @@ -183,7 +183,7 @@ static gboolean l2raw_input_timer(struct audit *audit) g_io_channel_close(audit->io); audits = g_slist_remove(audits, audit); - name_listener_id_remove(audit->listener_id); + g_dbus_remove_watch(audit->conn, audit->listener_id); audit_free(audit); return FALSE; @@ -327,7 +327,7 @@ failed: g_io_channel_close(io); g_io_channel_unref(io); audits = g_slist_remove(audits, audit); - name_listener_id_remove(audit->listener_id); + g_dbus_remove_watch(audit->conn, audit->listener_id); process_audits_list(audit->adapter_path); @@ -402,7 +402,7 @@ failed: g_io_channel_close(io); g_io_channel_unref(io); audits = g_slist_remove(audits, audit); - name_listener_id_remove(audit->listener_id); + g_dbus_remove_watch(audit->conn, audit->listener_id); audit_free(audit); return FALSE; @@ -483,9 +483,10 @@ static DBusHandlerResult audit_remote_device(DBusConnection *conn, (GIOFunc) l2raw_connect_complete, audit); } - audit->listener_id = name_listener_add(conn, + audit->listener_id = g_dbus_add_disconnect_watch(conn, dbus_message_get_sender(msg), - audit_requestor_exited, audit); + audit_requestor_exited, audit, + NULL); audits = g_slist_append(audits, audit); @@ -541,7 +542,7 @@ static DBusHandlerResult cancel_audit_remote_device(DBusConnection *conn, g_source_remove(audit->timeout); audits = g_slist_remove(audits, audit); - name_listener_id_remove(audit->listener_id); + g_dbus_remove_watch(audit->conn, audit->listener_id); audit_free(audit); reply = dbus_message_new_method_return(msg); @@ -684,7 +685,7 @@ void process_audits_list(const char *adapter_path) if (!adapter) { audits = g_slist_remove(audits, audit); - name_listener_id_remove(audit->listener_id); + g_dbus_remove_watch(audit->conn, audit->listener_id); audit_free(audit); continue; } @@ -697,7 +698,7 @@ void process_audits_list(const char *adapter_path) if (sk < 0) { send_audit_status(audit, "AuditRemoteDeviceFailed"); audits = g_slist_remove(audits, audit); - name_listener_id_remove(audit->listener_id); + g_dbus_remove_watch(audit->conn, audit->listener_id); audit_free(audit); continue; } diff --git a/serial/manager.c b/serial/manager.c index 095abf6b..3d5b6e88 100644 --- a/serial/manager.c +++ b/serial/manager.c @@ -79,6 +79,7 @@ struct pending_connect { int id; /* RFCOMM device id */ int ntries; /* Open attempts */ int canceled; /* Operation canceled */ + guint listener_id; }; /* FIXME: Common file required */ @@ -189,35 +190,23 @@ static struct pending_connect *find_pending_connect_by_pattern(const char *bda, return NULL; } -static void transaction_owner_exited(const char *name, void *data) +static void transaction_owner_exited(void *data) { - GSList *l, *tmp = NULL; - debug("transaction owner %s exited", name); + struct pending_connect *pc = data; - /* Remove all pending calls that belongs to this owner */ - for (l = pending_connects; l != NULL; l = l->next) { - struct pending_connect *pc = l->data; - if (strcmp(name, dbus_message_get_sender(pc->msg)) != 0) { - tmp = g_slist_append(tmp, pc); - continue; - } + debug("transaction owner exited"); - if (pc->id >= 0) - rfcomm_release(pc->id); + if (pc->id >= 0) + rfcomm_release(pc->id); - pending_connect_free(pc); - } + pending_connects = g_slist_remove(pending_connects, pc); - g_slist_free(pending_connects); - pending_connects = tmp; + pending_connect_free(pc); } static void pending_connect_remove(struct pending_connect *pc) { - /* Remove the connection request owner */ - name_listener_remove(pc->conn, dbus_message_get_sender(pc->msg), - (name_cb_t) transaction_owner_exited, NULL); - + g_dbus_remove_watch(pc->conn, pc->listener_id); pending_connects = g_slist_remove(pending_connects, pc); pending_connect_free(pc); } @@ -463,8 +452,10 @@ static DBusHandlerResult connect_pending(DBusConnection *conn, DBusMessage *msg, if (!g_slist_find(pending_connects, pc)) { pending_connects = g_slist_append(pending_connects, pc); - name_listener_add(conn, dbus_message_get_sender(msg), - (name_cb_t) transaction_owner_exited, NULL); + pc->listener_id = g_dbus_add_disconnect_watch(conn, + dbus_message_get_sender(msg), + transaction_owner_exited, pc, + NULL); } str2ba(pc->adapter, &src); @@ -634,8 +625,9 @@ static DBusHandlerResult search_uuid(DBusConnection *conn, DBusMessage *msg, } pending_connects = g_slist_append(pending_connects, pc); - name_listener_add(conn, dbus_message_get_sender(msg), - (name_cb_t) transaction_owner_exited, NULL); + pc->listener_id = g_dbus_add_disconnect_watch(conn, + dbus_message_get_sender(msg), + transaction_owner_exited, pc, NULL); return DBUS_HANDLER_RESULT_HANDLED; } diff --git a/serial/port.c b/serial/port.c index 0e2ad200..bacf093c 100644 --- a/serial/port.c +++ b/serial/port.c @@ -244,12 +244,12 @@ static void rfcomm_node_free(struct rfcomm_node *node) g_free(node); } -static void connection_owner_exited(const char *name, void *user_data) +static void connection_owner_exited(void *user_data) { struct rfcomm_node *node = user_data; - debug("Connect requestor %s exited. Releasing %s node", - name, node->device); + debug("Connect requestor exited. Releasing %s node", + node->device); dbus_connection_emit_signal(node->conn, SERIAL_MANAGER_PATH, SERIAL_MANAGER_INTERFACE, "ServiceDisconnected" , @@ -265,7 +265,7 @@ static gboolean rfcomm_disconnect_cb(GIOChannel *io, { debug("RFCOMM node %s was disconnected", node->device); - name_listener_id_remove(node->listener_id); + g_dbus_remove_watch(node->conn, node->listener_id); dbus_connection_emit_signal(node->conn, SERIAL_MANAGER_PATH, SERIAL_MANAGER_INTERFACE, "ServiceDisconnected" , @@ -299,15 +299,16 @@ void port_add_listener(DBusConnection *conn, int16_t id, bdaddr_t *dst, node->device = g_strdup(dev); node->conn = dbus_connection_ref(conn); node->owner = g_strdup(owner); - node->io = g_io_channel_unix_new(fd); + node->io = g_io_channel_unix_new(fd); node->io_id = g_io_add_watch(node->io, G_IO_ERR | G_IO_NVAL | G_IO_HUP, (GIOFunc) rfcomm_disconnect_cb, node); connected_nodes = g_slist_append(connected_nodes, node); /* Service connection listener */ - node->listener_id = name_listener_add(conn, owner, - connection_owner_exited, node); + node->listener_id = g_dbus_add_disconnect_watch(conn, owner, + connection_owner_exited, node, + NULL); } int port_remove_listener(const char *owner, const char *dev) @@ -320,7 +321,7 @@ int port_remove_listener(const char *owner, const char *dev) if (strcmp(node->owner, owner) != 0) return -EPERM; - name_listener_id_remove(node->listener_id); + g_dbus_remove_watch(node->conn, node->listener_id); connected_nodes = g_slist_remove(connected_nodes, node); rfcomm_node_free(node); -- cgit