diff --git a/src/agent.c b/src/agent.c index 4593d5a6..ee3969df 100644 --- a/src/agent.c +++ b/src/agent.c @@ -39,6 +39,7 @@ struct agent_request { void *user_data; void *user_callback; struct l_dbus_message *trigger; + agent_request_destroy_func_t destroy; }; struct agent { @@ -130,6 +131,9 @@ static void agent_request_free(void *user_data) dbus_pending_reply(&request->trigger, dbus_error_aborted(request->trigger)); + if (request->destroy) + request->destroy(request->user_data); + l_free(request); } @@ -254,7 +258,8 @@ static unsigned int agent_queue_request(struct agent *agent, struct l_dbus_message *message, int timeout, void *callback, struct l_dbus_message *trigger, - void *user_data) + void *user_data, + agent_request_destroy_func_t destroy) { struct agent_request *request; @@ -265,6 +270,7 @@ static unsigned int agent_queue_request(struct agent *agent, request->user_data = user_data; request->user_callback = callback; request->trigger = l_dbus_message_ref(trigger); + request->destroy = destroy; agent->timeout_secs = timeout; @@ -311,6 +317,7 @@ static struct agent *get_agent(const char *owner) * @callback: user callback called when the request is ready * @trigger: Message associated with (e.g. that triggered) this request * @user_data: user defined data + * @destroy: callback to release @user_data when this request finishes * * Called when a passphrase information is needed from the user. Returns an * id that can be used to cancel the request. @@ -324,7 +331,8 @@ static struct agent *get_agent(const char *owner) unsigned int agent_request_passphrase(const char *path, agent_request_passphrase_func_t callback, struct l_dbus_message *trigger, - void *user_data) + void *user_data, + agent_request_destroy_func_t destroy) { struct agent *agent = get_agent(l_dbus_message_get_sender(trigger)); struct l_dbus_message *message; @@ -344,7 +352,7 @@ unsigned int agent_request_passphrase(const char *path, return agent_queue_request(agent, message, agent_timeout_input_request(), - callback, trigger, user_data); + callback, trigger, user_data, destroy); } static bool find_request(const void *a, const void *b) diff --git a/src/agent.h b/src/agent.h index 09e3fef2..51869479 100644 --- a/src/agent.h +++ b/src/agent.h @@ -31,6 +31,7 @@ typedef void (*agent_request_passphrase_func_t) (enum agent_result result, const char *passphrase, struct l_dbus_message *message, void *user_data); +typedef void (*agent_request_destroy_func_t)(void *user_data); bool agent_init(struct l_dbus *dbus); bool agent_exit(struct l_dbus *dbus); @@ -39,5 +40,6 @@ void agent_shutdown(void); unsigned int agent_request_passphrase(const char *path, agent_request_passphrase_func_t callback, struct l_dbus_message *message, - void *user_data); + void *user_data, + agent_request_destroy_func_t destroy); bool agent_request_cancel(unsigned int req_id, int reason); diff --git a/src/network.c b/src/network.c index f3bab3ca..dfd3949a 100644 --- a/src/network.c +++ b/src/network.c @@ -602,8 +602,7 @@ static struct l_dbus_message *network_connect_psk(struct network *network, network->agent_request = agent_request_passphrase(network->object_path, passphrase_callback, - message, - network); + message, network, NULL); if (!network->agent_request) return dbus_error_no_agent(message);