aboutsummaryrefslogtreecommitdiffstats
path: root/extcap.c
diff options
context:
space:
mode:
authorRoland Knall <rknall@gmail.com>2017-03-03 22:04:18 +0100
committerRoland Knall <rknall@gmail.com>2017-03-04 07:32:25 +0000
commitee9b998d64c50727920be3c03a77f02c61563cb7 (patch)
treee2f6f13f41602e219645127d07bd5497daed86a5 /extcap.c
parentb7e9582fd72d85373d5223394d55f405edd0eca8 (diff)
extcap: Minor improvements
Add method for searching for tools by ifname and minor improvements in the interface callback to save time and space Change-Id: I0073c96fbee846cc5ff6304823fa14564ff36c22 Reviewed-on: https://code.wireshark.org/review/20376 Petri-Dish: Roland Knall <rknall@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.c60
1 files changed, 46 insertions, 14 deletions
diff --git a/extcap.c b/extcap.c
index 086ab285a5..3d73145123 100644
--- a/extcap.c
+++ b/extcap.c
@@ -1338,7 +1338,7 @@ extcap_free_interface_info(gpointer data _U_)
}
static extcap_info *
-extcap_ensure_interface(const gchar * toolname)
+extcap_ensure_interface(const gchar * toolname, gboolean create_if_nonexist)
{
extcap_info * element = 0;
@@ -1348,7 +1348,8 @@ extcap_ensure_interface(const gchar * toolname)
if ( ! _loaded_interfaces )
_loaded_interfaces = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, extcap_free_interface);
- if ( ( element = (extcap_info *) g_hash_table_lookup(_loaded_interfaces, toolname ) ) == NULL )
+ element = (extcap_info *) g_hash_table_lookup(_loaded_interfaces, toolname );
+ if ( ! element && create_if_nonexist )
{
g_hash_table_insert(_loaded_interfaces, g_strdup(toolname), g_new0(extcap_info, 1));
element = (extcap_info *) g_hash_table_lookup(_loaded_interfaces, toolname );
@@ -1357,6 +1358,25 @@ extcap_ensure_interface(const gchar * toolname)
return element;
}
+extcap_info *
+extcap_get_tool_by_ifname(const gchar *ifname)
+{
+ if ( ifname && _tool_for_ifname )
+ {
+ gchar * toolname = (gchar *)g_hash_table_lookup(_tool_for_ifname, ifname);
+ if ( toolname )
+ return extcap_ensure_interface(toolname, FALSE);
+ }
+
+ return NULL;
+}
+
+extcap_info *
+extcap_get_tool_info(const gchar * toolname)
+{
+ return extcap_ensure_interface(toolname, FALSE);
+}
+
static void remove_extcap_entry(gpointer entry, gpointer data _U_)
{
extcap_interface *int_iter = (extcap_interface*)entry;
@@ -1367,31 +1387,42 @@ static void remove_extcap_entry(gpointer entry, gpointer data _U_)
static gboolean cb_load_interfaces(extcap_callback_info_t cb_info)
{
- GList *interfaces = NULL, *walker = NULL;
- extcap_interface *int_iter = NULL;
- gchar *toolname = g_path_get_basename(cb_info.extcap);
+ GList * interfaces = NULL, * walker = NULL;
+ extcap_interface * int_iter = NULL;
+ extcap_info * element = NULL;
+ gchar * toolname = g_path_get_basename(cb_info.extcap);
GList * interface_keys = g_hash_table_get_keys(_loaded_interfaces);
+ /* Load interfaces from utility */
interfaces = extcap_parse_interfaces(cb_info.output);
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Loading interface list for %s ", cb_info.extcap);
+ /* Seems, that there where no interfaces to be loaded */
+ if ( ! interfaces || g_list_length(interfaces) == 0 )
+ {
+ g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Cannot load interfaces for %s", cb_info.extcap );
+ /* Some utilities, androiddump for example, may actually don't present any interfaces, even
+ * if the utility itself is present. In such a case, we return here, but do not return
+ * FALSE, or otherwise further loading of other utilities will be stopped */
+ return TRUE;
+ }
+
+ /* Load or create the storage element for the tool */
+ element = extcap_ensure_interface(toolname, TRUE);
+ if ( element == NULL )
+ {
+ g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_ERROR, "Cannot store interface %s, maybe duplicate?", cb_info.extcap );
+ return FALSE;
+ }
+
walker = interfaces;
gchar* help = NULL;
while (walker != NULL)
{
int_iter = (extcap_interface *)walker->data;
- extcap_info * element = extcap_ensure_interface(toolname);
-
- if ( element == NULL )
- {
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_ERROR, "Cannot store interface %s", cb_info.extcap);
- walker = g_list_next(walker);
- continue;
- }
-
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Interface found %s\n", int_iter->call);
/* Help is not necessarily stored with the interface, but rather with the version string.
@@ -1406,6 +1437,7 @@ static gboolean cb_load_interfaces(extcap_callback_info_t cb_info)
element->version = g_strdup(int_iter->version);
element->basename = g_strdup(toolname);
element->full_path = g_strdup(cb_info.extcap);
+ element->help = g_strdup(int_iter->help);
}
help = int_iter->help;