cli: move completion for devices names to meta data

This commit is contained in:
Thomas Haller
2017-04-11 15:48:04 +02:00
parent d32817999c
commit 1e4bc51a4a
6 changed files with 102 additions and 25 deletions

View File

@@ -3347,7 +3347,11 @@ _meta_abstract_complete (const NMMetaAbstractInfo *abstract_info, const char *te
const char *const*values; const char *const*values;
char **values_to_free = NULL; char **values_to_free = NULL;
values = nm_meta_abstract_info_complete (abstract_info, text, &values_to_free); values = nm_meta_abstract_info_complete (abstract_info,
nmc_meta_environment,
nmc_meta_environment_arg,
text,
&values_to_free);
if (values) if (values)
return values_to_free ?: g_strdupv ((char **) values); return values_to_free ?: g_strdupv ((char **) values);
return NULL; return NULL;
@@ -4031,10 +4035,9 @@ _meta_abstract_get_option_info (const NMMetaAbstractInfo *abstract_info)
.generator_func = generator_func_, \ .generator_func = generator_func_, \
} }
OPTION_INFO (CONNECTION, NM_SETTING_CONNECTION_TYPE, "type", set_connection_type, gen_connection_types), OPTION_INFO (CONNECTION, NM_SETTING_CONNECTION_TYPE, "type", set_connection_type, gen_connection_types),
OPTION_INFO (CONNECTION, NM_SETTING_CONNECTION_INTERFACE_NAME, "ifname", set_connection_iface, nmc_rl_gen_func_ifnames), OPTION_INFO (CONNECTION, NM_SETTING_CONNECTION_INTERFACE_NAME, "ifname", set_connection_iface, NULL),
OPTION_INFO (CONNECTION, NM_SETTING_CONNECTION_MASTER, "master", set_connection_master, gen_func_master_ifnames), OPTION_INFO (CONNECTION, NM_SETTING_CONNECTION_MASTER, "master", set_connection_master, gen_func_master_ifnames),
OPTION_INFO (BLUETOOTH, NM_SETTING_BLUETOOTH_TYPE, "bt-type", set_bluetooth_type, gen_func_bt_type), OPTION_INFO (BLUETOOTH, NM_SETTING_BLUETOOTH_TYPE, "bt-type", set_bluetooth_type, gen_func_bt_type),
OPTION_INFO (VLAN, NM_SETTING_VLAN_PARENT, "dev", NULL, nmc_rl_gen_func_ifnames),
OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "mode", set_bond_option, gen_func_bond_mode), OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "mode", set_bond_option, gen_func_bond_mode),
OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "primary", set_bond_option, nmc_rl_gen_func_ifnames), OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "primary", set_bond_option, nmc_rl_gen_func_ifnames),
OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, NULL, set_bond_monitoring_mode, gen_func_bond_mon_mode), OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, NULL, set_bond_monitoring_mode, gen_func_bond_mon_mode),
@@ -4044,9 +4047,6 @@ _meta_abstract_get_option_info (const NMMetaAbstractInfo *abstract_info)
OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "arp-interval", set_bond_option, NULL), OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "arp-interval", set_bond_option, NULL),
OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "arp-ip-target", set_bond_option, NULL), OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "arp-ip-target", set_bond_option, NULL),
OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "lacp-rate", set_bond_option, gen_func_bond_lacp_rate), OPTION_INFO (BOND, NM_SETTING_BOND_OPTIONS, "lacp-rate", set_bond_option, gen_func_bond_lacp_rate),
OPTION_INFO (MACVLAN, NM_SETTING_MACVLAN_PARENT, "dev", NULL, nmc_rl_gen_func_ifnames),
OPTION_INFO (VXLAN, NM_SETTING_VXLAN_PARENT, "dev", NULL, nmc_rl_gen_func_ifnames),
OPTION_INFO (IP_TUNNEL, NM_SETTING_IP_TUNNEL_PARENT, "dev", NULL, nmc_rl_gen_func_ifnames),
OPTION_INFO (IP4_CONFIG, NM_SETTING_IP_CONFIG_ADDRESSES, "ip4", set_ip4_address, NULL), OPTION_INFO (IP4_CONFIG, NM_SETTING_IP_CONFIG_ADDRESSES, "ip4", set_ip4_address, NULL),
OPTION_INFO (IP6_CONFIG, NM_SETTING_IP_CONFIG_ADDRESSES, "ip6", set_ip6_address, NULL), OPTION_INFO (IP6_CONFIG, NM_SETTING_IP_CONFIG_ADDRESSES, "ip6", set_ip6_address, NULL),
{ 0 }, { 0 },
@@ -4170,7 +4170,11 @@ complete_option (const NMMetaAbstractInfo *abstract_info, const gchar *prefix)
const char *const*values; const char *const*values;
gs_strfreev char **values_to_free = NULL; gs_strfreev char **values_to_free = NULL;
values = nm_meta_abstract_info_complete (abstract_info, prefix, &values_to_free); values = nm_meta_abstract_info_complete (abstract_info,
nmc_meta_environment,
nmc_meta_environment_arg,
prefix,
&values_to_free);
if (values) { if (values) {
for (; values[0]; values++) for (; values[0]; values++)
g_print ("%s\n", values[0]); g_print ("%s\n", values[0]);
@@ -4202,20 +4206,9 @@ complete_property (const gchar *setting_name, const gchar *property, const gchar
run_rl_generator (gen_connection_types, prefix); run_rl_generator (gen_connection_types, prefix);
else if (strcmp (property, NM_SETTING_CONNECTION_MASTER) == 0) else if (strcmp (property, NM_SETTING_CONNECTION_MASTER) == 0)
run_rl_generator (gen_func_master_ifnames, prefix); run_rl_generator (gen_func_master_ifnames, prefix);
else if (strcmp (property, NM_SETTING_CONNECTION_INTERFACE_NAME) == 0)
run_rl_generator (nmc_rl_gen_func_ifnames, prefix);
} else if ( strcmp (setting_name, NM_SETTING_BLUETOOTH_SETTING_NAME) == 0 } else if ( strcmp (setting_name, NM_SETTING_BLUETOOTH_SETTING_NAME) == 0
&& strcmp (property, NM_SETTING_BLUETOOTH_TYPE) == 0) && strcmp (property, NM_SETTING_BLUETOOTH_TYPE) == 0)
run_rl_generator (gen_func_bt_type, prefix); run_rl_generator (gen_func_bt_type, prefix);
else if (strcmp (setting_name, NM_SETTING_IP_TUNNEL_SETTING_NAME) == 0) {
if (strcmp (property, NM_SETTING_IP_TUNNEL_PARENT) == 0)
run_rl_generator (nmc_rl_gen_func_ifnames, prefix);
} else if (strcmp (setting_name, NM_SETTING_MACVLAN_SETTING_NAME) == 0) {
if (strcmp (property, NM_SETTING_MACVLAN_PARENT) == 0)
run_rl_generator (nmc_rl_gen_func_ifnames, prefix);
} else if ( strcmp (setting_name, NM_SETTING_VXLAN_SETTING_NAME) == 0
&& strcmp (property, NM_SETTING_VXLAN_PARENT) == 0)
run_rl_generator (nmc_rl_gen_func_ifnames, prefix);
} }
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
@@ -4520,8 +4513,6 @@ nmcli_con_add_tab_completion (const char *text, int start, int end)
next: next:
if (g_str_has_prefix (rl_prompt, NM_META_TEXT_PROMPT_CON_TYPE)) if (g_str_has_prefix (rl_prompt, NM_META_TEXT_PROMPT_CON_TYPE))
generator_func = gen_connection_types; generator_func = gen_connection_types;
else if (g_str_has_prefix (rl_prompt, NM_META_TEXT_PROMPT_IFNAME))
generator_func = nmc_rl_gen_func_ifnames;
else if (g_str_has_prefix (rl_prompt, NM_META_TEXT_PROMPT_MASTER)) else if (g_str_has_prefix (rl_prompt, NM_META_TEXT_PROMPT_MASTER))
generator_func = gen_func_master_ifnames; generator_func = gen_func_master_ifnames;
else if (g_str_has_prefix (rl_prompt, NM_META_TEXT_PROMPT_BT_TYPE)) else if (g_str_has_prefix (rl_prompt, NM_META_TEXT_PROMPT_BT_TYPE))

