about summary refs log tree commit diff
path: root/clients/cli/connections.c
diff options
context:
space:
mode:
Diffstat (limited to 'clients/cli/connections.c')
-rw-r--r--clients/cli/connections.c225
1 files changed, 113 insertions, 112 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index 3714485a..ee7b8fbb 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -1,9 +1,9 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
 /*
  * Copyright (C) 2010 - 2018 Red Hat, Inc.
  */
 
-#include "nm-default.h"
+#include "libnm/nm-default-client.h"
 
 #include "connections.h"
 
@@ -11,7 +11,6 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <signal.h>
-#include <netinet/ether.h>
 #include <readline/readline.h>
 #include <readline/history.h>
 #include <fcntl.h>
@@ -858,30 +857,31 @@ const NmcMetaGenericInfo
 
 /*****************************************************************************/
 
-#define NMC_FIELDS_SETTINGS_NAMES_ALL                                                    \
-    NM_SETTING_CONNECTION_SETTING_NAME                                                   \
-    "," NM_SETTING_MATCH_SETTING_NAME "," NM_SETTING_WIRED_SETTING_NAME                  \
-    "," NM_SETTING_802_1X_SETTING_NAME "," NM_SETTING_WIRELESS_SETTING_NAME              \
-    "," NM_SETTING_WIRELESS_SECURITY_SETTING_NAME "," NM_SETTING_IP4_CONFIG_SETTING_NAME \
-    "," NM_SETTING_IP6_CONFIG_SETTING_NAME "," NM_SETTING_SERIAL_SETTING_NAME            \
-    "," NM_SETTING_WIFI_P2P_SETTING_NAME "," NM_SETTING_PPP_SETTING_NAME                 \
-    "," NM_SETTING_PPPOE_SETTING_NAME "," NM_SETTING_ADSL_SETTING_NAME                   \
-    "," NM_SETTING_GSM_SETTING_NAME "," NM_SETTING_CDMA_SETTING_NAME                     \
-    "," NM_SETTING_BLUETOOTH_SETTING_NAME "," NM_SETTING_OLPC_MESH_SETTING_NAME          \
-    "," NM_SETTING_VPN_SETTING_NAME "," NM_SETTING_INFINIBAND_SETTING_NAME               \
-    "," NM_SETTING_BOND_SETTING_NAME "," NM_SETTING_VLAN_SETTING_NAME                    \
-    "," NM_SETTING_BRIDGE_SETTING_NAME "," NM_SETTING_BRIDGE_PORT_SETTING_NAME           \
-    "," NM_SETTING_TEAM_SETTING_NAME "," NM_SETTING_TEAM_PORT_SETTING_NAME               \
-    "," NM_SETTING_OVS_BRIDGE_SETTING_NAME "," NM_SETTING_OVS_INTERFACE_SETTING_NAME     \
-    "," NM_SETTING_OVS_PATCH_SETTING_NAME "," NM_SETTING_OVS_PORT_SETTING_NAME           \
-    "," NM_SETTING_DCB_SETTING_NAME "," NM_SETTING_TUN_SETTING_NAME                      \
-    "," NM_SETTING_IP_TUNNEL_SETTING_NAME "," NM_SETTING_MACSEC_SETTING_NAME             \
-    "," NM_SETTING_MACVLAN_SETTING_NAME "," NM_SETTING_VXLAN_SETTING_NAME                \
-    "," NM_SETTING_VRF_SETTING_NAME "," NM_SETTING_WPAN_SETTING_NAME                     \
-    "," NM_SETTING_6LOWPAN_SETTING_NAME "," NM_SETTING_WIREGUARD_SETTING_NAME            \
-    "," NM_SETTING_PROXY_SETTING_NAME "," NM_SETTING_TC_CONFIG_SETTING_NAME              \
-    "," NM_SETTING_SRIOV_SETTING_NAME "," NM_SETTING_ETHTOOL_SETTING_NAME                \
-    "," NM_SETTING_OVS_DPDK_SETTING_NAME /* NM_SETTING_DUMMY_SETTING_NAME NM_SETTING_WIMAX_SETTING_NAME */
+#define NMC_FIELDS_SETTINGS_NAMES_ALL                                                  \
+    NM_SETTING_CONNECTION_SETTING_NAME                                                 \
+    "," NM_SETTING_MATCH_SETTING_NAME "," NM_SETTING_WIRED_SETTING_NAME                \
+    "," NM_SETTING_VETH_SETTING_NAME "," NM_SETTING_802_1X_SETTING_NAME                \
+    "," NM_SETTING_WIRELESS_SETTING_NAME "," NM_SETTING_WIRELESS_SECURITY_SETTING_NAME \
+    "," NM_SETTING_IP4_CONFIG_SETTING_NAME "," NM_SETTING_IP6_CONFIG_SETTING_NAME      \
+    "," NM_SETTING_SERIAL_SETTING_NAME "," NM_SETTING_WIFI_P2P_SETTING_NAME            \
+    "," NM_SETTING_PPP_SETTING_NAME "," NM_SETTING_PPPOE_SETTING_NAME                  \
+    "," NM_SETTING_ADSL_SETTING_NAME "," NM_SETTING_GSM_SETTING_NAME                   \
+    "," NM_SETTING_CDMA_SETTING_NAME "," NM_SETTING_BLUETOOTH_SETTING_NAME             \
+    "," NM_SETTING_OLPC_MESH_SETTING_NAME "," NM_SETTING_VPN_SETTING_NAME              \
+    "," NM_SETTING_INFINIBAND_SETTING_NAME "," NM_SETTING_BOND_SETTING_NAME            \
+    "," NM_SETTING_VLAN_SETTING_NAME "," NM_SETTING_BRIDGE_SETTING_NAME                \
+    "," NM_SETTING_BRIDGE_PORT_SETTING_NAME "," NM_SETTING_TEAM_SETTING_NAME           \
+    "," NM_SETTING_TEAM_PORT_SETTING_NAME "," NM_SETTING_OVS_BRIDGE_SETTING_NAME       \
+    "," NM_SETTING_OVS_INTERFACE_SETTING_NAME "," NM_SETTING_OVS_PATCH_SETTING_NAME    \
+    "," NM_SETTING_OVS_PORT_SETTING_NAME "," NM_SETTING_DCB_SETTING_NAME               \
+    "," NM_SETTING_TUN_SETTING_NAME "," NM_SETTING_IP_TUNNEL_SETTING_NAME              \
+    "," NM_SETTING_MACSEC_SETTING_NAME "," NM_SETTING_MACVLAN_SETTING_NAME             \
+    "," NM_SETTING_VXLAN_SETTING_NAME "," NM_SETTING_VRF_SETTING_NAME                  \
+    "," NM_SETTING_WPAN_SETTING_NAME "," NM_SETTING_6LOWPAN_SETTING_NAME               \
+    "," NM_SETTING_WIREGUARD_SETTING_NAME "," NM_SETTING_PROXY_SETTING_NAME            \
+    "," NM_SETTING_TC_CONFIG_SETTING_NAME "," NM_SETTING_SRIOV_SETTING_NAME            \
+    "," NM_SETTING_ETHTOOL_SETTING_NAME "," NM_SETTING_OVS_DPDK_SETTING_NAME           \
+    "," NM_SETTING_HOSTNAME_SETTING_NAME /* NM_SETTING_DUMMY_SETTING_NAME NM_SETTING_WIMAX_SETTING_NAME */
 
 const NmcMetaGenericInfo *const nmc_fields_con_active_details_groups[] = {
     NMC_META_GENERIC_WITH_NESTED("GENERAL", metagen_con_active_general), /* 0 */
@@ -1102,7 +1102,7 @@ usage_connection_add(void)
                  "                  mode vepa|bridge|private|passthru|source\n"
                  "                  [tap yes|no]\n\n"
                  "    vxlan:        id <VXLAN ID>\n"
-                 "                  remote <IP of multicast group or remote address>\n"
+                 "                  [remote <IP of multicast group or remote address>]\n"
                  "                  [local <source IP>]\n"
                  "                  [dev <parent device (ifname or connection UUID)>]\n"
                  "                  [source-port-min <0-65535>]\n"
@@ -4957,6 +4957,10 @@ nmc_process_connection_properties(NmCli *             nmc,
         const char *                             option;
         const char *                             value = NULL;
         const char *                             tmp;
+        const NMMetaAbstractInfo *               chosen              = NULL;
+        const char *                             chosen_setting_name = NULL;
+        const char *                             chosen_option       = NULL;
+        NMMetaSettingType                        s;
 
         if (!con_settings(connection, &type_settings, &slv_settings, error))
             return FALSE;
@@ -5020,25 +5024,24 @@ nmc_process_connection_properties(NmCli *             nmc,
 
             ss = is_setting_valid(connection, type_settings, slv_settings, setting_name);
             if (!ss) {
-                if (check_valid_name(setting_name, type_settings, slv_settings, NULL)) {
-                    g_set_error(error,
-                                NMCLI_ERROR,
-                                NMC_RESULT_ERROR_USER_INPUT,
-                                _("Setting '%s' is not present in the connection."),
-                                setting_name);
-                } else {
+                if (!check_valid_name(setting_name, type_settings, slv_settings, NULL)) {
                     g_set_error(error,
                                 NMCLI_ERROR,
                                 NMC_RESULT_ERROR_USER_INPUT,
                                 _("Error: invalid setting argument '%s'."),
                                 setting_name);
+                    return FALSE;
                 }
-                return FALSE;
+                continue;
             }
 
             if (!connection_remove_setting(connection, ss, error))
                 return FALSE;
-        } else if ((tmp = strchr(option, '.'))) {
+
+            continue;
+        }
+
+        if ((tmp = strchr(option, '.'))) {
             gs_free char *option_sett = g_strndup(option, tmp - option);
             const char *  option_prop = &tmp[1];
             const char *  option_sett_expanded;
@@ -5081,58 +5084,35 @@ nmc_process_connection_properties(NmCli *             nmc,
                               modifier,
                               error))
                 return FALSE;
-        } else {
-            const NMMetaAbstractInfo *chosen              = NULL;
-            const char *              chosen_setting_name = NULL;
-            const char *              chosen_option       = NULL;
-            NMMetaSettingType         s;
-
-            /* Let's see if this is an property alias (such as "id", "mode", "type" or "con-name")*/
-            for (s = 0; s < _NM_META_SETTING_TYPE_NUM; s++) {
-                const NMMetaPropertyInfo *const *property_infos;
-                guint                            p;
-
-                if (!check_valid_name(nm_meta_setting_infos[s].setting_name,
-                                      type_settings,
-                                      slv_settings,
-                                      NULL))
-                    continue;
 
-                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];
-
-                    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 (!nm_streq0(bi->base.property_alias, option))
-                                continue;
-                            if (chosen) {
-                                g_set_error(error,
-                                            NMCLI_ERROR,
-                                            NMC_RESULT_ERROR_USER_INPUT,
-                                            _("Error: '%s' is ambiguous (%s.%s or %s.%s)."),
-                                            option,
-                                            chosen_setting_name,
-                                            chosen_option,
-                                            nm_meta_setting_infos[s].setting_name,
-                                            option);
-                                return FALSE;
-                            }
-                            chosen_setting_name = nm_meta_setting_infos[s].setting_name;
-                            chosen_option       = option;
-                            chosen              = (const NMMetaAbstractInfo *) bi;
-                        }
-                    } else {
-                        if (!property_info->is_cli_option)
-                            continue;
-                        if (!nm_streq0(property_info->property_alias, option))
+            continue;
+        }
+
+        /* Let's see if this is an property alias (such as "id", "mode", "type" or "con-name")*/
+        for (s = 0; s < _NM_META_SETTING_TYPE_NUM; s++) {
+            const NMMetaPropertyInfo *const *property_infos;
+            guint                            p;
+
+            if (!check_valid_name(nm_meta_setting_infos[s].setting_name,
+                                  type_settings,
+                                  slv_settings,
+                                  NULL))
+                continue;
+
+            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];
+
+                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 (!nm_streq0(bi->base.property_alias, option))
                             continue;
                         if (chosen) {
                             g_set_error(error,
@@ -5148,39 +5128,60 @@ nmc_process_connection_properties(NmCli *             nmc,
                         }
                         chosen_setting_name = nm_meta_setting_infos[s].setting_name;
                         chosen_option       = option;
-                        chosen              = (const NMMetaAbstractInfo *) property_info;
+                        chosen              = (const NMMetaAbstractInfo *) bi;
                     }
+                } else {
+                    if (!property_info->is_cli_option)
+                        continue;
+                    if (!nm_streq0(property_info->property_alias, option))
+                        continue;
+                    if (chosen) {
+                        g_set_error(error,
+                                    NMCLI_ERROR,
+                                    NMC_RESULT_ERROR_USER_INPUT,
+                                    _("Error: '%s' is ambiguous (%s.%s or %s.%s)."),
+                                    option,
+                                    chosen_setting_name,
+                                    chosen_option,
+                                    nm_meta_setting_infos[s].setting_name,
+                                    option);
+                        return FALSE;
+                    }
+                    chosen_setting_name = nm_meta_setting_infos[s].setting_name;
+                    chosen_option       = option;
+                    chosen              = (const NMMetaAbstractInfo *) property_info;
                 }
             }
