aboutsummaryrefslogtreecommitdiffstats
path: root/extcap.c
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2018-11-22 17:16:55 +0100
committerAnders Broman <a.broman58@gmail.com>2018-11-22 20:50:17 +0000
commit73ded3a1d97eb704cec55118e0c94b8dd1f849c8 (patch)
tree49b623b94653d5ebcc360370e3a2ea7b430fed0f /extcap.c
parent85dc646327b1a83c5ff9c28c6d846b2a8b4d9a28 (diff)
extcap: simplify execution of single extcap programs
extcap_foreach has two purposes: discovery of all interfaces for each tool and querying info for an extcap interface. Observe that the latter requires extcap_if_exists(ifname) to be true. This makes extcap_foreach match exactly one interface, so we can avoid some complexity. Change-Id: I1842f50aa19553608ee5f2bb7bd8d94bba9629f2 Reviewed-on: https://code.wireshark.org/review/30764 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'extcap.c')
-rw-r--r--extcap.c63
1 files changed, 33 insertions, 30 deletions
diff --git a/extcap.c b/extcap.c
index cc3abd437e..6435a8f1e6 100644
--- a/extcap.c
+++ b/extcap.c
@@ -314,6 +314,27 @@ static void extcap_free_array(gchar ** args, int argc)
g_free(args);
}
+static void
+extcap_run_one(const extcap_interface *interface, GList *arguments, extcap_cb_t cb, void *user_data, char **err_str)
+{
+ const char *dirname = get_extcap_dir();
+ gchar **args = extcap_convert_arguments_to_array(arguments);
+ int cnt = g_list_length(arguments);
+ gchar *command_output;
+ if (ws_pipe_spawn_sync(dirname, interface->extcap_path, cnt, args, &command_output)) {
+ extcap_callback_info_t cb_info = {
+ .ifname = interface->call,
+ .extcap = interface->extcap_path,
+ .output = command_output,
+ .data = user_data,
+ .err_str = err_str,
+ };
+ cb(cb_info);
+ g_free(command_output);
+ }
+ extcap_free_array(args, cnt);
+}
+
/* Note: args does not need to be NULL-terminated. */
static gboolean extcap_foreach(GList * arguments,
extcap_cb_t cb, extcap_callback_info_t cb_info, GList * fallback_arguments)
@@ -470,18 +491,14 @@ extcap_get_if_dlts(const gchar *ifname, char **err_str)
*err_str = NULL;
}
- if (extcap_if_exists(ifname))
+ extcap_interface *interface = extcap_find_interface_for_ifname(ifname);
+ if (interface)
{
arguments = g_list_append(arguments, g_strdup(EXTCAP_ARGUMENT_LIST_DLTS));
arguments = g_list_append(arguments, g_strdup(EXTCAP_ARGUMENT_INTERFACE));
arguments = g_list_append(arguments, g_strdup(ifname));
- extcap_callback_info_t cb_info;
- cb_info.data = &caps;
- cb_info.err_str = err_str;
- cb_info.ifname = ifname;
-
- extcap_foreach(arguments, cb_dlt, cb_info, NULL);
+ extcap_run_one(interface, arguments, cb_dlt, &caps, err_str);
g_list_free_full(arguments, g_free);
}
@@ -814,9 +831,9 @@ extcap_get_if_configuration(const char *ifname)
{
GList * arguments = NULL;
GList *ret = NULL;
- gchar **err_str = NULL;
- if (extcap_if_exists(ifname))
+ extcap_interface *interface = extcap_find_interface_for_ifname(ifname);
+ if (interface)
{
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap path %s",
get_extcap_dir());
@@ -825,12 +842,7 @@ extcap_get_if_configuration(const char *ifname)
arguments = g_list_append(arguments, g_strdup(EXTCAP_ARGUMENT_INTERFACE));
arguments = g_list_append(arguments, g_strdup(ifname));
- extcap_callback_info_t cb_info;
- cb_info.data = &ret;
- cb_info.err_str = err_str;
- cb_info.ifname = ifname;
-
- extcap_foreach(arguments, cb_preference, cb_info, NULL);
+ extcap_run_one(interface, arguments, cb_preference, &ret, NULL);
g_list_free_full(arguments, g_free);
}
@@ -863,9 +875,9 @@ extcap_get_if_configuration_values(const char * ifname, const char * argname, GH
{
GList * args = NULL;
GList *ret = NULL;
- gchar **err_str = NULL;
- if (extcap_if_exists(ifname))
+ extcap_interface *interface = extcap_find_interface_for_ifname(ifname);
+ if (interface)
{
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap path %s",
get_extcap_dir());
@@ -888,12 +900,7 @@ extcap_get_if_configuration_values(const char * ifname, const char * argname, GH
}
}
- extcap_callback_info_t cb_info;
- cb_info.data = &ret;
- cb_info.err_str = err_str;
- cb_info.ifname = ifname;
-
- extcap_foreach(args, cb_reload_preference, cb_info, NULL);
+ extcap_run_one(interface, args, cb_reload_preference, &ret, NULL);
g_list_free_full(args, g_free);
}
@@ -1008,7 +1015,8 @@ extcap_verify_capture_filter(const char *ifname, const char *filter, gchar **err
GList * arguments = NULL;
extcap_filter_status status = EXTCAP_FILTER_UNKNOWN;
- if (extcap_if_exists(ifname))
+ extcap_interface *interface = extcap_find_interface_for_ifname(ifname);
+ if (interface)
{
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap path %s",
get_extcap_dir());
@@ -1018,12 +1026,7 @@ extcap_verify_capture_filter(const char *ifname, const char *filter, gchar **err
arguments = g_list_append(arguments, g_strdup(EXTCAP_ARGUMENT_INTERFACE));
arguments = g_list_append(arguments, g_strdup(ifname));
- extcap_callback_info_t cb_info;
- cb_info.data = &status;
- cb_info.err_str = err_str;
- cb_info.ifname = ifname;
-
- extcap_foreach(arguments, cb_verify_filter, cb_info, NULL);
+ extcap_run_one(interface, arguments, cb_verify_filter, &status, err_str);
g_list_free_full(arguments, g_free);
}