View File

@@ -456,10 +456,35 @@ _env_warn_fcn_handle (const NMMetaEnvironment *environment,
g_print (_("Error: %s\n"), m); g_print (_("Error: %s\n"), m);
} }
static NMDevice *const*
_env_get_nm_devices (const NMMetaEnvironment *environment,
gpointer environment_user_data,
guint *out_len)
{
NmCli *nmc = environment_user_data;
const GPtrArray *devices;
nm_assert (nmc);
/* the returned list is *not* NULL terminated. Need to
* provide and honor the out_len argument. */
nm_assert (out_len);
devices = nm_client_get_devices (nmc->client);
if (!devices) {
*out_len = 0;
return NULL;
}
*out_len = devices->len;
return (NMDevice *const*) devices->pdata;
}
/*****************************************************************************/ /*****************************************************************************/
const NMMetaEnvironment *const nmc_meta_environment = &((NMMetaEnvironment) { const NMMetaEnvironment *const nmc_meta_environment = &((NMMetaEnvironment) {
.warn_fcn = _env_warn_fcn_handle, .warn_fcn = _env_warn_fcn_handle,
.get_nm_devices = _env_get_nm_devices,
}); });
NmCli *const nmc_meta_environment_arg = &nm_cli; NmCli *const nmc_meta_environment_arg = &nm_cli;

