[RFC PATCH] cli: avoid requiring specific modem if only a single modem is found in the system

Dan Williams dcbw at redhat.com
Thu Apr 30 12:22:03 PDT 2015


On Thu, 2015-04-30 at 17:36 +0200, Aleksander Morgado wrote:
> This change will allow running mmcli operations without needing to specify
> neither the index nor the path of the modem object, but only if a single modem
> is found in the system. E.g.:
> 
> Enabling the modem, when it is the only one in the system, would just be:
>    $ sudo mmcli --enable
>    successfully enabled the modem
> 
> But if multiple modems are found in the system:
>    $ sudo mmcli --enable
>    error: multiple modems found: need specific modem to run the operation
> 
> In particular, the special operation without actions that we had before to print
> the info of a given modem will now also be implicit even if no index or path is
> given:
> 
> So, when a single modem is found in the system:
>    $ sudo mmcli
>    /org/freedesktop/ModemManager1/Modem/1 (device id '51e23d10a4180fcf08a1a55e4c01dce693b17e66')
>      -------------------------
>      Hardware |   manufacturer: 'Sierra Wireless, Incorporated'
>               |          model: 'MC7304'
>               |       revision: 'SWI9X15C_05.05.16.02 r21040 carmd-fwbuild1 2014/03/17 23:49:48'
>               |      supported: 'gsm-umts
>    ...
> 
> But if multiple modems are found:
>    $ sudo mmcli
>    error: multiple modems found: need specific modem to run the operation
> ---
> 
> What does this look like?

I think it looks fine.  Patch looks OK to me too.

> I'm not totally sure about the special operation without explicit action requested, where we
> just showed the modem info. Should we still do that even if no modem index or path is given?

I think that's OK.  I went back and for about it for a few seconds, but
if we're defaulting to 'modem' operations when no group is specified, I
think it's OK to show modem info.

Dan

> ---
>  cli/mmcli-common.c | 43 ++++++++++++++++++++++++++++++++++---------
>  cli/mmcli-modem.c  |  2 +-
>  cli/mmcli.c        |  7 -------
>  3 files changed, 35 insertions(+), 17 deletions(-)
> 
> diff --git a/cli/mmcli-common.c b/cli/mmcli-common.c
> index 2d7f66e..e040a97 100644
> --- a/cli/mmcli-common.c
> +++ b/cli/mmcli-common.c
> @@ -117,18 +117,43 @@ find_modem (MMManager *manager,
>              const gchar *modem_path)
>  {
>      GList *modems;
> -    GList *l;
>      MMObject *found = NULL;
> 
>      modems = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager));
> -    for (l = modems; l; l = g_list_next (l)) {
> -        MMObject *modem = MM_OBJECT (l->data);
> 
> -        if (g_str_equal (mm_object_get_path (modem), modem_path)) {
> -            found = g_object_ref (modem);
> -            break;
> +    /* Single modem expected? */
> +    if (!modem_path) {
> +        guint n_modems;
> +
> +        n_modems = g_list_length (modems);
> +
> +        /* More than one modem found, error out */
> +        if (n_modems > 1) {
> +            g_printerr ("error: multiple modems found: need specific modem to run the operation\n");
> +            exit (EXIT_FAILURE);
> +        }
> +
> +        /* No modems found, error out */
> +        if (!n_modems) {
> +            g_printerr ("error: no modems found: need specific modem to run the operation\n");
> +            exit (EXIT_FAILURE);
> +        }
> +
> +        found = g_object_ref (MM_OBJECT (modems->data));
> +    } else {
> +        GList *l;
> +
> +        /* Iterate list of modems and try to patch one by path */
> +        for (l = modems; l; l = g_list_next (l)) {
> +            MMObject *modem = MM_OBJECT (l->data);
> +
> +            if (g_str_equal (mm_object_get_path (modem), modem_path)) {
> +                found = g_object_ref (modem);
> +                break;
> +            }
>          }
>      }
> +
>      g_list_free_full (modems, (GDestroyNotify) g_object_unref);
> 
>      if (!found) {
> @@ -136,7 +161,7 @@ find_modem (MMManager *manager,
>          exit (EXIT_FAILURE);
>      }
> 
> -    g_debug ("Modem found at '%s'\n", modem_path);
> +    g_debug ("Modem found at '%s'\n", mm_object_get_path (found));
> 
>      return found;
>  }
> @@ -211,8 +236,8 @@ get_modem_path (const gchar *path_or_index)
> 
>      /* We must have a given modem specified */
>      if (!path_or_index) {
> -        g_printerr ("error: no modem was specified\n");
> -        exit (EXIT_FAILURE);
> +        g_debug ("Assuming single modem...");
> +        return NULL;
>      }
> 
>      /* Modem path may come in two ways: full DBus path or just modem index.
> diff --git a/cli/mmcli-modem.c b/cli/mmcli-modem.c
> index f119f6e..a0a7448 100644
> --- a/cli/mmcli-modem.c
> +++ b/cli/mmcli-modem.c
> @@ -174,7 +174,7 @@ mmcli_modem_options_enabled (void)
>                   !!set_preferred_mode_str +
>                   !!set_current_bands_str);
> 
> -    if (n_actions == 0 && mmcli_get_common_modem_string ()) {
> +    if (n_actions == 0) {
>          /* default to info */
>          info_flag = TRUE;
>          n_actions++;
> diff --git a/cli/mmcli.c b/cli/mmcli.c
> index a4e6a4f..c1fc369 100644
> --- a/cli/mmcli.c
> +++ b/cli/mmcli.c
> @@ -247,13 +247,6 @@ main (gint argc, gchar **argv)
> 
>      /* Manager options? */
>      if (mmcli_manager_options_enabled ()) {
> -        /* Ensure options from different groups are not enabled */
> -        if (mmcli_modem_options_enabled ()) {
> -            g_printerr ("error: cannot use manager and modem options "
> -                        "at the same time\n");
> -            exit (EXIT_FAILURE);
> -        }
> -
>          if (async_flag)
>              mmcli_manager_run_asynchronous (connection, cancellable);
>          else
> --
> 2.3.6
> _______________________________________________
> ModemManager-devel mailing list
> ModemManager-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/modemmanager-devel




More information about the ModemManager-devel mailing list