diff options
author | Mikael Kanstrup <mikael.kanstrup@gmail.com> | 2016-02-03 12:14:15 +0100 |
---|---|---|
committer | Roland Knall <rknall@gmail.com> | 2016-02-11 06:40:16 +0000 |
commit | 7a1eca1726609fcc75594c688756621c3329a509 (patch) | |
tree | b4ba0bf5c915a8eeb12fa764009312ef78a8852d /extcap.c | |
parent | fa56b68f4fc9b25eba4993a34eaa5807d9182d37 (diff) | |
download | wireshark-7a1eca1726609fcc75594c688756621c3329a509.tar.gz |
extcap: Convert settings to preference friendly key names
Preferences are only allowed to contain lowercase ASCII letters,
numbers, underscores or dot characters. Create a utility function
to convert an extcap setting to its equivalent preference key and
use it wherever conversion from setting to preference key is needed.
Bug: 12064
Change-Id: I39bbac7de5f0f905bd41c54257fa997a3b32442d
Reviewed-on: https://code.wireshark.org/review/13687
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Roland Knall <rknall@gmail.com>
Diffstat (limited to 'extcap.c')
-rw-r--r-- | extcap.c | 72 |
1 files changed, 46 insertions, 26 deletions
@@ -461,6 +461,34 @@ static void extcap_free_if_configuration(GList *list) g_list_free(list); } +gchar * extcap_settings_key(const gchar * ifname, const gchar * setting) +{ + gchar * setting_nohyphen; + gchar * ifname_underscore; + gchar * ifname_lower; + gchar * key; + GRegex * regex = g_regex_new ("(?![a-zA-Z1-9_]).", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, NULL ); + + if (!regex) + return NULL; + + setting_nohyphen = + g_regex_replace_literal(regex, setting, strlen(setting), 0, + "", (GRegexMatchFlags) 0, NULL ); + ifname_underscore = + g_regex_replace_literal(regex, ifname, strlen(ifname), 0, + "_", (GRegexMatchFlags) 0, NULL ); + ifname_lower = g_utf8_strdown(ifname_underscore, -1); + key = g_strconcat(ifname_lower, ".", setting_nohyphen, NULL); + + g_free(setting_nohyphen); + g_free(ifname_underscore); + g_free(ifname_lower); + g_regex_unref(regex); + + return key; +} + static gboolean search_cb(const gchar *extcap _U_, const gchar *ifname _U_, gchar *output, void *data, char **err_str _U_) { extcap_token_sentence *tokens = NULL; @@ -482,37 +510,29 @@ static gboolean search_cb(const gchar *extcap _U_, const gchar *ifname _U_, gcha if ( dev_module ) { GList * walker = arguments; - GRegex * regex = g_regex_new ("[-]+", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, NULL ); - if (regex) { - while ( walker != NULL ) { - extcap_arg * arg = (extcap_arg *)walker->data; - - if ( arg->save ) { - struct preference * pref = NULL; + while ( walker != NULL ) { + extcap_arg * arg = (extcap_arg *)walker->data; - gchar * pref_name = g_regex_replace(regex, arg->call, strlen(arg->call), 0, "", (GRegexMatchFlags) 0, NULL ); - gchar * pref_ifname = g_strdup(g_strconcat(ifname, ".", pref_name, NULL)); + if ( arg->save ) { + struct preference * pref = NULL; + gchar * pref_ifname = extcap_settings_key(ifname, arg->call); - if ( ( pref = prefs_find_preference(dev_module, pref_ifname) ) == NULL ) { - /* Set an initial value */ - if ( ! arg->storeval && arg->default_complex ) - arg->storeval = g_strdup(arg->default_complex->_val); + if ( ( pref = prefs_find_preference(dev_module, pref_ifname) ) == NULL ) { + /* Set an initial value */ + if ( ! arg->storeval && arg->default_complex ) + arg->storeval = g_strdup(arg->default_complex->_val); - prefs_register_string_preference(dev_module, g_strdup(pref_ifname), - arg->display, arg->display, (const gchar **)&(arg->storeval)); - } else { - /* Been here before, restore stored value */ - if (! arg->storeval && pref->varp.string) - arg->storeval = g_strdup(*(pref->varp.string)); + prefs_register_string_preference(dev_module, g_strdup(pref_ifname), + arg->display, arg->display, (const gchar **)&(arg->storeval)); + } else { + /* Been here before, restore stored value */ + if (! arg->storeval && pref->varp.string) + arg->storeval = g_strdup(*(pref->varp.string)); } - - g_free(pref_name); - g_free(pref_ifname); - } - - walker = g_list_next(walker); + g_free(pref_ifname); } - g_regex_unref(regex); + + walker = g_list_next(walker); } } |