summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/src/connections.c47
-rw-r--r--cli/src/settings.c45
-rw-r--r--cli/src/utils.h1
3 files changed, 51 insertions, 42 deletions
diff --git a/cli/src/connections.c b/cli/src/connections.c
index f2eaddee3d..6c8de1d282 100644
--- a/cli/src/connections.c
+++ b/cli/src/connections.c
@@ -3739,14 +3739,15 @@ cleanup_vlan:
char *bond_arpinterval = NULL;
const char *bond_arpiptarget_c = NULL;
char *bond_arpiptarget = NULL;
- nmc_arg_t exp_args[] = { {"mode", TRUE, &bond_mode_c, FALSE},
- {"primary", TRUE, &bond_primary_c, FALSE},
- {"miimon", TRUE, &bond_miimon_c, FALSE},
- {"downdelay", TRUE, &bond_downdelay_c, FALSE},
- {"updelay", TRUE, &bond_updelay_c, FALSE},
- {"arp-interval", TRUE, &bond_arpinterval_c, FALSE},
- {"arp-ip-target", TRUE, &bond_arpiptarget_c, FALSE},
+ nmc_arg_t exp_args[] = { {NM_SETTING_BOND_MODE, TRUE, &bond_mode_c, FALSE, FALSE, &bond_mode},
+ {NM_SETTING_BOND_PRIMARY, TRUE, &bond_primary_c, FALSE, FALSE, &bond_primary},
+ {NM_SETTING_BOND_MIIMON, TRUE, &bond_miimon_c, FALSE, FALSE, &bond_miimon},
+ {NM_SETTING_BOND_DOWNDELAY, TRUE, &bond_downdelay_c, FALSE, FALSE, &bond_downdelay},
+ {NM_SETTING_BOND_UPDELAY, TRUE, &bond_updelay_c, FALSE, FALSE, &bond_updelay},
+ {NM_SETTING_BOND_ARP_INTERVAL, TRUE, &bond_arpinterval_c, FALSE, FALSE, &bond_arpinterval},
+ {NM_SETTING_BOND_ARP_IP_TARGET, TRUE, &bond_arpiptarget_c, FALSE, FALSE, &bond_arpiptarget},
{NULL} };
+ nmc_arg_t *option;
if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
return FALSE;
@@ -3780,7 +3781,9 @@ cleanup_vlan:
/* Set bond options */
g_object_set (s_bond, NM_SETTING_BOND_INTERFACE_NAME, bond_ifname, NULL);
+
if (bond_mode) {
+ /* resolve the bond option. */
GError *err = NULL;
const char *bm;
if (!(bm = nmc_bond_validate_mode (bond_mode, &err))) {
@@ -3789,27 +3792,25 @@ cleanup_vlan:
g_clear_error (&err);
goto cleanup_bond;
}
- nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_MODE, bm);
+ g_free (bond_mode);
+ bond_mode = g_strdup (bm);
}
- if (bond_primary) {
- if (!nm_utils_iface_valid_name (bond_primary)) {
+ for(option = exp_args; option->name; option++) {
+ GError *err = NULL;
+ const char *value = *((const char **) option->value);
+ if (value && !nm_setting_bond_validate_string (option->name, value, &err)) {
g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
- _("Error: 'primary': '%s' is not a valid interface name."),
- bond_primary);
+ _("Error: '%s': %s."), option->name, err->message);
+ g_clear_error (&err);
goto cleanup_bond;
}
- nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_PRIMARY, bond_primary);
}
- if (bond_miimon)
- nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_MIIMON, bond_miimon);
- if (bond_downdelay && strcmp (bond_downdelay, "0") != 0)
- nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY, bond_downdelay);
- if (bond_updelay && strcmp (bond_updelay, "0") != 0)
- nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_UPDELAY, bond_updelay);
- if (bond_arpinterval && strcmp (bond_arpinterval, "0") != 0)
- nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL, bond_arpinterval);
- if (bond_arpiptarget)
- nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, bond_arpiptarget);
+ for(option = exp_args; option->name; option++) {
+ const char *value = *((const char **) option->value);
+
+ if (value)
+ nm_setting_bond_set_string (s_bond, option->name, *((char **) option->value));
+ }
success = TRUE;
cleanup_bond:
diff --git a/cli/src/settings.c b/cli/src/settings.c
index cf56cfbe98..84a162c001 100644
--- a/cli/src/settings.c
+++ b/cli/src/settings.c
@@ -1031,16 +1031,16 @@ nmc_property_bond_get_options (NMSetting *setting)
{
NMSettingBond *s_bond = NM_SETTING_BOND (setting);
GString *bond_options_s;
- int i;
+ const char *const* kernel_names;
bond_options_s = g_string_new (NULL);
- for (i = 0; i < nm_setting_bond_get_num_options (s_bond); i++) {
- const char *key, *value;
-
- nm_setting_bond_get_option (s_bond, i, &key, &value);
- g_string_append_printf (bond_options_s, "%s=%s,", key, value);
+ kernel_names = nm_setting_bond_get_kernel_names ();
+ for (; *kernel_names; kernel_names++) {
+ g_string_append_printf (bond_options_s, "%s=%s,", *kernel_names,
+ nm_setting_bond_get_string (s_bond, *kernel_names));
}
- g_string_truncate (bond_options_s, bond_options_s->len-1); /* chop off trailing ',' */
+ if (bond_options_s->len > 0)
+ g_string_truncate (bond_options_s, bond_options_s->len-1); /* chop off trailing ',' */
return g_string_free (bond_options_s, FALSE);
}
@@ -2629,15 +2629,16 @@ static gboolean
_validate_and_remove_bond_option (NMSettingBond *setting, const char *option)
{
const char *opt;
- const char **valid_options;
+ const char *const*valid_options;
- valid_options = nm_setting_bond_get_valid_options (setting);
- opt = nmc_string_is_valid (option, valid_options, NULL);
+ valid_options = nm_setting_bond_get_kernel_names ();
+ opt = nmc_string_is_valid (option, (const char **) valid_options, NULL);
- if (opt)
- return nm_setting_bond_remove_option (setting, opt);
- else
+ if (!opt)
return FALSE;
+
+ nm_setting_bond_set_default (setting, opt);
+ return TRUE;
}
/* Validate bonding 'options' values */
@@ -2650,11 +2651,17 @@ _validate_bond_option_value (const char *option, const char *value, GError **err
return value;
}
+static const char **
+_nm_setting_bond_get_kernel_names (NMSettingBond *bond)
+{
+ return (const char **) nm_setting_bond_get_kernel_names ();
+}
+
DEFINE_SETTER_OPTIONS (nmc_property_bond_set_options,
NM_SETTING_BOND,
NMSettingBond,
- nm_setting_bond_add_option,
- nm_setting_bond_get_valid_options,
+ nm_setting_bond_set_string,
+ _nm_setting_bond_get_kernel_names,
_validate_bond_option_value)
DEFINE_REMOVER_OPTION (nmc_property_bond_remove_option_options,
NM_SETTING_BOND,
@@ -2664,11 +2671,11 @@ static const char *
nmc_property_bond_describe_options (NMSetting *setting, const char *prop)
{
static char *desc = NULL;
- const char **valid_options;
+ const char *const*valid_options;
char *options_str;
if (G_UNLIKELY (desc == NULL)) {
- valid_options = nm_setting_bond_get_valid_options (NM_SETTING_BOND (setting));
+ valid_options = nm_setting_bond_get_kernel_names ();
options_str = g_strjoinv (", ", (char **) valid_options);
desc = g_strdup_printf (_("Enter a list of bonding options formatted as:\n"
@@ -2691,11 +2698,11 @@ nmc_property_bond_describe_options (NMSetting *setting, const char *prop)
static const char *
nmc_property_bond_allowed_options (NMSetting *setting, const char *prop)
{
- const char **valid_options;
+ const char *const*valid_options;
static char *allowed_vals = NULL;
if (G_UNLIKELY (allowed_vals == NULL)) {
- valid_options = nm_setting_bond_get_valid_options (NM_SETTING_BOND (setting));
+ valid_options = nm_setting_bond_get_kernel_names ();
allowed_vals = g_strjoinv (", ", (char **) valid_options);
}
return allowed_vals;
diff --git a/cli/src/utils.h b/cli/src/utils.h
index c1c8824144..d6d6654203 100644
--- a/cli/src/utils.h
+++ b/cli/src/utils.h
@@ -32,6 +32,7 @@ typedef struct {
const char **value;
gboolean mandatory;
gboolean found;
+ void *user_data;
} nmc_arg_t;
/* === Functions === */