decrypt
[metze/wireshark/wip.git] / extcap_parser.c
index ca351743d5184a42e496276992221cc9ede37950..411e2522be77fa7907244593d2f9376572b827ba 100644 (file)
@@ -169,12 +169,16 @@ static extcap_token_sentence *extcap_tokenize_sentence(const gchar *s) {
                 param_type = EXTCAP_PARAM_FILE_MUSTEXIST;
             } else if (g_ascii_strcasecmp(arg, "fileext") == 0) {
                 param_type = EXTCAP_PARAM_FILE_EXTENSION;
+            } else if (g_ascii_strcasecmp(arg, "group") == 0) {
+                param_type = EXTCAP_PARAM_GROUP;
             } else if (g_ascii_strcasecmp(arg, "name") == 0) {
                 param_type = EXTCAP_PARAM_NAME;
             } else if (g_ascii_strcasecmp(arg, "enabled") == 0) {
                 param_type = EXTCAP_PARAM_ENABLED;
             } else if (g_ascii_strcasecmp(arg, "parent") == 0) {
                 param_type = EXTCAP_PARAM_PARENT;
+            } else if (g_ascii_strcasecmp(arg, "reload") == 0) {
+                param_type = EXTCAP_PARAM_RELOAD;
             } else if (g_ascii_strcasecmp(arg, "required") == 0) {
                 param_type = EXTCAP_PARAM_REQUIRED;
             } else if (g_ascii_strcasecmp(arg, "save") == 0) {
@@ -249,6 +253,7 @@ void extcap_free_arg(extcap_arg *a) {
     g_free(a->placeholder);
     g_free(a->fileextension);
     g_free(a->regexp);
+    g_free(a->group);
     g_free(a->device_name);
 
     if (a->range_start != NULL)
@@ -286,8 +291,7 @@ static void extcap_free_toolbar_control(iface_toolbar_control *c) {
 }
 
 void extcap_free_arg_list(GList *a) {
-    g_list_foreach(a, (GFunc)extcap_free_arg, NULL);
-    g_list_free(a);
+    g_list_free_full(a, (GDestroyNotify)extcap_free_arg);
 }
 
 static gint glist_find_numbered_arg(gconstpointer listelem, gconstpointer needle) {
@@ -321,13 +325,74 @@ static void extcap_free_tokenized_sentences(GList *sentences) {
     g_list_free(sentences);
 }
 
+static extcap_value *extcap_parse_value_sentence(extcap_token_sentence *s) {
+    extcap_value *value = NULL;
+    gchar *param_value = NULL;
+
+    int tint = 0;
+
+    if (s == NULL)
+        return value;
+
+    if (g_ascii_strcasecmp(s->sentence, "value") == 0) {
+
+        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ARG)))
+                == NULL) {
+            printf("no arg in VALUE sentence\n");
+            return NULL;
+        }
+
+        if (sscanf(param_value, "%d", &tint) != 1) {
+            printf("invalid arg in VALUE sentence\n");
+            return NULL;
+        }
+
+        value = g_new0(extcap_value, 1);
+        value->arg_num = tint;
+
+        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_VALUE)))
+                == NULL) {
+            /* printf("no value in VALUE sentence\n"); */
+            extcap_free_value(value);
+            return NULL;
+        }
+        value->call = g_strdup(param_value);
+
+        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DISPLAY)))
+                == NULL) {
+            /* printf("no display in VALUE sentence\n"); */
+            extcap_free_value(value);
+            return NULL;
+        }
+        value->display = g_strdup(param_value);
+
+        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_PARENT)))
+                != NULL) {
+            value->parent = g_strdup(param_value);
+        }
+
+        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DEFAULT)))
+                != NULL) {
+            /* printf("found default value\n"); */
+            value->is_default = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+        }
+
+        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ENABLED)))
+                != NULL) {
+            value->enabled = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+        }
+    }
+
+    return value;
+}
+
 static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence *s) {
     gchar *param_value = NULL;
 
     extcap_arg *target_arg = NULL;
     extcap_value *value = NULL;
     GList *entry = NULL;
-    int tint;
+
     extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN;
 
     if (s == NULL)
@@ -400,6 +465,11 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
             target_arg->regexp = g_strdup(param_value);
         }
 
+        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_GROUP)))
+                != NULL) {
+            target_arg->group = g_strdup(param_value);
+        }
+
         if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_REQUIRED)))
                 != NULL) {
             target_arg->is_required = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
@@ -451,6 +521,11 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
             target_arg->save = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
         }
 
+        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_RELOAD)))
+                != NULL) {
+            target_arg->reload = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+        }
+
         if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_RANGE)))
                 != NULL) {
             gchar *cp = g_strstr_len(param_value, -1, ",");
@@ -491,57 +566,13 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
         }
 
     } else if (sent == EXTCAP_SENTENCE_VALUE) {
-        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ARG)))
-                == NULL) {
-            printf("no arg in VALUE sentence\n");
-            return NULL;
-        }
-
-        if (sscanf(param_value, "%d", &tint) != 1) {
-            printf("invalid arg in VALUE sentence\n");
-            return NULL;
-        }
-
-        if ((entry = g_list_find_custom(args, &tint, glist_find_numbered_arg))
-                == NULL) {
-            printf("couldn't find arg %d in list for VALUE sentence\n", tint);
-            return NULL;
-        }
-
-        value = g_new0(extcap_value, 1);
-        value->arg_num = tint;
+        value = extcap_parse_value_sentence(s);
 
-        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_VALUE)))
-                == NULL) {
-            /* printf("no value in VALUE sentence\n"); */
-            extcap_free_value(value);
-            return NULL;
-        }
-        value->call = g_strdup(param_value);
-
-        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DISPLAY)))
+        if ((entry = g_list_find_custom(args, &value->arg_num, glist_find_numbered_arg))
                 == NULL) {
-            /* printf("no display in VALUE sentence\n"); */
-            extcap_free_value(value);
+            printf("couldn't find arg %d in list for VALUE sentence\n", value->arg_num);
             return NULL;
         }
-        value->display = g_strdup(param_value);
-
-        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_PARENT)))
-                != NULL) {
-            value->parent = g_strdup(param_value);
-        }
-
-        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DEFAULT)))
-                != NULL) {
-            /* printf("found default value\n"); */
-            value->is_default = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
-        }
-
-        if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ENABLED)))
-                != NULL) {
-            value->enabled = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
-        }
 
         ((extcap_arg *) entry->data)->values = g_list_append(
                 ((extcap_arg *) entry->data)->values, value);
@@ -575,6 +606,29 @@ GList *extcap_parse_args(gchar *output) {
     return result;
 }
 
+GList *extcap_parse_values(gchar *output) {
+    GList *result = NULL;
+    GList *walker = NULL;
+    GList *temp = NULL;
+
+    walker = extcap_tokenize_sentences(output);
+    temp = walker;
+
+    while (walker) {
+        extcap_value *ra = NULL;
+        extcap_token_sentence *sentence = (extcap_token_sentence *)walker->data;
+
+        if ((ra = extcap_parse_value_sentence(sentence)) != NULL)
+            result = g_list_append(result, (gpointer) ra);
+
+        walker = g_list_next(walker);
+    }
+
+    extcap_free_tokenized_sentences(temp);
+
+    return result;
+}
+
 static extcap_interface *extcap_parse_interface_sentence(extcap_token_sentence *s) {
     extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN;
     gchar *param_value = NULL;