diff options
author | Thomas Haller <thaller@redhat.com> | 2019-04-16 09:16:14 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-04-16 09:16:14 +0200 |
commit | 87c2b0e6cd686e33ec275761d0e81be374d204c3 (patch) | |
tree | b6fcda8ae57f3d6b0042bc5f743021d19eff69c8 | |
parent | f917fabde40f36332ab1d15d89eaaaa49cd9482f (diff) | |
parent | 43d93e7c1f9d08973eab6ae5b4991775e336630e (diff) | |
download | NetworkManager-87c2b0e6cd686e33ec275761d0e81be374d204c3.tar.gz |
cli: merge branch 'th/cli-select-connection'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/108
-rw-r--r-- | clients/cli/common.c | 102 | ||||
-rw-r--r-- | clients/cli/connections.c | 10 | ||||
-rw-r--r-- | clients/cli/devices.c | 16 | ||||
-rw-r--r-- | clients/cli/general.c | 4 | ||||
-rw-r--r-- | clients/cli/nmcli.c | 2 | ||||
-rw-r--r-- | clients/cli/utils.c | 4 |
6 files changed, 81 insertions, 57 deletions
diff --git a/clients/cli/common.c b/clients/cli/common.c index 3c1c315d5e..2fc8aaf643 100644 --- a/clients/cli/common.c +++ b/clients/cli/common.c @@ -425,36 +425,38 @@ nmc_find_connection (const GPtrArray *connections, GPtrArray **out_result, gboolean complete) { - NMConnection *connection; + NMConnection *best_candidate_uuid = NULL; NMConnection *best_candidate = NULL; + gs_unref_ptrarray GPtrArray *result_allocated = NULL; GPtrArray *result = out_result ? *out_result : NULL; + const guint result_inital_len = result ? result->len : 0u; guint i, j; nm_assert (connections); nm_assert (filter_val); for (i = 0; i < connections->len; i++) { - const char *v, *v_num; + gboolean match_by_uuid = FALSE; + NMConnection *connection; + const char *v; + const char *v_num; connection = NM_CONNECTION (connections->pdata[i]); - /* When filter_type is NULL, compare connection ID (filter_val) - * against all types. Otherwise, only compare against the specific - * type. If 'path' filter type is specified, comparison against - * numeric index (in addition to the whole path) is allowed. - */ - if (NM_IN_STRSET (filter_type, NULL, "id")) { - v = nm_connection_get_id (connection); - if (complete) - nmc_complete_strings (filter_val, v, NULL); - if (nm_streq0 (filter_val, v)) - goto found; - } - if (NM_IN_STRSET (filter_type, NULL, "uuid")) { v = nm_connection_get_uuid (connection); if (complete && (filter_type || *filter_val)) - nmc_complete_strings (filter_val, v, NULL); + nmc_complete_strings (filter_val, v); + if (nm_streq0 (filter_val, v)) { + match_by_uuid = TRUE; + goto found; + } + } + + if (NM_IN_STRSET (filter_type, NULL, "id")) { + v = nm_connection_get_id (connection); + if (complete) + nmc_complete_strings (filter_val, v); if (nm_streq0 (filter_val, v)) goto found; } @@ -463,7 +465,7 @@ nmc_find_connection (const GPtrArray *connections, v = nm_connection_get_path (connection); v_num = nm_utils_dbus_path_get_last_component (v); if (complete && (filter_type || *filter_val)) - nmc_complete_strings (filter_val, v, filter_type ? v_num : NULL, NULL); + nmc_complete_strings (filter_val, v, (*filter_val ? v_num : NULL)); if ( nm_streq0 (filter_val, v) || (filter_type && nm_streq0 (filter_val, v_num))) goto found; @@ -472,29 +474,51 @@ nmc_find_connection (const GPtrArray *connections, if (NM_IN_STRSET (filter_type, NULL, "filename")) { v = nm_remote_connection_get_filename (NM_REMOTE_CONNECTION (connections->pdata[i])); if (complete && (filter_type || *filter_val)) - nmc_complete_strings (filter_val, v, NULL); + nmc_complete_strings (filter_val, v); if (nm_streq0 (filter_val, v)) goto found; } continue; + found: - if (!out_result) - return connection; - if (!best_candidate) - best_candidate = connection; - if (!result) - result = g_ptr_array_new_with_free_func (g_object_unref); - for (j = 0; j < result->len; j++) { - if (connection == result->pdata[j]) - break; + if (match_by_uuid) { + if ( !complete + && !out_result) + return connection; + best_candidate_uuid = connection; + } else { + if (!best_candidate) + best_candidate = connection; + } + if (out_result) { + gboolean already_tracked = FALSE; + + if (!result) { + result_allocated = g_ptr_array_new_with_free_func (g_object_unref); + result = result_allocated; + } else { + for (j = 0; j < result->len; j++) { + if (connection == result->pdata[j]) { + already_tracked = TRUE; + break; + } + } + } + if (!already_tracked) { + if (match_by_uuid) { + /* the profile is matched exactly (by UUID). We prepend it + * to the list of all found profiles. */ + g_ptr_array_insert (result, result_inital_len, g_object_ref (connection)); + } else + g_ptr_array_add (result, g_object_ref (connection)); + } } - if (j == result->len) - g_ptr_array_add (result, g_object_ref (connection)); } - NM_SET_OUT (out_result, result); - return best_candidate; + if (result_allocated) + *out_result = g_steal_pointer (&result_allocated); + return best_candidate_uuid ?: best_candidate; } NMActiveConnection * @@ -525,7 +549,7 @@ nmc_find_active_connection (const GPtrArray *active_cons, if (NM_IN_STRSET (filter_type, NULL, "id")) { v = nm_active_connection_get_id (candidate); if (complete) - nmc_complete_strings (filter_val, v, NULL); + nmc_complete_strings (filter_val, v); if (nm_streq0 (filter_val, v)) goto found; } @@ -533,7 +557,7 @@ nmc_find_active_connection (const GPtrArray *active_cons, if (NM_IN_STRSET (filter_type, NULL, "uuid")) { v = nm_active_connection_get_uuid (candidate); if (complete && (filter_type || *filter_val)) - nmc_complete_strings (filter_val, v, NULL); + nmc_complete_strings (filter_val, v); if (nm_streq0 (filter_val, v)) goto found; } @@ -542,7 +566,7 @@ nmc_find_active_connection (const GPtrArray *active_cons, v = con ? nm_connection_get_path (NM_CONNECTION (con)) : NULL; v_num = nm_utils_dbus_path_get_last_component (v); if (complete && (filter_type || *filter_val)) - nmc_complete_strings (filter_val, v, filter_type ? v_num : NULL, NULL); + nmc_complete_strings (filter_val, v, filter_type ? v_num : NULL); if ( nm_streq0 (filter_val, v) || (filter_type && nm_streq0 (filter_val, v_num))) goto found; @@ -551,7 +575,7 @@ nmc_find_active_connection (const GPtrArray *active_cons, if (NM_IN_STRSET (filter_type, NULL, "filename")) { v = nm_remote_connection_get_filename (con); if (complete && (filter_type || *filter_val)) - nmc_complete_strings (filter_val, v, NULL); + nmc_complete_strings (filter_val, v); if (nm_streq0 (filter_val, v)) goto found; } @@ -560,7 +584,7 @@ nmc_find_active_connection (const GPtrArray *active_cons, v = nm_object_get_path (NM_OBJECT (candidate)); v_num = nm_utils_dbus_path_get_last_component (v); if (complete && (filter_type || *filter_val)) - nmc_complete_strings (filter_val, v, filter_type ? v_num : NULL, NULL); + nmc_complete_strings (filter_val, v, filter_type ? v_num : NULL); if ( nm_streq0 (filter_val, v) || (filter_type && nm_streq0 (filter_val, v_num))) goto found; @@ -1254,9 +1278,9 @@ call_cmd (NmCli *nmc, GSimpleAsyncResult *simple, const NMCCommand *cmd, int arg static void nmc_complete_help (const char *prefix) { - nmc_complete_strings (prefix, "help", NULL); + nmc_complete_strings (prefix, "help"); if (*prefix == '-') - nmc_complete_strings (prefix, "-help", "--help", NULL); + nmc_complete_strings (prefix, "-help", "--help"); } /** @@ -1395,7 +1419,7 @@ void nmc_complete_bool (const char *prefix) { nmc_complete_strings (prefix, "true", "yes", "on", - "false", "no", "off", NULL); + "false", "no", "off"); } /** diff --git a/clients/cli/connections.c b/clients/cli/connections.c index d3193ccb3c..6223a8e87f 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -1941,7 +1941,7 @@ get_connection (NmCli *nmc, } if (*argc == 1 && nmc->complete) - nmc_complete_strings (**argv, "id", "uuid", "path", "filename", NULL); + nmc_complete_strings (**argv, "id", "uuid", "path", "filename"); if (NM_IN_STRSET (**argv, "id", "uuid", "path", "filename")) { if (*argc == 1) { @@ -2100,7 +2100,7 @@ do_connections_show (NmCli *nmc, int argc, char **argv) guint i_found_cons; if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "id", "uuid", "path", "filename", "apath", NULL); + nmc_complete_strings (*argv, "id", "uuid", "path", "filename", "apath"); if (NM_IN_STRSET (*argv, "id", "uuid", "path", "filename", "apath")) { selector = *argv; @@ -2846,7 +2846,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv) while (argc > 0) { if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "ifname", "ap", "passwd-file", NULL); + nmc_complete_strings (*argv, "ifname", "ap", "passwd-file"); if (strcmp (*argv, "ifname") == 0) { argc--; @@ -3098,7 +3098,7 @@ do_connection_down (NmCli *nmc, int argc, char **argv) const char *selector = NULL; if (arg_num == 1 && nmc->complete) - nmc_complete_strings (*arg_ptr, "id", "uuid", "path", "filename", "apath", NULL); + nmc_complete_strings (*arg_ptr, "id", "uuid", "path", "filename", "apath"); if (NM_IN_STRSET (*arg_ptr, "id", "uuid", "path", "filename", "apath")) { selector = *arg_ptr; @@ -8167,7 +8167,7 @@ do_connection_edit (NmCli *nmc, int argc, char **argv) next_arg (nmc, &argc, &argv, NULL); if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "type", "con-name", "id", "uuid", "path", "filename", NULL); + nmc_complete_strings (*argv, "type", "con-name", "id", "uuid", "path", "filename"); nmc->return_value = NMC_RESULT_SUCCESS; diff --git a/clients/cli/devices.c b/clients/cli/devices.c index ad3a44c4de..0a0c3159e3 100644 --- a/clients/cli/devices.c +++ b/clients/cli/devices.c @@ -2473,7 +2473,7 @@ do_device_set (NmCli *nmc, int argc, char **argv) gboolean flag; if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "managed", "autoconnect", NULL); + nmc_complete_strings (*argv, "managed", "autoconnect"); if (matches (*argv, "managed")) { argc--; @@ -2997,7 +2997,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) } rescan = *argv; if (argc == 1 && nmc->complete) - nmc_complete_strings (rescan, "auto", "no", "yes", NULL); + nmc_complete_strings (rescan, "auto", "no", "yes"); break; default: g_assert_not_reached(); @@ -3179,7 +3179,7 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv) while (argc > 0) { if (argc == 1 && nmc->complete) { nmc_complete_strings (*argv, "ifname", "bssid", "password", "wep-key-type", - "name", "private", "hidden", NULL); + "name", "private", "hidden"); } if (strcmp (*argv, "ifname") == 0) { @@ -3229,7 +3229,7 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv) goto finish; } if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "key", "phrase", NULL); + nmc_complete_strings (*argv, "key", "phrase"); if (strcmp (*argv, "key") == 0) wep_passphrase = FALSE; else if (strcmp (*argv, "phrase") == 0) @@ -3711,7 +3711,7 @@ do_device_wifi_hotspot (NmCli *nmc, int argc, char **argv) while (argc > 0) { if (argc == 1 && nmc->complete) { nmc_complete_strings (*argv, "ifname", "con-name", "ssid", "band", - "channel", "password", NULL); + "channel", "password"); } if (strcmp (*argv, "ifname") == 0) { @@ -3753,7 +3753,7 @@ do_device_wifi_hotspot (NmCli *nmc, int argc, char **argv) } band = *argv; if (argc == 1 && nmc->complete) - nmc_complete_strings (band, "a", "bg", NULL); + nmc_complete_strings (band, "a", "bg"); if (strcmp (band, "a") && strcmp (band, "bg")) { g_string_printf (nmc->return_text, _("Error: band argument value '%s' is invalid; use 'a' or 'bg'."), band); @@ -3935,7 +3935,7 @@ do_device_wifi_rescan (NmCli *nmc, int argc, char **argv) /* Get the parameters */ while (argc > 0) { if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "ifname", "ssid", NULL); + nmc_complete_strings (*argv, "ifname", "ssid"); if (strcmp (*argv, "ifname") == 0) { if (ifname) { @@ -4122,7 +4122,7 @@ do_device_lldp_list (NmCli *nmc, int argc, char **argv) next_arg (nmc, &argc, &argv, NULL); while (argc > 0) { if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "ifname", NULL); + nmc_complete_strings (*argv, "ifname"); if (strcmp (*argv, "ifname") == 0) { argc--; diff --git a/clients/cli/general.c b/clients/cli/general.c index e79bd65588..2acc4da9b8 100644 --- a/clients/cli/general.c +++ b/clients/cli/general.c @@ -683,7 +683,7 @@ do_general_logging (NmCli *nmc, int argc, char **argv) do { if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "level", "domains", NULL); + nmc_complete_strings (*argv, "level", "domains"); if (matches (*argv, "level")) { argc--; @@ -878,7 +878,7 @@ do_networking_connectivity (NmCli *nmc, int argc, char **argv) next_arg (nmc, &argc, &argv, NULL); if (nmc->complete) { if (argc == 1) - nmc_complete_strings (*argv, "check", NULL); + nmc_complete_strings (*argv, "check"); return nmc->return_value; } diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c index d7bc2a4629..d8300e780c 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -732,7 +732,7 @@ process_command_line (NmCli *nmc, int argc, char **argv) nmc_complete_strings (argv[0], "--terse", "--pretty", "--mode", "--overview", "--colors", "--escape", "--fields", "--nocheck", "--get-values", - "--wait", "--version", "--help", NULL); + "--wait", "--version", "--help"); } if (argv[0][1] == '-' && argv[0][2] == '\0') { diff --git a/clients/cli/utils.c b/clients/cli/utils.c index a8b81279ed..a822dd89da 100644 --- a/clients/cli/utils.c +++ b/clients/cli/utils.c @@ -189,10 +189,10 @@ next_arg (NmCli *nmc, int *argc, char ***argv, ...) if (nmc && nmc->complete && *argc == 1) { while ((cmd_option = va_arg (args, const char *))) - nmc_complete_strings (**argv, cmd_option, NULL); + nmc_complete_strings (**argv, cmd_option); if (***argv == '-') - nmc_complete_strings (**argv, "--ask", "--show-secrets", NULL); + nmc_complete_strings (**argv, "--ask", "--show-secrets"); va_end (args); return 0; |