View File

@@ -261,6 +261,8 @@ nm_meta_abstract_info_get (const NMMetaAbstractInfo *abstract_info,
const char *const* const char *const*
nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info, nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
const NMMetaEnvironment *environment,
gpointer environment_user_data,
const char *text, const char *text,
char ***out_to_free) char ***out_to_free)
{ {
@@ -277,6 +279,8 @@ nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
return NULL; return NULL;
values = abstract_info->meta_type->complete_fcn (abstract_info, values = abstract_info->meta_type->complete_fcn (abstract_info,
environment,
environment_user_data,
text, text,
out_to_free); out_to_free);

View File

@@ -60,6 +60,8 @@ gconstpointer nm_meta_abstract_info_get (const NMMetaAbstractInfo *abstract_info
gpointer *out_to_free); gpointer *out_to_free);
const char *const*nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info, const char *const*nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
const NMMetaEnvironment *environment,
gpointer environment_user_data,
const char *text, const char *text,
char ***out_to_free); char ***out_to_free);

View File

@@ -524,7 +524,7 @@ _env_warn_fcn (const NMMetaEnvironment *environment,
const NMMetaPropertyInfo *property_info, const NMMetaEnvironment *environment, gpointer environment_user_data, NMSetting *setting, const char *value, guint32 idx, GError **error const NMMetaPropertyInfo *property_info, const NMMetaEnvironment *environment, gpointer environment_user_data, NMSetting *setting, const char *value, guint32 idx, GError **error
#define ARGS_COMPLETE_FCN \ #define ARGS_COMPLETE_FCN \
const NMMetaPropertyInfo *property_info, const char *text, char ***out_to_free const NMMetaPropertyInfo *property_info, const NMMetaEnvironment *environment, gpointer environment_user_data, const char *text, char ***out_to_free
#define ARGS_VALUES_FCN \ #define ARGS_VALUES_FCN \
const NMMetaPropertyInfo *property_info, char ***out_to_free const NMMetaPropertyInfo *property_info, char ***out_to_free
@@ -1107,6 +1107,40 @@ _complete_fcn_gobject_bool (ARGS_COMPLETE_FCN)
return v; return v;
} }
static const char *const*
_complete_fcn_gobject_devices (ARGS_COMPLETE_FCN)
{
NMDevice *const*devices = NULL;
guint i, j;
guint len = 0;
char **ifnames;
if ( environment
&& environment->get_nm_devices) {
devices = environment->get_nm_devices (environment,
environment_user_data,
&len);
}
if (len == 0)
return NULL;
ifnames = g_new (char *, len + 1);
for (i = 0, j = 0; i < len; i++) {
const char *ifname;
nm_assert (NM_IS_DEVICE (devices[i]));
ifname = nm_device_get_iface (devices[i]);
if (ifname)
ifnames[j++] = g_strdup (ifname);
}
ifnames[j++] = NULL;
*out_to_free = ifnames;
return (const char *const*) ifnames;
}
/*****************************************************************************/ /*****************************************************************************/
static char * static char *
@@ -4772,6 +4806,12 @@ static const NMMetaPropertyType _pt_gobject_enum = {
.values_fcn = _values_fcn_gobject_enum, .values_fcn = _values_fcn_gobject_enum,
}; };
static const NMMetaPropertyType _pt_gobject_devices = {
.get_fcn = _get_fcn_gobject,
.set_fcn = _set_fcn_gobject_string,
.complete_fcn = _complete_fcn_gobject_devices,
};
/*****************************************************************************/ /*****************************************************************************/
#include "settings-docs.c" #include "settings-docs.c"
@@ -5346,6 +5386,7 @@ static const NMMetaPropertyInfo property_infos_CONNECTION[] = {
.property_type = DEFINE_PROPERTY_TYPE ( .property_type = DEFINE_PROPERTY_TYPE (
.get_fcn = _get_fcn_gobject, .get_fcn = _get_fcn_gobject,
.set_fcn = _set_fcn_gobject_ifname, .set_fcn = _set_fcn_gobject_ifname,
.complete_fcn = _complete_fcn_gobject_devices,
), ),
}, },
{ {
@@ -6040,7 +6081,7 @@ static const NMMetaPropertyInfo property_infos_IP_TUNNEL[] = {
.is_cli_option = TRUE, .is_cli_option = TRUE,
.property_alias = "dev", .property_alias = "dev",
.prompt = N_("Parent device [none]"), .prompt = N_("Parent device [none]"),
.property_type = &_pt_gobject_string, .property_type = &_pt_gobject_devices,
}, },
{ {
PROPERTY_INFO_WITH_DESC (NM_SETTING_IP_TUNNEL_LOCAL), PROPERTY_INFO_WITH_DESC (NM_SETTING_IP_TUNNEL_LOCAL),
@@ -6173,7 +6214,7 @@ static const NMMetaPropertyInfo property_infos_MACVLAN[] = {
.property_alias = "dev", .property_alias = "dev",
.inf_flags = NM_META_PROPERTY_INF_FLAG_REQD, .inf_flags = NM_META_PROPERTY_INF_FLAG_REQD,
.prompt = N_("MACVLAN parent device or connection UUID"), .prompt = N_("MACVLAN parent device or connection UUID"),
.property_type = &_pt_gobject_string, .property_type = &_pt_gobject_devices,
}, },
{ {
PROPERTY_INFO_WITH_DESC (NM_SETTING_MACVLAN_MODE), PROPERTY_INFO_WITH_DESC (NM_SETTING_MACVLAN_MODE),
@@ -6519,7 +6560,7 @@ static const NMMetaPropertyInfo property_infos_VLAN[] = {
.property_alias = "dev", .property_alias = "dev",
.inf_flags = NM_META_PROPERTY_INF_FLAG_REQD, .inf_flags = NM_META_PROPERTY_INF_FLAG_REQD,
.prompt = N_("VLAN parent device or connection UUID"), .prompt = N_("VLAN parent device or connection UUID"),
.property_type = &_pt_gobject_string, .property_type = &_pt_gobject_devices,
}, },
{ {
PROPERTY_INFO_WITH_DESC (NM_SETTING_VLAN_ID), PROPERTY_INFO_WITH_DESC (NM_SETTING_VLAN_ID),
@@ -6620,7 +6661,7 @@ static const NMMetaPropertyInfo property_infos_VXLAN[] = {
.is_cli_option = TRUE, .is_cli_option = TRUE,
.property_alias = "dev", .property_alias = "dev",
.prompt = N_("Parent device [none]"), .prompt = N_("Parent device [none]"),
.property_type = &_pt_gobject_string, .property_type = &_pt_gobject_devices,
}, },
{ {
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_ID), PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_ID),
@@ -7467,6 +7508,8 @@ _meta_type_property_info_get_nested (const NMMetaAbstractInfo *abstract_info,
static const char *const* static const char *const*
_meta_type_property_info_complete_fcn (const NMMetaAbstractInfo *abstract_info, _meta_type_property_info_complete_fcn (const NMMetaAbstractInfo *abstract_info,
const NMMetaEnvironment *environment,
gpointer environment_user_data,
const char *text, const char *text,
char ***out_to_free) char ***out_to_free)
{ {
@@ -7476,6 +7519,8 @@ _meta_type_property_info_complete_fcn (const NMMetaAbstractInfo *abstract_info,
if (info->property_type->complete_fcn) { if (info->property_type->complete_fcn) {
return info->property_type->complete_fcn (info, return info->property_type->complete_fcn (info,
environment,
environment_user_data,
text, text,
out_to_free); out_to_free);
} }

View File

@@ -22,6 +22,8 @@
#include "nm-meta-setting.h" #include "nm-meta-setting.h"
struct _NMDevice;
#define NM_META_TEXT_HIDDEN "<hidden>" #define NM_META_TEXT_HIDDEN "<hidden>"
#define NM_META_TEXT_PROMPT_ADSL_PROTO N_("Protocol") #define NM_META_TEXT_PROMPT_ADSL_PROTO N_("Protocol")
@@ -197,6 +199,8 @@ struct _NMMetaPropertyType {
char ***out_to_free); char ***out_to_free);
const char *const*(*complete_fcn) (const NMMetaPropertyInfo *property_info, const char *const*(*complete_fcn) (const NMMetaPropertyInfo *property_info,
const NMMetaEnvironment *environment,
gpointer environment_user_data,
const char *text, const char *text,
char ***out_to_free); char ***out_to_free);
}; };
@@ -313,6 +317,8 @@ struct _NMMetaType {
NMMetaAccessorGetOutFlags *out_flags, NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free); gpointer *out_to_free);
const char *const*(*complete_fcn) (const NMMetaAbstractInfo *info, const char *const*(*complete_fcn) (const NMMetaAbstractInfo *info,
const NMMetaEnvironment *environment,
gpointer environment_user_data,
const char *text, const char *text,
char ***out_to_free); char ***out_to_free);
}; };
@@ -349,6 +355,10 @@ struct _NMMetaEnvironment {
const char *fmt_l10n, /* the untranslated format string, but it is marked for translation using N_(). */ const char *fmt_l10n, /* the untranslated format string, but it is marked for translation using N_(). */
va_list ap); va_list ap);
struct _NMDevice *const*(*get_nm_devices) (const NMMetaEnvironment *environment,
gpointer environment_user_data,
guint *out_len);
}; };
/*****************************************************************************/ /*****************************************************************************/