api,manager: new InhibitDevice() method

This new method allows users of the ModemManager API to take full
control of a given device.

Unlike other operations in the API, the inhibition is maintained as
long as the caller exists in the bus, or until the same caller
uninhibits the device.

https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/98
This commit is contained in:
Aleksander Morgado
2019-01-03 21:05:58 +01:00
parent e3766aef5d
commit 2212d3e054
8 changed files with 829 additions and 17 deletions
+53 -1
View File
@@ -56,6 +56,7 @@ static gboolean list_modems_flag;
static gboolean monitor_modems_flag;
static gboolean scan_modems_flag;
static gchar *set_logging_str;
static gchar *inhibit_device_str;
static gchar *report_kernel_event_str;
#if defined WITH_UDEV
@@ -83,6 +84,10 @@ static GOptionEntry entries[] = {
"Request to re-scan looking for modems",
NULL
},
{ "inhibit-device", 'I', 0, G_OPTION_ARG_STRING, &inhibit_device_str,
"Inhibit device given a unique device identifier",
"[UID]"
},
{ "report-kernel-event", 'K', 0, G_OPTION_ARG_STRING, &report_kernel_event_str,
"Report kernel event",
"[\"key=value,...\"]"
@@ -126,6 +131,7 @@ mmcli_manager_options_enabled (void)
monitor_modems_flag +
scan_modems_flag +
!!set_logging_str +
!!inhibit_device_str +
!!report_kernel_event_str);
#if defined WITH_UDEV
@@ -145,7 +151,8 @@ mmcli_manager_options_enabled (void)
exit (EXIT_FAILURE);
}
mmcli_force_async_operation ();
}
} else if (inhibit_device_str)
mmcli_force_async_operation ();
#if defined WITH_UDEV
if (report_kernel_event_auto_scan)
@@ -180,6 +187,41 @@ mmcli_manager_shutdown (void)
context_free (ctx);
}
static void
inhibition_cancelled (GCancellable *cancellable)
{
GError *error = NULL;
if (!mm_manager_uninhibit_device_sync (ctx->manager, inhibit_device_str, NULL, &error)) {
g_printerr ("error: couldn't uninhibit device: '%s'\n",
error ? error->message : "unknown error");
} else
g_print ("successfully uninhibited device with uid '%s'\n", inhibit_device_str);
mmcli_async_operation_done ();
}
static void
inhibit_device_ready (MMManager *manager,
GAsyncResult *result)
{
GError *error = NULL;
if (!mm_manager_inhibit_device_finish (manager, result, &error)) {
g_printerr ("error: couldn't inhibit device: '%s'\n",
error ? error->message : "unknown error");
exit (EXIT_FAILURE);
}
g_print ("successfully inhibited device with uid '%s'\n", inhibit_device_str);
g_print ("type Ctrl+C to abort this program and remove the inhibition\n");
g_cancellable_connect (ctx->cancellable,
G_CALLBACK (inhibition_cancelled),
NULL,
NULL);
}
static void
report_kernel_event_process_reply (gboolean result,
const GError *error)
@@ -463,6 +505,16 @@ get_manager_ready (GObject *source,
return;
}
/* Request to inhibit device? */
if (inhibit_device_str) {
mm_manager_inhibit_device (ctx->manager,
inhibit_device_str,
ctx->cancellable,
(GAsyncReadyCallback)inhibit_device_ready,
NULL);
return;
}
g_warn_if_reached ();
}