diff options
-rw-r--r-- | clients/cli/connections.c | 117 |
1 files changed, 81 insertions, 36 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c index f2f4adecf7..84f80741c9 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -4595,47 +4595,81 @@ again: goto again; } -static void -questionnaire_mandatory (NmCli *nmc, NMConnection *connection) +static NMMetaSettingType +connection_get_base_meta_setting_type (NMConnection *connection) { - NMMetaSettingType s; + const char *connection_type; + NMSetting *base_setting; + const NMMetaSettingInfoEditor *editor; - for (s = 0; s < _NM_META_SETTING_TYPE_NUM; s++) { - const NMMetaPropertyInfo *const*property_infos; - guint p; + connection_type = nm_connection_get_connection_type (connection); + nm_assert (connection_type); + base_setting = nm_connection_get_setting_by_name (connection, connection_type); + nm_assert (base_setting); + editor = nm_meta_setting_info_editor_find_by_setting (base_setting); + nm_assert (editor); - property_infos = nm_meta_setting_infos_editor[s].properties; - if (!property_infos) - continue; - for (p = 0; property_infos[p]; p++) { - const NMMetaPropertyInfo *property_info = property_infos[p]; + return editor - nm_meta_setting_infos_editor; +} - if (_meta_property_needs_bond_hack (property_info)) { - guint i; +static void +questionnaire_mandatory_ask_setting (NmCli *nmc, NMConnection *connection, NMMetaSettingType type) +{ + const NMMetaSettingInfoEditor *editor; + const NMMetaPropertyInfo *property_info; + guint p; - for (i = 0; i < nm_meta_property_typ_data_bond.nested_len; i++) { - const NMMetaNestedPropertyInfo *bi = &nm_meta_property_typ_data_bond.nested[i]; + editor = &nm_meta_setting_infos_editor[type]; + if (!editor->properties) + return; - if (!option_relevant (connection, (const NMMetaAbstractInfo *) bi)) - continue; - if ( (bi->base.inf_flags & NM_META_PROPERTY_INF_FLAG_REQD) - || (_dynamic_options_get ((const NMMetaAbstractInfo *) bi) & PROPERTY_INF_FLAG_ENABLED)) - ask_option (nmc, connection, (const NMMetaAbstractInfo *) bi); - } - } else { - if (!property_info->is_cli_option) - continue; + for (p = 0; editor->properties[p]; p++) { + property_info = editor->properties[p]; - if (!option_relevant (connection, (const NMMetaAbstractInfo *) property_info)) + if (_meta_property_needs_bond_hack (property_info)) { + guint i; + + for (i = 0; i < nm_meta_property_typ_data_bond.nested_len; i++) { + const NMMetaNestedPropertyInfo *bi = &nm_meta_property_typ_data_bond.nested[i]; + + if (!option_relevant (connection, (const NMMetaAbstractInfo *) bi)) continue; - if ( (property_info->inf_flags & NM_META_PROPERTY_INF_FLAG_REQD) - || (_dynamic_options_get ((const NMMetaAbstractInfo *) property_info) & PROPERTY_INF_FLAG_ENABLED)) - ask_option (nmc, connection, (const NMMetaAbstractInfo *) property_info); + if ( (bi->base.inf_flags & NM_META_PROPERTY_INF_FLAG_REQD) + || (_dynamic_options_get ((const NMMetaAbstractInfo *) bi) & PROPERTY_INF_FLAG_ENABLED)) + ask_option (nmc, connection, (const NMMetaAbstractInfo *) bi); } + } else { + if (!property_info->is_cli_option) + continue; + + if (!option_relevant (connection, (const NMMetaAbstractInfo *) property_info)) + continue; + if ( (property_info->inf_flags & NM_META_PROPERTY_INF_FLAG_REQD) + || (_dynamic_options_get ((const NMMetaAbstractInfo *) property_info) & PROPERTY_INF_FLAG_ENABLED)) + ask_option (nmc, connection, (const NMMetaAbstractInfo *) property_info); } } } +static void +questionnaire_mandatory (NmCli *nmc, NMConnection *connection) +{ + NMMetaSettingType s, base; + + /* First ask connection properties */ + questionnaire_mandatory_ask_setting (nmc, connection, NM_META_SETTING_TYPE_CONNECTION); + + /* Ask properties of the base setting */ + base = connection_get_base_meta_setting_type (connection); + questionnaire_mandatory_ask_setting (nmc, connection, base); + + /* Remaining settings */ + for (s = 0; s < _NM_META_SETTING_TYPE_NUM; s++) { + if (!NM_IN_SET (s, NM_META_SETTING_TYPE_CONNECTION, base)) + questionnaire_mandatory_ask_setting (nmc, connection, s); + } +} + static gboolean want_provide_opt_args (const char *type, int num) { @@ -4659,33 +4693,44 @@ want_provide_opt_args (const char *type, int num) static gboolean questionnaire_one_optional (NmCli *nmc, NMConnection *connection) { - NMMetaSettingType s; + NMMetaSettingType base; gs_unref_ptrarray GPtrArray *infos = NULL; - guint i; + guint i, j; gboolean already_confirmed = FALSE; NMMetaSettingType s_asking = NM_META_SETTING_TYPE_UNKNOWN; + NMMetaSettingType settings[_NM_META_SETTING_TYPE_NUM]; + + base = connection_get_base_meta_setting_type (connection); + + i = 0; + settings[i++] = NM_META_SETTING_TYPE_CONNECTION; + settings[i++] = base; + for (j = 0; j < _NM_META_SETTING_TYPE_NUM; j++) { + if (!NM_IN_SET (j, NM_META_SETTING_TYPE_CONNECTION, base)) + settings[i++] = j; + } infos = g_ptr_array_new (); /* Find first setting with relevant options and count them. */ again: - for (s = 0; s < _NM_META_SETTING_TYPE_NUM; s++) { + for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) { const NMMetaPropertyInfo *const*property_infos; guint p; if ( s_asking != NM_META_SETTING_TYPE_UNKNOWN - && s != s_asking) + && settings[i] != s_asking) continue; - property_infos = nm_meta_setting_infos_editor[s].properties; + property_infos = nm_meta_setting_infos_editor[settings[i]].properties; if (!property_infos) continue; for (p = 0; property_infos[p]; p++) { const NMMetaPropertyInfo *property_info = property_infos[p]; if (_meta_property_needs_bond_hack (property_info)) { - for (i = 0; i < nm_meta_property_typ_data_bond.nested_len; i++) { - const NMMetaNestedPropertyInfo *bi = &nm_meta_property_typ_data_bond.nested[i]; + for (j = 0; j < nm_meta_property_typ_data_bond.nested_len; j++) { + const NMMetaNestedPropertyInfo *bi = &nm_meta_property_typ_data_bond.nested[j]; if (!option_relevant (connection, (const NMMetaAbstractInfo *) bi)) continue; @@ -4700,7 +4745,7 @@ again: } } if (infos->len) { - s_asking = s; + s_asking = settings[i]; break; } } |