aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/mmcli-modem.c281
1 files changed, 281 insertions, 0 deletions
diff --git a/cli/mmcli-modem.c b/cli/mmcli-modem.c
index 6dfa7d17..c5ce7bab 100644
--- a/cli/mmcli-modem.c
+++ b/cli/mmcli-modem.c
@@ -49,6 +49,9 @@ static gboolean enable_flag;
static gboolean disable_flag;
static gboolean reset_flag;
static gchar *factory_reset_str;
+static gboolean list_bearers_flag;
+static gchar *create_bearer_str;
+static gchar *delete_bearer_str;
static GOptionEntry entries[] = {
{ "modem", 'm', 0, G_OPTION_ARG_STRING, &modem_str,
@@ -79,6 +82,18 @@ static GOptionEntry entries[] = {
"Reset a given modem to its factory state",
"[CODE]"
},
+ { "list-bearers", 0, 0, G_OPTION_ARG_NONE, &list_bearers_flag,
+ "List packet data bearers available in a given modem",
+ NULL
+ },
+ { "create-bearer", 0, 0, G_OPTION_ARG_STRING, &create_bearer_str,
+ "Create a new packet data bearer in a given modem",
+ "[\"key=value,...\"]"
+ },
+ { "delete-bearer", 0, 0, G_OPTION_ARG_STRING, &delete_bearer_str,
+ "Delete a data bearer from a given modem",
+ "[PATH]"
+ },
{ NULL }
};
@@ -108,6 +123,9 @@ mmcli_modem_options_enabled (void)
enable_flag +
disable_flag +
reset_flag +
+ list_bearers_flag +
+ !!create_bearer_str +
+ !!delete_bearer_str +
!!factory_reset_str);
if (n_actions > 1) {
@@ -390,6 +408,154 @@ factory_reset_ready (MMModem *modem,
}
static void
+list_bearers_process_reply (gchar **result,
+ const GError *error)
+{
+ if (error) {
+ g_printerr ("error: couldn't list bearers: '%s'\n",
+ error->message);
+ exit (EXIT_FAILURE);
+ }
+
+ g_print ("\n");
+ if (!result || !result[0]) {
+ g_print ("No bearers were found\n");
+ } else {
+ guint i;
+
+ /* Count number of items */
+ for (i = 0; result[i]; i++)
+ ;
+ g_print ("Found %u bearers:\n", i);
+
+ for (i = 0; result[i]; i++) {
+ g_print ("\t%s\n", result[i]);
+ }
+ }
+ g_strfreev (result);
+}
+
+static void
+list_bearers_ready (MMModem *modem,
+ GAsyncResult *result,
+ gpointer nothing)
+{
+ gchar **operation_result;
+ GError *error = NULL;
+
+ operation_result = mm_modem_list_bearers_finish (modem, result, &error);
+ list_bearers_process_reply (operation_result, error);
+
+ mmcli_async_operation_done ();
+}
+
+static void
+create_bearer_process_reply (gchar *result,
+ const GError *error)
+{
+ if (!result) {
+ g_printerr ("error: couldn't create new bearer: '%s'\n",
+ error ? error->message : "unknown error");
+ exit (EXIT_FAILURE);
+ }
+
+ g_print ("successfully created new bearer in modem: '%s'\n", result);
+ g_free (result);
+}
+
+static void
+create_bearer_ready (MMModem *modem,
+ GAsyncResult *result,
+ gpointer nothing)
+{
+ gchar *operation_result;
+ GError *error = NULL;
+
+ operation_result = mm_modem_create_bearer_finish (modem, result, &error);
+ create_bearer_process_reply (operation_result, error);
+
+ mmcli_async_operation_done ();
+}
+
+static void
+create_bearer_parse_known_input (const gchar *input,
+ gchar **apn,
+ gchar **ip_type,
+ gchar **user,
+ gchar **password,
+ gchar **number)
+{
+ gchar **words;
+ gchar *key;
+ gchar *value;
+ guint i;
+
+ /* Expecting input as:
+ * key1=value1,key2=value2,... */
+
+ words = g_strsplit_set (input, ",= ", -1);
+ if (!words)
+ return;
+
+ i = 0;
+ key = words[i];
+ while (key) {
+ value = words[++i];
+ if (!value) {
+ g_printerr ("error: invalid properties string, no value for key '%s'\n", key);
+ exit (EXIT_FAILURE);
+ }
+
+ if (g_str_equal (key, MM_BEARER_PROPERTY_APN))
+ *apn = value;
+ else if (g_str_equal (key, MM_BEARER_PROPERTY_IP_TYPE))
+ *ip_type = value;
+ else if (g_str_equal (key, MM_BEARER_PROPERTY_USER))
+ *user = value;
+ else if (g_str_equal (key, MM_BEARER_PROPERTY_PASSWORD))
+ *password = value;
+ else if (g_str_equal (key, MM_BEARER_PROPERTY_NUMBER))
+ *number = value;
+ else {
+ g_printerr ("error: invalid key '%s' in properties string", key);
+ g_free (value);
+ }
+
+ g_free (key);
+ key = words[++i];
+ }
+
+ g_free (words);
+}
+
+static void
+delete_bearer_process_reply (gboolean result,
+ const GError *error)
+{
+ if (!result) {
+ g_printerr ("error: couldn't delete bearer: '%s'\n",
+ error ? error->message : "unknown error");
+ exit (EXIT_FAILURE);
+ }
+
+ g_print ("successfully deleted bearer from modem\n");
+}
+
+static void
+delete_bearer_ready (MMModem *modem,
+ GAsyncResult *result,
+ gpointer nothing)
+{
+ gboolean operation_result;
+ GError *error = NULL;
+
+ operation_result = mm_modem_delete_bearer_finish (modem, result, &error);
+ delete_bearer_process_reply (operation_result, error);
+
+ mmcli_async_operation_done ();
+}
+
+static void
state_changed (MMObject *modem,
MMModemState old_state,
MMModemState new_state,
@@ -477,6 +643,61 @@ get_modem_ready (GObject *source,
return;
}
+ /* Request to list bearers? */
+ if (list_bearers_flag) {
+ g_debug ("Asynchronously listing bearers in modem...");
+ mm_modem_list_bearers (ctx->modem,
+ ctx->cancellable,
+ (GAsyncReadyCallback)list_bearers_ready,
+ NULL);
+ return;
+ }
+
+ /* Request to create a new bearer? */
+ if (create_bearer_str) {
+ gchar *apn = NULL;
+ gchar *ip_type = NULL;
+ gchar *user = NULL;
+ gchar *password = NULL;
+ gchar *number = NULL;
+
+ create_bearer_parse_known_input (create_bearer_str,
+ &apn,
+ &ip_type,
+ &user,
+ &password,
+ &number);
+
+ g_debug ("Asynchronously creating new bearer in modem...");
+ mm_modem_create_bearer (ctx->modem,
+ ctx->cancellable,
+ (GAsyncReadyCallback)create_bearer_ready,
+ NULL,
+ MM_BEARER_PROPERTY_APN, apn,
+ MM_BEARER_PROPERTY_IP_TYPE, ip_type,
+ MM_BEARER_PROPERTY_USER, user,
+ MM_BEARER_PROPERTY_PASSWORD, password,
+ MM_BEARER_PROPERTY_NUMBER, number,
+ NULL);
+
+ g_free (apn);
+ g_free (ip_type);
+ g_free (user);
+ g_free (password);
+ g_free (number);
+ return;
+ }
+
+ /* Request to delete a given bearer? */
+ if (delete_bearer_str) {
+ mm_modem_delete_bearer (ctx->modem,
+ delete_bearer_str,
+ ctx->cancellable,
+ (GAsyncReadyCallback)delete_bearer_ready,
+ NULL);
+ return;
+ }
+
g_warn_if_reached ();
}
@@ -560,5 +781,65 @@ mmcli_modem_run_synchronous (GDBusConnection *connection)
return;
}
+ /* Request to list the bearers? */
+ if (list_bearers_flag) {
+ gchar **result;
+
+ g_debug ("Synchronously listing bearers...");
+ result = mm_modem_list_bearers_sync (ctx->modem, NULL, &error);
+ list_bearers_process_reply (result, error);
+ return;
+ }
+
+ /* Request to create a new bearer? */
+ if (create_bearer_str) {
+ gchar *apn = NULL;
+ gchar *ip_type = NULL;
+ gchar *user = NULL;
+ gchar *password = NULL;
+ gchar *number = NULL;
+ gchar *result;
+
+ create_bearer_parse_known_input (create_bearer_str,
+ &apn,
+ &ip_type,
+ &user,
+ &password,
+ &number);
+
+ g_debug ("Synchronously creating new bearer in modem...");
+ result = mm_modem_create_bearer_sync (ctx->modem,
+ NULL,
+ &error,
+ MM_BEARER_PROPERTY_APN, apn,
+ MM_BEARER_PROPERTY_IP_TYPE, ip_type,
+ MM_BEARER_PROPERTY_USER, user,
+ MM_BEARER_PROPERTY_PASSWORD, password,
+ MM_BEARER_PROPERTY_NUMBER, number,
+ NULL);
+
+ g_free (apn);
+ g_free (ip_type);
+ g_free (user);
+ g_free (password);
+ g_free (number);
+
+ create_bearer_process_reply (result, error);
+ return;
+ }
+
+ /* Request to delete a given bearer? */
+ if (delete_bearer_str) {
+ gboolean result;
+
+ result = mm_modem_delete_bearer_sync (ctx->modem,
+ delete_bearer_str,
+ NULL,
+ &error);
+
+ delete_bearer_process_reply (result, error);
+ return;
+ }
+
g_warn_if_reached ();
}