cli: cleanup parsing of VLAN ingress/egress priority map

Use new ValueStrsplitMode "VALUE_STRSPLIT_MODE_STRIPPED".

Note that this is not exactly what we did before. For example, empty
tokens are now silently removed.

Also, we accept now whitespace as separators.
This commit is contained in:
Thomas Haller
2019-03-20 13:41:28 +01:00
parent c0d83ef522
commit 28f0153350

View File

@@ -77,6 +77,7 @@ _gtype_property_get_gtype (GType gtype, const char *property_name)
/*****************************************************************************/ /*****************************************************************************/
typedef enum { typedef enum {
VALUE_STRSPLIT_MODE_STRIPPED,
VALUE_STRSPLIT_MODE_OBJLIST, VALUE_STRSPLIT_MODE_OBJLIST,
VALUE_STRSPLIT_MODE_MULTILIST, VALUE_STRSPLIT_MODE_MULTILIST,
VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE, VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE,
@@ -97,6 +98,9 @@ _value_strsplit (const char *value,
/* note that all modes remove empty tokens (",", "a,,b", ",,"). */ /* note that all modes remove empty tokens (",", "a,,b", ",,"). */
switch (split_mode) { switch (split_mode) {
case VALUE_STRSPLIT_MODE_STRIPPED:
strv = nm_utils_strsplit_set (value, NM_ASCII_SPACES",", FALSE);
break;
case VALUE_STRSPLIT_MODE_OBJLIST: case VALUE_STRSPLIT_MODE_OBJLIST:
strv = nm_utils_strsplit_set (value, ",", FALSE); strv = nm_utils_strsplit_set (value, ",", FALSE);
break; break;
@@ -460,40 +464,6 @@ _parse_team_link_watcher (const char *str,
#define MAX_SKB_PRIO G_MAXUINT32 #define MAX_SKB_PRIO G_MAXUINT32
#define MAX_8021P_PRIO 7 /* Max 802.1p priority */ #define MAX_8021P_PRIO 7 /* Max 802.1p priority */
/*
* Parse VLAN priority mappings from the following format: 2:1,3:4,7:3
* and verify if the priority numbers are valid
*
* Return: string array with split maps, or NULL on error
* Caller is responsible for freeing the array.
*/
static char **
_parse_vlan_priority_maps (const char *priority_map,
NMVlanPriorityMap map_type,
gboolean allow_wildcard_to,
GError **error)
{
gs_strfreev char **mapping = NULL;
char **iter;
nm_assert (priority_map);
nm_assert (!error || !*error);
mapping = g_strsplit (priority_map, ",", 0);
for (iter = mapping; *iter; iter++) {
if (!nm_utils_vlan_priority_map_parse_str (map_type,
*iter,
allow_wildcard_to,
NULL,
NULL,
NULL)) {
g_set_error (error, 1, 0, _("invalid priority map '%s'"), *iter);
return NULL;
}
}
return g_steal_pointer (&mapping);
}
/* /*
* nmc_proxy_check_script: * nmc_proxy_check_script:
* @script: file name with PAC script, or raw PAC Script data * @script: file name with PAC script, or raw PAC Script data
@@ -3517,25 +3487,32 @@ static gboolean
_set_fcn_vlan_xgress_priority_map (ARGS_SET_FCN) _set_fcn_vlan_xgress_priority_map (ARGS_SET_FCN)
{ {
NMVlanPriorityMap map_type = _vlan_priority_map_type_from_property_info (property_info); NMVlanPriorityMap map_type = _vlan_priority_map_type_from_property_info (property_info);
gs_strfreev char **prio_map = NULL; gs_free const char **prio_map = NULL;
gsize i; gsize i, len;
if (_SET_FCN_DO_RESET_DEFAULT_WITH_SUPPORTS_REMOVE (property_info, modifier, value)) { if (_SET_FCN_DO_RESET_DEFAULT_WITH_SUPPORTS_REMOVE (property_info, modifier, value)) {
nm_setting_vlan_clear_priorities (NM_SETTING_VLAN (setting), map_type); nm_setting_vlan_clear_priorities (NM_SETTING_VLAN (setting), map_type);
return TRUE; return TRUE;
} }
prio_map = _parse_vlan_priority_maps (value, prio_map = _value_strsplit (value, VALUE_STRSPLIT_MODE_STRIPPED, &len);
map_type,
_SET_FCN_DO_REMOVE (modifier, value), for (i = 0; i < len; i++) {
error); if (!nm_utils_vlan_priority_map_parse_str (map_type,
if (!prio_map) prio_map[i],
return FALSE; _SET_FCN_DO_REMOVE (modifier, value),
NULL,
NULL,
NULL)) {
g_set_error (error, 1, 0, _("invalid priority map '%s'"), prio_map[i]);
return FALSE;
}
}
if (_SET_FCN_DO_SET_ALL (modifier, value)) if (_SET_FCN_DO_SET_ALL (modifier, value))
nm_setting_vlan_clear_priorities (NM_SETTING_VLAN (setting), map_type); nm_setting_vlan_clear_priorities (NM_SETTING_VLAN (setting), map_type);
for (i = 0; prio_map[i]; i++) { for (i = 0; i < len; i++) {
if (_SET_FCN_DO_REMOVE (modifier, value)) { if (_SET_FCN_DO_REMOVE (modifier, value)) {
nm_setting_vlan_remove_priority_str_by_value (NM_SETTING_VLAN (setting), nm_setting_vlan_remove_priority_str_by_value (NM_SETTING_VLAN (setting),
map_type, map_type,