aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/plugins.example/hello.c9
-rw-r--r--doc/release-notes.adoc4
-rw-r--r--extcap.c2
-rw-r--r--extcap.h6
-rwxr-xr-xtools/make-plugin-reg.py16
-rw-r--r--ui/qt/about_dialog.cpp30
-rw-r--r--wsutil/plugins.c50
-rw-r--r--wsutil/plugins.h9
8 files changed, 94 insertions, 32 deletions
diff --git a/doc/plugins.example/hello.c b/doc/plugins.example/hello.c
index 55953380eb..9f369ab8e4 100644
--- a/doc/plugins.example/hello.c
+++ b/doc/plugins.example/hello.c
@@ -9,6 +9,7 @@
#define WS_BUILD_DLL
#include <wireshark.h>
+#include <wsutil/plugins.h>
#include <epan/packet.h>
#include <epan/proto.h>
@@ -21,7 +22,7 @@ WS_DLL_PUBLIC_DEF const int plugin_want_major = WIRESHARK_VERSION_MAJOR;
WS_DLL_PUBLIC_DEF const int plugin_want_minor = WIRESHARK_VERSION_MINOR;
WS_DLL_PUBLIC void plugin_register(void);
-
+WS_DLL_PUBLIC int plugin_describe(void);
static int proto_hello = -1;
static dissector_handle_t handle_hello;
@@ -56,3 +57,9 @@ plugin_register(void)
plug.register_handoff = proto_reg_handoff_hello; /* or NULL */
proto_register_plugin(&plug);
}
+
+int
+plugin_describe(void)
+{
+ return WS_PLUGIN_DESC_DISSECTOR;
+}
diff --git a/doc/release-notes.adoc b/doc/release-notes.adoc
index 06635aab0c..5be64330da 100644
--- a/doc/release-notes.adoc
+++ b/doc/release-notes.adoc
@@ -102,8 +102,10 @@ Too many other protocol updates have been made to list them all here.
//_Non-empty section placeholder._
-//=== Major API Changes
+=== Major API Changes
+* Plugins should provide a `plugin_describe()` function that returns an ORed
+ list of flags consisting of the plugin types used (declared in wsutil/plugins.h).
== Getting Wireshark
diff --git a/extcap.c b/extcap.c
index 63612a2f65..c6d8e9eb07 100644
--- a/extcap.c
+++ b/extcap.c
@@ -188,7 +188,7 @@ compare_tools(gconstpointer a, gconstpointer b)
}
void
-extcap_get_descriptions(plugin_description_callback callback, void *callback_data)
+extcap_get_descriptions(extcap_plugin_description_callback callback, void *callback_data)
{
extcap_ensure_all_interfaces_loaded();
diff --git a/extcap.h b/extcap.h
index 31ea3f384f..872bb13a96 100644
--- a/extcap.h
+++ b/extcap.h
@@ -62,6 +62,10 @@ typedef enum {
EXTCAP_FILTER_INVALID
} extcap_filter_status;
+typedef void (*extcap_plugin_description_callback)(const char *, const char *,
+ const char *, const char *,
+ void *);
+
struct _extcap_arg;
#ifdef __cplusplus
@@ -134,7 +138,7 @@ extcap_clear_interfaces(void);
* @param callback_data Data to be passed to the callback routine.
*/
void
-extcap_get_descriptions(plugin_description_callback callback, void *callback_data);
+extcap_get_descriptions(extcap_plugin_description_callback callback, void *callback_data);
/**
* Print information about all available extcap executables.
diff --git a/tools/make-plugin-reg.py b/tools/make-plugin-reg.py
index 2b9bc3450d..766d6d3411 100755
--- a/tools/make-plugin-reg.py
+++ b/tools/make-plugin-reg.py
@@ -116,6 +116,7 @@ reg_code += """
/* plugins are DLLs on Windows */
#define WS_BUILD_DLL
#include "ws_symbol_export.h"
+#include <wsutil/plugins.h>
"""
@@ -139,16 +140,29 @@ for symbol in regs['codec_register']:
for symbol in regs['register_tap_listener']:
reg_code += "void register_tap_listener_%s(void);\n" % (symbol)
+DESCRIPTION_FLAG = {
+ 'plugin': 'WS_PLUGIN_DESC_DISSECTOR',
+ 'plugin_wtap': 'WS_PLUGIN_DESC_FILE_TYPE',
+ 'plugin_codec': 'WS_PLUGIN_DESC_CODEC',
+ 'plugin_tap': 'WS_PLUGIN_DESC_TAP_LISTENER'
+}
+
reg_code += """
WS_DLL_PUBLIC_DEF const gchar plugin_version[] = PLUGIN_VERSION;
WS_DLL_PUBLIC_DEF const int plugin_want_major = VERSION_MAJOR;
WS_DLL_PUBLIC_DEF const int plugin_want_minor = VERSION_MINOR;
WS_DLL_PUBLIC void plugin_register(void);
+WS_DLL_PUBLIC int plugin_describe(void);
+
+int plugin_describe(void)
+{
+ return %s;
+}
void plugin_register(void)
{
-"""
+""" % DESCRIPTION_FLAG[registertype]
if registertype == "plugin":
for symbol in regs['proto_reg']:
diff --git a/ui/qt/about_dialog.cpp b/ui/qt/about_dialog.cpp
index cbda5da2a0..8afb1ee911 100644
--- a/ui/qt/about_dialog.cpp
+++ b/ui/qt/about_dialog.cpp
@@ -100,7 +100,31 @@ QStringList AuthorListModel::headerColumns() const
return QStringList() << tr("Name") << tr("Email");
}
+#ifdef HAVE_PLUGINS
static void plugins_add_description(const char *name, const char *version,
+ int desc_flags, const char *filename,
+ void *user_data)
+{
+ QList<QStringList> *plugin_data = (QList<QStringList> *)user_data;
+ QStringList plugin_types;
+ if (desc_flags & WS_PLUGIN_DESC_DISSECTOR)
+ plugin_types << "dissector";
+ if (desc_flags & WS_PLUGIN_DESC_FILE_TYPE)
+ plugin_types << "file type";
+ if (desc_flags & WS_PLUGIN_DESC_CODEC)
+ plugin_types << "codec";
+ if (desc_flags & WS_PLUGIN_DESC_EPAN)
+ plugin_types << "epan";
+ if (desc_flags & WS_PLUGIN_DESC_TAP_LISTENER)
+ plugin_types << "tap listener";
+ if (plugin_types.empty())
+ plugin_types << "unknown";
+ QStringList plugin_row = QStringList() << name << version << plugin_types.join(", ") << filename;
+ *plugin_data << plugin_row;
+}
+#endif
+
+static void other_plugins_add_description(const char *name, const char *version,
const char *types, const char *filename,
void *user_data)
{
@@ -109,7 +133,7 @@ static void plugins_add_description(const char *name, const char *version,
*plugin_data << plugin_row;
}
-PluginListModel::PluginListModel(QObject * parent) : AStringListListModel(parent)
+PluginListModel::PluginListModel(QObject *parent) : AStringListListModel(parent)
{
QList<QStringList> plugin_data;
#ifdef HAVE_PLUGINS
@@ -117,10 +141,10 @@ PluginListModel::PluginListModel(QObject * parent) : AStringListListModel(parent
#endif
#ifdef HAVE_LUA
- wslua_plugins_get_descriptions(plugins_add_description, &plugin_data);
+ wslua_plugins_get_descriptions(other_plugins_add_description, &plugin_data);
#endif
- extcap_get_descriptions(plugins_add_description, &plugin_data);
+ extcap_get_descriptions(other_plugins_add_description, &plugin_data);
typeNames_ << QString("");
foreach(QStringList row, plugin_data)
diff --git a/wsutil/plugins.c b/wsutil/plugins.c
index 2798fdc345..66bfd5f4ad 100644
--- a/wsutil/plugins.c
+++ b/wsutil/plugins.c
@@ -30,18 +30,13 @@ typedef struct _plugin {
GModule *handle; /* handle returned by g_module_open */
char *name; /* plugin name */
const char *version; /* plugin version */
- const char *type_name; /* user-facing name (what it does). Should these be capitalized? */
+ int desc_flags; /* user-facing description flags (what it does) */
} plugin;
#define TYPE_DIR_EPAN "epan"
#define TYPE_DIR_WIRETAP "wiretap"
#define TYPE_DIR_CODECS "codecs"
-#define TYPE_NAME_DISSECTOR "dissector"
-#define TYPE_NAME_FILE_TYPE "file type"
-#define TYPE_NAME_CODEC "codec"
-
-
static GSList *plugins_module_list = NULL;
@@ -63,20 +58,22 @@ type_to_dir(plugin_type_e type)
}
static inline const char *
-type_to_name(plugin_type_e type)
+desc_flags_to_str(int type_flags)
{
- switch (type) {
- case WS_PLUGIN_EPAN:
- return TYPE_NAME_DISSECTOR;
- case WS_PLUGIN_WIRETAP:
- return TYPE_NAME_FILE_TYPE;
- case WS_PLUGIN_CODEC:
- return TYPE_NAME_CODEC;
- default:
- ws_error("Unknown plugin type: %u. Aborting.", (unsigned) type);
- break;
- }
- ws_assert_not_reached();
+ /* XXX: Allow joining multiple types? Our plugins only implement a
+ * single type but out in the wild this may not be true. */
+ if (type_flags & WS_PLUGIN_DESC_DISSECTOR)
+ return "dissector";
+ else if (type_flags & WS_PLUGIN_DESC_FILE_TYPE)
+ return "file type";
+ else if (type_flags & WS_PLUGIN_DESC_CODEC)
+ return "codec";
+ else if (type_flags & WS_PLUGIN_DESC_EPAN)
+ return "epan";
+ else if (type_flags & WS_PLUGIN_DESC_TAP_LISTENER)
+ return "tap listener";
+ else
+ return "unknown";
}
static void
@@ -138,6 +135,7 @@ scan_plugins_dir(GHashTable *plugins_module, const char *dirpath, plugin_type_e
GModule *handle; /* handle returned by g_module_open */
void * symbol;
const char *plug_version;
+ int desc_flags;
plugin *new_plug;
if (append_type)
@@ -206,11 +204,17 @@ DIAG_OFF_PEDANTIC
((plugin_register_func)symbol)();
DIAG_ON_PEDANTIC
+ /* Search for the (optional) description flag registration function */
+ if (g_module_symbol(handle, "plugin_describe", &symbol))
+ desc_flags = ((plugin_describe_func)symbol)();
+ else
+ desc_flags = 0;
+
new_plug = g_new(plugin, 1);
new_plug->handle = handle;
new_plug->name = g_strdup(name);
new_plug->version = plug_version;
- new_plug->type_name = type_to_name(type);
+ new_plug->desc_flags = desc_flags;
/* Add it to the list of plugins. */
g_hash_table_replace(plugins_module, new_plug->name, new_plug);
@@ -272,7 +276,7 @@ plugins_get_descriptions(plugin_description_callback callback, void *callback_da
for (unsigned i = 0; i < plugins_array->len; i++) {
plugin *plug = (plugin *)plugins_array->pdata[i];
- callback(plug->name, plug->version, plug->type_name, g_module_name(plug->handle), callback_data);
+ callback(plug->name, plug->version, plug->desc_flags, g_module_name(plug->handle), callback_data);
}
g_ptr_array_free(plugins_array, true);
@@ -280,10 +284,10 @@ plugins_get_descriptions(plugin_description_callback callback, void *callback_da
static void
print_plugin_description(const char *name, const char *version,
- const char *description, const char *filename,
+ int desc_flags, const char *filename,
void *user_data _U_)
{
- printf("%-16s\t%s\t%s\t%s\n", name, version, description, filename);
+ printf("%-16s\t%s\t%s\t%s\n", name, version, desc_flags_to_str(desc_flags), filename);
}
void
diff --git a/wsutil/plugins.h b/wsutil/plugins.h
index 96f3ac0368..a35b45b081 100644
--- a/wsutil/plugins.h
+++ b/wsutil/plugins.h
@@ -18,6 +18,7 @@ extern "C" {
#endif /* __cplusplus */
typedef void (*plugin_register_func)(void);
+typedef int (*plugin_describe_func)(void);
typedef void plugins_t;
@@ -27,10 +28,16 @@ typedef enum {
WS_PLUGIN_CODEC
} plugin_type_e;
+#define WS_PLUGIN_DESC_DISSECTOR (1 << 0)
+#define WS_PLUGIN_DESC_FILE_TYPE (1 << 1)
+#define WS_PLUGIN_DESC_CODEC (1 << 2)
+#define WS_PLUGIN_DESC_EPAN (1 << 3)
+#define WS_PLUGIN_DESC_TAP_LISTENER (1 << 4)
+
WS_DLL_PUBLIC plugins_t *plugins_init(plugin_type_e type);
typedef void (*plugin_description_callback)(const char *name, const char *version,
- const char *types, const char *filename,
+ int desc_flags, const char *filename,
void *user_data);
WS_DLL_PUBLIC void plugins_get_descriptions(plugin_description_callback callback, void *user_data);