+        }
 
-            if (!chosen) {
-                if (*argc == 1 && nmc->complete) {
-                    if (allow_setting_removal && g_str_has_prefix("remove", option))
-                        g_print("remove\n");
-                    complete_property_name(nmc, connection, modifier, option, NULL);
-                }
-                g_set_error(error,
-                            NMCLI_ERROR,
-                            NMC_RESULT_ERROR_USER_INPUT,
-                            _("Error: invalid <setting>.<property> '%s'."),
-                            option);
-                return FALSE;
+        if (!chosen) {
+            if (*argc == 1 && nmc->complete) {
+                if (allow_setting_removal && g_str_has_prefix("remove", option))
+                    g_print("remove\n");
+                complete_property_name(nmc, connection, modifier, option, NULL);
             }
+            g_set_error(error,
+                        NMCLI_ERROR,
+                        NMC_RESULT_ERROR_USER_INPUT,
+                        _("Error: invalid <setting>.<property> '%s'."),
+                        option);
+            return FALSE;
+        }
 
-            if (*argc == 1 && nmc->complete)
-                complete_property_name(nmc, connection, modifier, option, NULL);
+        if (*argc == 1 && nmc->complete)
+            complete_property_name(nmc, connection, modifier, option, NULL);
 
-            (*argc)--;
-            (*argv)++;
-            if (!get_value(&value, argc, argv, option_orig, error))
-                return FALSE;
+        (*argc)--;
+        (*argv)++;
+        if (!get_value(&value, argc, argv, option_orig, error))
+            return FALSE;
 
-            if (!*argc && nmc->complete)
-                complete_option(nmc, chosen, value ?: "", connection);
+        if (!*argc && nmc->complete)
+            complete_option(nmc, chosen, value ?: "", connection);
+
+        if (!set_option(nmc, connection, chosen, value, error))
+            return FALSE;
 
-            if (!set_option(nmc, connection, chosen, value, error))
-                return FALSE;
-        }
     } while (*argc);
 
     return TRUE;