cli: add new style for tokenizing/concatenating list options in nmcli
nmcli supports list options (optlist and multilist properties).
These commonly are individual items, concatenated by a delimiter.
It should be generally possibly to express every value. That means, we
need some for of escaping mechanism for delimiters.
Currently this is all inconsistent or no escaping is supported. I intend
to fix that (which will be a change in behavior).
For now, just add yet another style of tokenzing/concatenating list
items in nmcli. This is the style to replace all other styles.
(cherry picked from commit ba956bd499
)
This commit is contained in:
@@ -167,12 +167,16 @@ _value_str_as_index_list (const char *value, gsize *out_len)
|
|||||||
|
|
||||||
#define MULTILIST_WITH_ESCAPE_CHARS NM_ASCII_SPACES","
|
#define MULTILIST_WITH_ESCAPE_CHARS NM_ASCII_SPACES","
|
||||||
|
|
||||||
|
#define ESCAPED_TOKENS_DELIMTER ','
|
||||||
|
#define ESCAPED_TOKENS_DELIMTERS ","
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
VALUE_STRSPLIT_MODE_STRIPPED,
|
VALUE_STRSPLIT_MODE_STRIPPED,
|
||||||
VALUE_STRSPLIT_MODE_OBJLIST,
|
VALUE_STRSPLIT_MODE_OBJLIST,
|
||||||
VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE,
|
VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE,
|
||||||
VALUE_STRSPLIT_MODE_MULTILIST,
|
VALUE_STRSPLIT_MODE_MULTILIST,
|
||||||
VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE,
|
VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE,
|
||||||
|
VALUE_STRSPLIT_MODE_ESCAPED_TOKENS,
|
||||||
} ValueStrsplitMode;
|
} ValueStrsplitMode;
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
@@ -211,6 +215,10 @@ _value_strsplit (const char *value,
|
|||||||
case VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE:
|
case VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE:
|
||||||
strv = nm_utils_strsplit_set_full (value, MULTILIST_WITH_ESCAPE_CHARS, NM_UTILS_STRSPLIT_SET_FLAGS_ALLOW_ESCAPING);
|
strv = nm_utils_strsplit_set_full (value, MULTILIST_WITH_ESCAPE_CHARS, NM_UTILS_STRSPLIT_SET_FLAGS_ALLOW_ESCAPING);
|
||||||
break;
|
break;
|
||||||
|
case VALUE_STRSPLIT_MODE_ESCAPED_TOKENS:
|
||||||
|
strv = nm_utils_escaped_tokens_split (value, ESCAPED_TOKENS_DELIMTERS);
|
||||||
|
NM_SET_OUT (out_len, NM_PTRARRAY_LEN (strv));
|
||||||
|
return g_steal_pointer (&strv);
|
||||||
default:
|
default:
|
||||||
nm_assert_not_reached ();
|
nm_assert_not_reached ();
|
||||||
break;
|
break;
|
||||||
@@ -1882,9 +1890,11 @@ _set_fcn_multilist (ARGS_SET_FCN)
|
|||||||
}
|
}
|
||||||
|
|
||||||
strv = _value_strsplit (value,
|
strv = _value_strsplit (value,
|
||||||
property_info->property_typ_data->subtype.multilist.strsplit_with_escape
|
property_info->property_typ_data->subtype.multilist.strsplit_escaped_tokens
|
||||||
? VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE
|
? VALUE_STRSPLIT_MODE_ESCAPED_TOKENS
|
||||||
: VALUE_STRSPLIT_MODE_MULTILIST,
|
: ( property_info->property_typ_data->subtype.multilist.strsplit_with_escape
|
||||||
|
? VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE
|
||||||
|
: VALUE_STRSPLIT_MODE_OBJLIST),
|
||||||
&nstrv);
|
&nstrv);
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
@@ -3061,9 +3071,11 @@ _get_fcn_objlist (ARGS_GET_FCN)
|
|||||||
if ( get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY
|
if ( get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY
|
||||||
&& property_info->property_typ_data->subtype.objlist.delimit_pretty_with_semicolon)
|
&& property_info->property_typ_data->subtype.objlist.delimit_pretty_with_semicolon)
|
||||||
g_string_append (str, "; ");
|
g_string_append (str, "; ");
|
||||||
else
|
else {
|
||||||
|
G_STATIC_ASSERT_EXPR (ESCAPED_TOKENS_DELIMTER == ',');
|
||||||
g_string_append (str, ", ");
|
g_string_append (str, ", ");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
start_offset = str->len;
|
start_offset = str->len;
|
||||||
|
|
||||||
@@ -3271,9 +3283,11 @@ _set_fcn_objlist (ARGS_SET_FCN)
|
|||||||
}
|
}
|
||||||
|
|
||||||
strv = _value_strsplit (value,
|
strv = _value_strsplit (value,
|
||||||
property_info->property_typ_data->subtype.objlist.strsplit_with_escape
|
property_info->property_typ_data->subtype.objlist.strsplit_escaped_tokens
|
||||||
|
? VALUE_STRSPLIT_MODE_ESCAPED_TOKENS
|
||||||
|
: ( property_info->property_typ_data->subtype.objlist.strsplit_with_escape
|
||||||
? VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE
|
? VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE
|
||||||
: VALUE_STRSPLIT_MODE_OBJLIST,
|
: VALUE_STRSPLIT_MODE_OBJLIST),
|
||||||
&nstrv);
|
&nstrv);
|
||||||
|
|
||||||
if (_SET_FCN_DO_SET_ALL (modifier, value)) {
|
if (_SET_FCN_DO_SET_ALL (modifier, value)) {
|
||||||
|
@@ -281,6 +281,7 @@ struct _NMMetaPropertyTypData {
|
|||||||
void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx);
|
void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx);
|
||||||
gboolean (*remove_by_value_fcn) (NMSetting *setting, const char *item);
|
gboolean (*remove_by_value_fcn) (NMSetting *setting, const char *item);
|
||||||
bool strsplit_with_escape:1;
|
bool strsplit_with_escape:1;
|
||||||
|
bool strsplit_escaped_tokens:1;
|
||||||
} multilist;
|
} multilist;
|
||||||
struct {
|
struct {
|
||||||
guint (*get_num_fcn) (NMSetting *setting);
|
guint (*get_num_fcn) (NMSetting *setting);
|
||||||
@@ -297,6 +298,7 @@ struct _NMMetaPropertyTypData {
|
|||||||
void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx);
|
void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx);
|
||||||
bool delimit_pretty_with_semicolon:1;
|
bool delimit_pretty_with_semicolon:1;
|
||||||
bool strsplit_with_escape:1;
|
bool strsplit_with_escape:1;
|
||||||
|
bool strsplit_escaped_tokens:1;
|
||||||
} objlist;
|
} objlist;
|
||||||
struct {
|
struct {
|
||||||
gboolean (*set_fcn) (NMSetting *setting,
|
gboolean (*set_fcn) (NMSetting *setting,
|
||||||
|
Reference in New Issue
Block a user