summaryrefslogtreecommitdiff
path: root/clients/cli/connections.c
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-08-23 17:56:21 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2018-08-27 15:14:01 +0200
commit16693771102e2efafeb06def8b89ee864955b437 (patch)
tree6e10cfeedcfdff7012c90fbc771d617a8b2f7399 /clients/cli/connections.c
parentd70185ddf13eed9232cfd4da53f5baaa14f8a1d6 (diff)
downloadNetworkManager-16693771102e2efafeb06def8b89ee864955b437.tar.gz
cli: fix connection type completion on connection add
The array returned by the completion function follows a special convention. If the first element is set, it is used as the completion. Otherwise, the remaining entries are the possible completions. _meta_abstract_complete() just returned an array of matching words and so the first element was always used as completion. Instead, we must use rl_completion_matches() to generate the array passing a generator function. https://bugzilla.redhat.com/show_bug.cgi?id=1588952
Diffstat (limited to 'clients/cli/connections.c')
-rw-r--r--clients/cli/connections.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index 3808b86dd2..dda40993ca 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -801,6 +801,7 @@ typedef struct {
NMConnection *connection;
NMSetting *setting;
const char *property;
+ char **words;
} TabCompletionInfo;
static TabCompletionInfo nmc_tab_completion;
@@ -3677,6 +3678,18 @@ _meta_abstract_complete (const NMMetaAbstractInfo *abstract_info, const char *te
return NULL;
}
+static char *
+_meta_abstract_generator (const char *text, int state)
+{
+ if (nmc_tab_completion.words) {
+ return nmc_rl_gen_func_basic (text,
+ state,
+ (const char *const *) nmc_tab_completion.words);
+ }
+
+ return NULL;
+}
+
static void
_meta_abstract_get (const NMMetaAbstractInfo *abstract_info,
const NMMetaSettingInfoEditor **out_setting_info,
@@ -4744,6 +4757,7 @@ nmcli_con_add_tab_completion (const char *text, int start, int end)
rl_compentry_func_t *generator_func = NULL;
gs_free char *no = g_strdup_printf ("[%s]: ", _("no"));
gs_free char *yes = g_strdup_printf ("[%s]: ", _("yes"));
+ const NMMetaAbstractInfo *info;
/* Disable readline's default filename completion */
rl_attempted_completion_over = 1;
@@ -4778,12 +4792,13 @@ nmcli_con_add_tab_completion (const char *text, int start, int end)
} else {
if ( property_info->prompt
&& g_str_has_prefix (rl_prompt, property_info->prompt)) {
- char **values;
-
- values = _meta_abstract_complete ((const NMMetaAbstractInfo *) property_info, text);
- if (values)
- return values;
- goto next;
+ info = (const NMMetaAbstractInfo *) property_info;
+ nmc_tab_completion.words = _meta_abstract_complete (info, text);
+ if (nmc_tab_completion.words) {
+ match_array = rl_completion_matches (text, _meta_abstract_generator);
+ nm_clear_pointer (&nmc_tab_completion.words, g_strfreev);
+ }
+ return match_array;
}
}
}
@@ -8931,6 +8946,7 @@ nmcli_con_tab_completion (const char *text, int start, int end)
{
char **match_array = NULL;
rl_compentry_func_t *generator_func = NULL;
+ const NMMetaAbstractInfo *info;
/* Disable readline's default filename completion */
rl_attempted_completion_over = 1;
@@ -8948,7 +8964,9 @@ nmcli_con_tab_completion (const char *text, int start, int end)
} else if (g_strcmp0 (rl_prompt, PROMPT_ACTIVE_CONNECTIONS) == 0) {
generator_func = gen_func_active_connection_names;
} else if (g_strcmp0 (rl_prompt, NM_META_TEXT_PROMPT_VPN_TYPE) == 0) {
- return _meta_abstract_complete ((const NMMetaAbstractInfo *) nm_meta_property_info_vpn_service_type, text);
+ info = (const NMMetaAbstractInfo *) nm_meta_property_info_vpn_service_type;
+ nmc_tab_completion.words = _meta_abstract_complete (info, text);
+ generator_func = _meta_abstract_generator;
} else if (g_strcmp0 (rl_prompt, PROMPT_IMPORT_FILE) == 0) {
rl_attempted_completion_over = 0;
rl_complete_with_tilde_expansion = 1;
@@ -8959,6 +8977,7 @@ nmcli_con_tab_completion (const char *text, int start, int end)
if (generator_func)
match_array = rl_completion_matches (text, generator_func);
+ g_clear_pointer (&nmc_tab_completion.words, g_strfreev);
return match_array;
}