diff --git a/cli/mmcli-modem.c b/cli/mmcli-modem.c
index 73deafb3..541e9069 100644
--- a/cli/mmcli-modem.c
+++ b/cli/mmcli-modem.c
@@ -51,6 +51,8 @@ static gboolean enable_flag;
static gboolean disable_flag;
static gboolean reset_flag;
static gchar *factory_reset_str;
+static gchar *command_str;
+static gint command_timeout;
static gboolean list_bearers_flag;
static gchar *create_bearer_str;
static gchar *delete_bearer_str;
@@ -79,6 +81,14 @@ static GOptionEntry entries[] = {
"Reset a given modem to its factory state",
"[CODE]"
},
+ { "command", 0, 0, G_OPTION_ARG_STRING, &command_str,
+ "Send an AT command to the modem",
+ "[COMMAND]"
+ },
+ { "command-timeout", 0, 0, G_OPTION_ARG_INT, &command_timeout,
+ "Timeout for AT command",
+ "[SECONDS]"
+ },
{ "list-bearers", 0, 0, G_OPTION_ARG_NONE, &list_bearers_flag,
"List packet data bearers available in a given modem",
NULL
@@ -139,6 +149,7 @@ mmcli_modem_options_enabled (void)
!!create_bearer_str +
!!delete_bearer_str +
!!factory_reset_str +
+ !!command_str +
!!set_allowed_modes_str +
!!set_preferred_mode_str +
!!set_allowed_bands_str);
@@ -542,6 +553,35 @@ factory_reset_ready (MMModem *modem,
mmcli_async_operation_done ();
}
+
+static void
+command_process_reply (gchar *result,
+ const GError *error)
+{
+ if (!result) {
+ g_printerr ("error: command failed: '%s'\n",
+ error ? error->message : "unknown error");
+ exit (EXIT_FAILURE);
+ }
+
+ g_print ("response: '%s'\n", result);
+ g_free (result);
+}
+
+static void
+command_ready (MMModem *modem,
+ GAsyncResult *result,
+ gpointer nothing)
+{
+ gchar * operation_result;
+ GError *error = NULL;
+
+ operation_result = mm_modem_command_finish (modem, result, &error);
+ command_process_reply (operation_result, error);
+
+ mmcli_async_operation_done ();
+}
+
static void
list_bearers_process_reply (GList *result,
const GError *error)
@@ -825,6 +865,18 @@ get_modem_ready (GObject *source,
return;
}
+ /* Request to send a command to the modem? */
+ if (command_str) {
+ g_debug ("Asynchronously sending a command to the modem...");
+ mm_modem_command (ctx->modem,
+ command_str,
+ command_timeout ? command_timeout : 30,
+ ctx->cancellable,
+ (GAsyncReadyCallback)command_ready,
+ NULL);
+ return;
+ }
+
/* Request to list bearers? */
if (list_bearers_flag) {
g_debug ("Asynchronously listing bearers in modem...");
@@ -983,6 +1035,21 @@ mmcli_modem_run_synchronous (GDBusConnection *connection)
return;
}
+
+ /* Request to send a command to the modem? */
+ if (command_str) {
+ gchar *result;
+
+ g_debug ("Synchronously sending command to modem...");
+ result = mm_modem_command_sync (ctx->modem,
+ command_str,
+ command_timeout ? command_timeout : 30,
+ NULL,
+ &error);
+ command_process_reply (result, error);
+ return;
+ }
+
/* Request to list the bearers? */
if (list_bearers_flag) {
GList *result;
diff --git a/libmm-glib/mm-modem.c b/libmm-glib/mm-modem.c
index 1b3f2521..bc1887ba 100644
--- a/libmm-glib/mm-modem.c
+++ b/libmm-glib/mm-modem.c
@@ -1449,6 +1449,65 @@ mm_modem_factory_reset_sync (MMModem *self,
error);
}
+
+void
+mm_modem_command (MMModem *self,
+ const gchar *cmd,
+ guint timeout,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_return_if_fail (MM_GDBUS_IS_MODEM (self));
+
+ mm_gdbus_modem_call_command (self,
+ cmd,
+ timeout,
+ cancellable,
+ callback,
+ user_data);
+}
+
+gchar *
+mm_modem_command_finish (MMModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ gchar *result;
+
+ g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE);
+
+ if (!mm_gdbus_modem_call_command_finish (self,
+ &result,
+ res,
+ error))
+ return NULL;
+
+ return result;
+}
+
+gchar *
+mm_modem_command_sync (MMModem *self,
+ const gchar *cmd,
+ guint timeout,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gchar *result;
+
+ g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL);
+
+ if (!mm_gdbus_modem_call_command_sync (self,
+ cmd,
+ timeout,
+ &result,
+ cancellable,
+ error))
+ return NULL;
+
+ return result;
+}
+
gboolean
mm_modem_set_allowed_modes_finish (MMModem *self,
GAsyncResult *res,
diff --git a/libmm-glib/mm-modem.h b/libmm-glib/mm-modem.h
index f7406338..90c33e91 100644
--- a/libmm-glib/mm-modem.h
+++ b/libmm-glib/mm-modem.h
@@ -161,6 +161,21 @@ gboolean mm_modem_factory_reset_sync (MMModem *self,
GCancellable *cancellable,
GError **error);
+void mm_modem_command (MMModem *self,
+ const gchar *cmd,
+ guint timeout,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gchar *mm_modem_command_finish (MMModem *self,
+ GAsyncResult *res,
+ GError **error);
+gchar *mm_modem_command_sync (MMModem *self,
+ const gchar *arg_cmd,
+ guint timeout,
+ GCancellable *cancellable,
+ GError **error);
+
void mm_modem_set_allowed_modes (MMModem *self,
MMModemMode modes,
MMModemMode preferred,
diff --git a/new/org.freedesktop.ModemManager1.Modem.xml b/new/org.freedesktop.ModemManager1.Modem.xml
index 26a0f1bb..c98f6d9c 100644
--- a/new/org.freedesktop.ModemManager1.Modem.xml
+++ b/new/org.freedesktop.ModemManager1.Modem.xml
@@ -146,6 +146,20 @@
+
+
+
+
+
+
+