agent: Add a destroy function parameter for agent requests

This commit is contained in:
Andrew Zaborowski 2017-08-18 00:20:39 +02:00 committed by Denis Kenzior
parent 452e174802
commit 07b04e180f
3 changed files with 15 additions and 6 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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);