dispatcher: refactor building the result

Introduce request_dbus_method_return() and call it whenever we need to
return a result. Don't collect the list of scripts in case the
parameters can't be parsed.
This commit is contained in:
Beniamino Galvani 2023-11-07 11:57:39 +01:00
parent 98b73e88e6
commit 703efdfbbf

View file

@ -280,28 +280,12 @@ next_request(Request *request)
return TRUE; return TRUE;
} }
/**
* complete_request:
* @request: the request
*
* Checks if all the scripts for the request have terminated and in such case
* it sends the D-Bus response and releases the request resources.
*
* It also decreases @num_requests_pending and possibly does _idle_timeout_restart().
*/
static void static void
complete_request(Request *request) request_dbus_method_return(Request *request)
{ {
GVariantBuilder results; GVariantBuilder results;
GVariant *ret;
guint i; guint i;
nm_assert(request);
/* Are there still pending scripts? Then do nothing (for now). */
if (request->num_scripts_done < request->scripts->len)
return;
g_variant_builder_init(&results, G_VARIANT_TYPE("a(sus)")); g_variant_builder_init(&results, G_VARIANT_TYPE("a(sus)"));
for (i = 0; i < request->scripts->len; i++) { for (i = 0; i < request->scripts->len; i++) {
ScriptInfo *script = g_ptr_array_index(request->scripts, i); ScriptInfo *script = g_ptr_array_index(request->scripts, i);
@ -313,8 +297,28 @@ complete_request(Request *request)
script->error ?: ""); script->error ?: "");
} }
ret = g_variant_new("(a(sus))", &results); g_dbus_method_invocation_return_value(request->context, g_variant_new("(a(sus))", &results));
g_dbus_method_invocation_return_value(request->context, ret); }
/**
* complete_request:
* @request: the request
*
* Checks if all the scripts for the request have terminated and in such case
* it sends the D-Bus response and releases the request resources.
*
* It also decreases @num_requests_pending and possibly does _idle_timeout_restart().
*/
static void
complete_request(Request *request)
{
nm_assert(request);
/* Are there still pending scripts? Then do nothing (for now). */
if (request->num_scripts_done < request->scripts->len)
return;
request_dbus_method_return(request);
_LOG_R_T(request, "completed (%u scripts)", request->scripts->len); _LOG_R_T(request, "completed (%u scripts)", request->scripts->len);
@ -785,36 +789,35 @@ _handle_action(GDBusMethodInvocation *invocation, GVariant *parameters)
&request->iface, &request->iface,
&error_message); &error_message);
request->scripts = g_ptr_array_new_full(5, script_info_free); if (!error_message) {
request->scripts = g_ptr_array_new_full(5, script_info_free);
sorted_scripts = find_scripts(request); sorted_scripts = find_scripts(request);
for (iter = sorted_scripts; iter; iter = g_slist_next(iter)) { for (iter = sorted_scripts; iter; iter = g_slist_next(iter)) {
ScriptInfo *s; ScriptInfo *s;
s = g_slice_new0(ScriptInfo); s = g_slice_new0(ScriptInfo);
s->request = request; s->request = request;
s->script = iter->data; s->script = iter->data;
s->wait = script_must_wait(s->script); s->wait = script_must_wait(s->script);
g_ptr_array_add(request->scripts, s); g_ptr_array_add(request->scripts, s);
} }
g_slist_free(sorted_scripts); g_slist_free(sorted_scripts);
_LOG_R_D(request, "new request (%u scripts)", request->scripts->len); _LOG_R_D(request, "new request (%u scripts)", request->scripts->len);
if (_LOG_R_T_enabled(request) && request->envp) { if (_LOG_R_T_enabled(request) && request->envp) {
for (p = request->envp; *p; p++) for (p = request->envp; *p; p++)
_LOG_R_T(request, "environment: %s", *p); _LOG_R_T(request, "environment: %s", *p);
}
} }
if (error_message || request->scripts->len == 0) { if (request->scripts->len == 0) {
GVariant *results;
if (error_message) if (error_message)
_LOG_R_W(request, "completed: invalid request: %s", error_message); _LOG_R_W(request, "completed: invalid request: %s", error_message);
else else
_LOG_R_D(request, "completed: no scripts"); _LOG_R_D(request, "completed: no scripts");
results = g_variant_new_array(G_VARIANT_TYPE("(sus)"), NULL, 0); request_dbus_method_return(request);
g_dbus_method_invocation_return_value(invocation, g_variant_new("(@a(sus))", results));
request->num_scripts_done = request->scripts->len; request->num_scripts_done = request->scripts->len;
request_free(request); request_free(request);
return; return;