diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-09-30 22:06:19 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-09-30 22:06:19 +0200 |
commit | 7fd0ac27eb14bb0b45626a1747009266212c0634 (patch) | |
tree | da27300140c7f1512d7d394e4ac64a06d50521d2 | |
parent | 64f52fc63f5b0d3ca0fb5c390b11b1cd1636021b (diff) |
mbimcli,sar: use regex matching for the list of SAR config states
-rw-r--r-- | src/mbimcli/mbimcli-helpers.c | 59 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-helpers.h | 2 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-ms-sar.c | 66 |
3 files changed, 86 insertions, 41 deletions
diff --git a/src/mbimcli/mbimcli-helpers.c b/src/mbimcli/mbimcli-helpers.c index 614c267..f69f16a 100644 --- a/src/mbimcli/mbimcli-helpers.c +++ b/src/mbimcli/mbimcli-helpers.c @@ -345,6 +345,65 @@ mbimcli_parse_key_value_string (const gchar *str, return TRUE; } +gboolean +mbimcli_parse_sar_config_state_array (const gchar *str, + GPtrArray **out) +{ + g_autoptr(GPtrArray) config_state_array = NULL; + g_autoptr(GRegex) regex = NULL; + g_autoptr(GMatchInfo) match_info = NULL; + g_autoptr(GError) inner_error = NULL; + + config_state_array = g_ptr_array_new_with_free_func (g_free); + + if (!str || !str[0]) { + *out = NULL; + return TRUE; + } + + regex = g_regex_new ("\\s*{\\s*(\\d+|all)\\s*,\\s*(\\d+)\\s*}(?:\\s*,)?", G_REGEX_RAW, 0, NULL); + g_assert (regex); + + g_regex_match_full (regex, str, strlen (str), 0, 0, &match_info, &inner_error); + while (!inner_error && g_match_info_matches (match_info)) { + g_autofree MbimSarConfigState *config_state = NULL; + g_autofree gchar *antenna_index_str = NULL; + g_autofree gchar *backoff_index_str = NULL; + + config_state = g_new (MbimSarConfigState, 1); + + antenna_index_str = g_match_info_fetch (match_info, 1); + backoff_index_str = g_match_info_fetch (match_info, 2); + + if (g_ascii_strcasecmp (antenna_index_str, "all") == 0) + config_state->antenna_index = 0xFFFFFFFF; + else if (!mbimcli_read_uint_from_string (antenna_index_str, &config_state->antenna_index)) { + g_printerr ("error: invalid antenna index: '%s'\n", antenna_index_str); + return FALSE; + } + if (!mbimcli_read_uint_from_string (backoff_index_str, &config_state->backoff_index)) { + g_printerr ("error: invalid backoff index: '%s'\n", backoff_index_str); + return FALSE; + } + + g_ptr_array_add (config_state_array, g_steal_pointer (&config_state)); + g_match_info_next (match_info, &inner_error); + } + + if (inner_error) { + g_printerr ("error: couldn't match config state array: %s\n", inner_error->message); + return FALSE; + } + + if (config_state_array->len == 0) { + g_printerr ("error: no elements found in the array\n"); + return FALSE; + } + + *out = (config_state_array->len > 0) ? g_steal_pointer (&config_state_array) : NULL; + return TRUE; +} + #define MBIMCLI_ENUM_LIST_ITEM(TYPE,TYPE_UNDERSCORE,DESCR) \ gboolean \ mbimcli_read_## TYPE_UNDERSCORE ##_from_string (const gchar *str, \ diff --git a/src/mbimcli/mbimcli-helpers.h b/src/mbimcli/mbimcli-helpers.h index ce500e9..256e359 100644 --- a/src/mbimcli/mbimcli-helpers.h +++ b/src/mbimcli/mbimcli-helpers.h @@ -33,6 +33,8 @@ gboolean mbimcli_parse_key_value_string (const gchar *str, MbimParseKeyValueForeachFn callback, gpointer user_data); +gboolean mbimcli_parse_sar_config_state_array (const gchar *str, + GPtrArray **out); /* Common helpers to read enums from strings */ #define MBIMCLI_ENUM_LIST \ diff --git a/src/mbimcli/mbimcli-ms-sar.c b/src/mbimcli/mbimcli-ms-sar.c index fd861d2..262b113 100644 --- a/src/mbimcli/mbimcli-ms-sar.c +++ b/src/mbimcli/mbimcli-ms-sar.c @@ -254,37 +254,25 @@ sar_config_input_parse (const gchar *str, /* Check whether we have the optional item array: [{antenna_index,backoff_index}...] */ if (split[2]) { - const gchar *state_begin; - - state_begin = strchr (split[2], '['); - if (state_begin != NULL) { - *states_array = g_ptr_array_new_with_free_func (g_free); - while ((state_begin = strchr (state_begin, '{')) != NULL) { - guint32 antenna_index; - guint32 backoff_index; - gchar antenna_index_str[10]; - - if (sscanf (state_begin, "{%10[all|0-9],%d}", antenna_index_str, &backoff_index) == 2) { - MbimSarConfigState *config_state; - - if (g_ascii_strcasecmp (antenna_index_str, "all") == 0) { - antenna_index = 0xFFFFFFFF; - } else if (mbimcli_read_uint_from_string (antenna_index_str, &antenna_index) == 0) { - g_printerr ("error: invalid antenna index: '%s', it must be 'all' or a number\n", antenna_index_str); - return FALSE; - } - - config_state = g_new (MbimSarConfigState, 1); - config_state->antenna_index = antenna_index; - config_state->backoff_index = backoff_index; - g_ptr_array_add (*states_array, config_state); - ++state_begin; - } else { - break; - } - } + const gchar *array_begin; + const gchar *array_end; + g_autofree gchar *array_str = NULL; + + array_begin = strchr (split[2], '['); + array_end = strchr (split[2], ']'); + + if (!array_begin || !array_end || (array_begin > array_end)) { + g_printerr ("error: invalid SAR config state array: '%s'\n", split[2]); + return FALSE; } - } + + array_str = g_strndup (&array_begin[1], array_end - array_begin - 1); + if (!mbimcli_parse_sar_config_state_array (array_str, states_array)) { + g_printerr ("error: failure parsing the SAR config state array contents: '%s'\n", array_str); + return FALSE; + } + } else + *states_array = NULL; return TRUE; } @@ -345,11 +333,8 @@ mbimcli_ms_sar_run (MbimDevice *device, /* Request to set SAR config */ if (set_sar_config_str) { g_autoptr(GPtrArray) states_array = NULL; - - MbimSarControlMode mode; - MbimSarBackoffState state; - guint states_count = 0; - const MbimSarConfigState **states_ptrs = NULL; + MbimSarControlMode mode; + MbimSarBackoffState state; g_print ("Asynchronously set sar config\n"); if (!sar_config_input_parse (set_sar_config_str, &mode, &state, &states_array)) { @@ -357,12 +342,11 @@ mbimcli_ms_sar_run (MbimDevice *device, return; } - if (states_array != NULL) { - states_count = states_array->len; - states_ptrs = (const MbimSarConfigState **)states_array->pdata; - } - - request = mbim_message_ms_sar_config_set_new (mode, state, states_count, states_ptrs, NULL); + request = mbim_message_ms_sar_config_set_new (mode, + state, + states_array ? states_array->len : 0, + states_array ? (const MbimSarConfigState **)states_array->pdata : NULL, + NULL); mbim_device_command (ctx->device, request, 10, |