summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-09-30 22:06:19 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-09-30 22:06:19 +0200
commit7fd0ac27eb14bb0b45626a1747009266212c0634 (patch)
treeda27300140c7f1512d7d394e4ac64a06d50521d2
parent64f52fc63f5b0d3ca0fb5c390b11b1cd1636021b (diff)
mbimcli,sar: use regex matching for the list of SAR config states
-rw-r--r--src/mbimcli/mbimcli-helpers.c59
-rw-r--r--src/mbimcli/mbimcli-helpers.h2
-rw-r--r--src/mbimcli/mbimcli-ms-sar.c66
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,