diff options
author | Thomas Haller <thaller@redhat.com> | 2019-03-25 17:35:58 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-03-27 16:23:30 +0100 |
commit | 71e40f519d65ae8781db2b92d0651f7275922311 (patch) | |
tree | b66c41ffc707d26b67769b9f88297128bfaeaab7 /clients/common | |
parent | 408d637930ca5c4b35608b35e4584b3561663adf (diff) | |
download | NetworkManager-71e40f519d65ae8781db2b92d0651f7275922311.tar.gz |
cli: support escaping for splitting for objlist properties
Diffstat (limited to 'clients/common')
-rw-r--r-- | clients/common/nm-meta-setting-desc.c | 40 | ||||
-rw-r--r-- | clients/common/nm-meta-setting-desc.h | 5 |
2 files changed, 39 insertions, 6 deletions
diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c index 7a20196a0d..b307ebe01b 100644 --- a/clients/common/nm-meta-setting-desc.c +++ b/clients/common/nm-meta-setting-desc.c @@ -170,6 +170,7 @@ _value_str_as_index_list (const char *value, gsize *out_len) typedef enum { VALUE_STRSPLIT_MODE_STRIPPED, VALUE_STRSPLIT_MODE_OBJLIST, + VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE, VALUE_STRSPLIT_MODE_MULTILIST, VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE, } ValueStrsplitMode; @@ -201,6 +202,9 @@ _value_strsplit (const char *value, case VALUE_STRSPLIT_MODE_OBJLIST: strv = nm_utils_strsplit_set (value, ",", FALSE); break; + case VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE: + strv = nm_utils_strsplit_set (value, ",", TRUE); + break; case VALUE_STRSPLIT_MODE_MULTILIST: strv = nm_utils_strsplit_set (value, " \t,", FALSE); break; @@ -227,6 +231,8 @@ _value_strsplit (const char *value, if (split_mode == VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE) _nm_utils_unescape_plain ((char *) s, MULTILIST_WITH_ESCAPE_CHARS, TRUE); + else if (split_mode == VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE) + _nm_utils_unescape_plain ((char *) s, ",", TRUE); else g_strchomp ((char *) s); @@ -1876,7 +1882,7 @@ _set_fcn_multilist (ARGS_SET_FCN) } strv = _value_strsplit (value, - property_info->property_typ_data->subtype.multilist.with_escaped_spaces + property_info->property_typ_data->subtype.multilist.strsplit_with_escape ? VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE : VALUE_STRSPLIT_MODE_MULTILIST, &nstrv); @@ -3049,6 +3055,10 @@ _get_fcn_objlist (ARGS_GET_FCN) num = property_info->property_typ_data->subtype.objlist.get_num_fcn (setting); for (idx = 0; idx < num; idx++) { +#if NM_MORE_ASSERTS + gsize start_offset; +#endif + if (!str) str = g_string_new (NULL); else if (str->len > 0) { @@ -3059,10 +3069,32 @@ _get_fcn_objlist (ARGS_GET_FCN) g_string_append (str, ", "); } +#if NM_MORE_ASSERTS + start_offset = str->len; +#endif + property_info->property_typ_data->subtype.objlist.obj_to_str_fcn (get_type, setting, idx, str); + +#if NM_MORE_ASSERTS + nm_assert (start_offset < str->len); + if ( property_info->property_typ_data->subtype.objlist.strsplit_with_escape + && get_type != NM_META_ACCESSOR_GET_TYPE_PRETTY) { + /* if the strsplit is done with VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE, then the appended + * value must have no unescaped ','. */ + for (; start_offset < str->len; ) { + if (str->str[start_offset] == '\\') { + start_offset++; + nm_assert (start_offset < str->len); + nm_assert (!NM_IN_SET (str->str[start_offset], '\0')); + } else + nm_assert (!NM_IN_SET (str->str[start_offset], '\0', ',')); + start_offset++; + } + } +#endif } NM_SET_OUT (out_is_default, num == 0); @@ -3237,7 +3269,9 @@ _set_fcn_objlist (ARGS_SET_FCN) } strv = _value_strsplit (value, - VALUE_STRSPLIT_MODE_OBJLIST, + property_info->property_typ_data->subtype.objlist.strsplit_with_escape + ? VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE + : VALUE_STRSPLIT_MODE_OBJLIST, &nstrv); if (_SET_FCN_DO_SET_ALL (modifier, value)) { @@ -5983,7 +6017,7 @@ static const NMMetaPropertyInfo *const property_infos_MATCH[] = { .add2_fcn = MULTILIST_ADD2_FCN (NMSettingMatch, nm_setting_match_add_interface_name), .remove_by_idx_fcn_s = MULTILIST_REMOVE_BY_IDX_FCN_S (NMSettingMatch, nm_setting_match_remove_interface_name), .remove_by_value_fcn = MULTILIST_REMOVE_BY_VALUE_FCN (NMSettingMatch, nm_setting_match_remove_interface_name_by_value), - .with_escaped_spaces = TRUE, + .strsplit_with_escape = TRUE, ), ), ), diff --git a/clients/common/nm-meta-setting-desc.h b/clients/common/nm-meta-setting-desc.h index cc94c2547d..15c0e81eb0 100644 --- a/clients/common/nm-meta-setting-desc.h +++ b/clients/common/nm-meta-setting-desc.h @@ -280,9 +280,7 @@ struct _NMMetaPropertyTypData { void (*remove_by_idx_fcn_u) (NMSetting *setting, guint idx); void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx); gboolean (*remove_by_value_fcn) (NMSetting *setting, const char *item); - - /* if true, separate the list by space and allow backslash escaping. */ - bool with_escaped_spaces:1; + bool strsplit_with_escape:1; } multilist; struct { guint (*get_num_fcn) (NMSetting *setting); @@ -298,6 +296,7 @@ struct _NMMetaPropertyTypData { void (*remove_by_idx_fcn_u) (NMSetting *setting, guint idx); void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx); bool delimit_pretty_with_semicolon:1; + bool strsplit_with_escape:1; } objlist; struct { gboolean (*set_fcn) (NMSetting *setting, |