diff options
Diffstat (limited to 'cli/src')
| -rw-r--r-- | cli/src/connections.c | 47 | ||||
| -rw-r--r-- | cli/src/settings.c | 45 | ||||
| -rw-r--r-- | cli/src/utils.h | 1 |
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 === */ |
