From 242bebfb3d7558afcf68fa6b00cabb761b182d4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Thu, 5 Sep 2013 16:58:33 +0200 Subject: [PATCH] cli: add 'remove' command to the interactive editor remove [.property] | It entirely removes given setting from edited connection. If a property is given, the command instead resets the property to its default value. https://bugzilla.gnome.org/show_bug.cgi?id=707576 --- cli/src/connections.c | 338 +++++++++++++++++++++++++++++------------- 1 file changed, 231 insertions(+), 107 deletions(-) diff --git a/cli/src/connections.c b/cli/src/connections.c index 18075c200..364614760 100644 --- a/cli/src/connections.c +++ b/cli/src/connections.c @@ -1740,169 +1740,170 @@ typedef struct NameItem { const char *name; const char *alias; const struct NameItem *settings; + gboolean mandatory; } NameItem; static const NameItem nmc_ethernet_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, TRUE }, + { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_infiniband_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_INFINIBAND_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_INFINIBAND_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_wifi_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRELESS_SETTING_NAME, "wifi", NULL }, - { NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, "wifi-sec", NULL }, - { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRELESS_SETTING_NAME, "wifi", NULL, TRUE }, + { NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, "wifi-sec", NULL, FALSE }, + { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_wimax_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIMAX_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIMAX_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_gsm_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_GSM_SETTING_NAME, NULL, NULL }, - { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_GSM_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_cdma_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_CDMA_SETTING_NAME, NULL, NULL }, - { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_CDMA_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_mobile_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL }, - { NM_SETTING_PPP_SETTING_NAME, NULL, NULL }, - { NM_SETTING_GSM_SETTING_NAME, NULL, NULL }, - { NM_SETTING_CDMA_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_PPP_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_GSM_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_CDMA_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_bluetooth_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_BLUETOOTH_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_BLUETOOTH_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_adsl_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_ADSL_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_ADSL_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_ppoe_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_PPPOE_SETTING_NAME, NULL, NULL }, - { NM_SETTING_PPP_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE }, + { NM_SETTING_PPPOE_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_PPP_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_olpc_mesh_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_OLPC_MESH_SETTING_NAME, "olpc-mesh", NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_OLPC_MESH_SETTING_NAME, "olpc-mesh", NULL, TRUE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_vpn_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_VPN_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_VPN_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_vlan_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_VLAN_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE }, + { NM_SETTING_VLAN_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_bond_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_BOND_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_BOND_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_team_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_TEAM_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_TEAM_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_bridge_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_BRIDGE_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, - { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_BRIDGE_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE }, + { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_bond_slave_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, TRUE }, + { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_team_slave_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_TEAM_PORT_SETTING_NAME, NULL, NULL }, - { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, TRUE }, + { NM_SETTING_TEAM_PORT_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; static const NameItem nmc_bridge_slave_settings [] = { - { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, - { NM_SETTING_BRIDGE_PORT_SETTING_NAME, NULL, NULL }, - { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, - { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, - { NULL, NULL, NULL } + { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_BRIDGE_PORT_SETTING_NAME, NULL, NULL, TRUE }, + { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, TRUE }, + { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE }, + { NULL, NULL, NULL, FALSE } }; @@ -2053,6 +2054,29 @@ get_valid_settings_array (const char *con_type) return NULL; } +static gboolean +is_setting_mandatory (NMConnection *connection, NMSetting *setting) +{ + NMSettingConnection *s_con; + const char *c_type; + const NameItem *item; + const char *name; + + s_con = nm_connection_get_setting_connection (connection); + g_assert (s_con); + c_type = nm_setting_connection_get_connection_type (s_con); + + name = nm_setting_get_name (setting); + + item = get_valid_settings_array (c_type); + while (item && item->name) { + if (!strcmp (name, item->name)) + return item->mandatory; + item++; + } + return FALSE; +} + /*----------------------------------------------------------------------------*/ static gboolean @@ -4325,7 +4349,7 @@ gen_nmcli_cmds (char *text, int state, const char **commands) static char * gen_nmcli_cmds_menu (char *text, int state) { - const char *commands[] = { "goto", "set", "describe", "print", "verify", + const char *commands[] = { "goto", "set", "remove", "describe", "print", "verify", "save", "back", "help", "quit", "nmcli", NULL }; return gen_nmcli_cmds (text, state, commands); @@ -4545,6 +4569,7 @@ nmcli_editor_tab_completion (char *text, int start, int end) else generator_func = gen_property_names; } else if ( should_complete_cmd (line, "set ") + || should_complete_cmd (line, "remove ") || should_complete_cmd (line, "describe ")) { if (level == 0 && !strchr (line, '.')) { generator_func = gen_setting_names; @@ -4793,6 +4818,7 @@ editor_show_setting (NMSetting *setting, NmCli *nmc) typedef enum { NMC_EDITOR_MAIN_CMD_UNKNOWN = 0, NMC_EDITOR_MAIN_CMD_GOTO, + NMC_EDITOR_MAIN_CMD_REMOVE, NMC_EDITOR_MAIN_CMD_SET, NMC_EDITOR_MAIN_CMD_DESCRIBE, NMC_EDITOR_MAIN_CMD_PRINT, @@ -4819,6 +4845,8 @@ parse_editor_main_cmd (const char *cmd, char **cmd_arg) if (matches (vec[0], "goto") == 0) editor_cmd = NMC_EDITOR_MAIN_CMD_GOTO; + else if (matches (vec[0], "remove") == 0) + editor_cmd = NMC_EDITOR_MAIN_CMD_REMOVE; else if (matches (vec[0], "set") == 0) editor_cmd = NMC_EDITOR_MAIN_CMD_SET; else if (matches (vec[0], "describe") == 0) @@ -4855,6 +4883,7 @@ editor_main_usage (void) */ printf (_("---[ Main menu ]---\n" "goto [ | ] :: go to a setting or property\n" + "remove [.] | :: remove setting or reset property value\n" "set [. ] :: set property value\n" "describe [.] :: describe property\n" "print [all] :: print the connection\n" @@ -4884,6 +4913,13 @@ editor_main_help (const char *command) " nmcli connection> goto secondaries\n" " nmcli> goto ipv4.addresses\n")); break; + case NMC_EDITOR_MAIN_CMD_REMOVE: + printf (_("remove [.] :: remove setting or reset property value\n\n" + "This command removes an entire setting from the connection, or if a property\n" + "is given, resets that property to the default value.\n\n" + "Examples: nmcli> remove wifi-sec\n" + " nmcli> remove eth.mtu\n")); + break; case NMC_EDITOR_MAIN_CMD_SET: printf (_("set [. ] :: set property value\n\n" "This command sets property value.\n\n" @@ -5142,6 +5178,21 @@ print_setting_description (NMSetting *setting) g_strfreev (all_props); } +static gboolean +connection_remove_setting (NMConnection *connection, NMSetting *setting) +{ + gboolean mandatory; + + mandatory = is_setting_mandatory (connection, setting); + if (!mandatory) { + nm_connection_remove_setting (connection, G_OBJECT_TYPE (setting)); + return TRUE; + } + printf (_("Error: setting '%s' is mandatory and cannot be removed.\n"), + nm_setting_get_name (setting)); + return FALSE; +} + static void editor_show_status_line (NMConnection *connection, gboolean dirty) { @@ -5720,6 +5771,79 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t } break; + case NMC_EDITOR_MAIN_CMD_REMOVE: + /* Remove setting from connection, or delete value of a property */ + if (!cmd_arg) { + if (menu_ctx.level == 1) { + const char *prop_name; + + prop_name = ask_check_property (cmd_arg, + (const char **) menu_ctx.valid_props, + menu_ctx.valid_props_str); + if (!prop_name) + break; + + /* Delete property value */ + nmc_property_set_default_value (menu_ctx.curr_setting, prop_name); + } else + printf (_("Error: no argument given; valid are [%s]\n"), valid_settings_str); + } else { + NMSetting *ss = NULL; + gboolean descr_all; + char *user_s; + + /* cmd_arg_s != NULL means argument is "setting.property" */ + descr_all = !cmd_arg_s && !menu_ctx.curr_setting; + user_s = descr_all ? cmd_arg_p : cmd_arg_s ? cmd_arg_s : NULL; + if (user_s) { + ss = is_setting_valid (connection, valid_settings_arr, user_s); + if (!ss) { + if (check_valid_name (user_s, valid_settings_arr, NULL)) + printf (_("Setting '%s' is not present in the connection.\n"), user_s); + else + printf (_("Error: invalid setting argument '%s'; valid are [%s]\n"), + user_s, valid_settings_str); + break; + } + } else + ss = menu_ctx.curr_setting; + + if (descr_all) { + /* Remove setting from the connection */ + connection_remove_setting (connection, ss); + if (ss == menu_ctx.curr_setting) { + /* If we removed the setting we are in, go up */ + menu_switch_to_level0 (&menu_ctx, BASE_PROMPT, nmc->editor_prompt_color); + nmc_completion_setting = NULL; /* for TAB completion */ + } + } else { + GError *tmp_err = NULL; + char *prop_name = is_property_valid (ss, cmd_arg_p, &tmp_err); + if (prop_name) { + /* Delete property value */ + nmc_property_set_default_value (ss, prop_name); + } else { + /* If the string is not a property, try it as a setting */ + NMSetting *s_tmp; + s_tmp = is_setting_valid (connection, valid_settings_arr, cmd_arg_p); + if (s_tmp) { + /* Remove setting from the connection */ + connection_remove_setting (connection, s_tmp); + if (ss == menu_ctx.curr_setting) { + /* If we removed the setting we are in, go up */ + menu_switch_to_level0 (&menu_ctx, BASE_PROMPT, nmc->editor_prompt_color); + nmc_completion_setting = NULL; /* for TAB completion */ + } + } else + printf (_("Error: %s properties, nor it is a setting name.\n"), + tmp_err->message); + g_clear_error (&tmp_err); + } + g_free (prop_name); + } + } + break; + case NMC_EDITOR_MAIN_CMD_DESCRIBE: /* Print property description */ if (!cmd_arg) {