Have scan_plugins() take an argument specify what to do on load failures.
authorGuy Harris <guy@alum.mit.edu>
Mon, 5 Sep 2016 23:26:29 +0000 (16:26 -0700)
committerGuy Harris <guy@alum.mit.edu>
Mon, 5 Sep 2016 23:27:02 +0000 (23:27 +0000)
That's a less gross hack to suppress load failures due to not having
libwiretap than providing a no-op failure-message routine, as it at
least allows other code using a failure-message routine, such as
cmdarg_err() and routines that call it, to be used.

We really should put libwiretap and libwireshark plugins into separate
subdirectories of the plugin directories, and avoid even looking at
libwireshark plugins in programs that don't use libwireshark.

Change-Id: I0a6ec01ecb4e718ed36233cfaf638a317f839a73
Reviewed-on: https://code.wireshark.org/review/17506
Reviewed-by: Guy Harris <guy@alum.mit.edu>
13 files changed:
capinfos.c
captype.c
dftest.c
editcap.c
mergecap.c
randpkt.c
reordercap.c
tfshark.c
tshark.c
ui/gtk/main.c
wireshark-qt.cpp
wsutil/plugins.c
wsutil/plugins.h

index 4b8debab94d68e149ad1b2868a4a30f578709e7c..9d0901da4d50c29dfb9e786339d1b0dcb94dda33 100644 (file)
@@ -1375,14 +1375,14 @@ print_usage(FILE *output)
 
 #ifdef HAVE_PLUGINS
 /*
- *  Don't report failures to load plugins because most (non-wiretap) plugins
- *  *should* fail to load (because we're not linked against libwireshark and
- *  dissector plugins need libwireshark).
+ * General errors are reported with an console message in capinfos.
  */
 static void
-failure_message(const char *msg_format _U_, va_list ap _U_)
+failure_message(const char *msg_format, va_list ap)
 {
-  return;
+  fprintf(stderr, "capinfos: ");
+  vfprintf(stderr, msg_format, ap);
+  fprintf(stderr, "\n");
 }
 #endif
 
@@ -1466,8 +1466,12 @@ main(int argc, char *argv[])
     init_report_err(failure_message, NULL, NULL, NULL);
 
     /* Scan for plugins.  This does *not* call their registration routines;
-       that's done later. */
-    scan_plugins();
+       that's done later.
+
+       Don't report failures to load plugins because most (non-wiretap)
+       plugins *should* fail to load (because we're not linked against
+       libwireshark and dissector plugins need libwireshark). */
+    scan_plugins(DONT_REPORT_LOAD_FAILURE);
 
     /* Register all libwiretap plugin modules. */
     register_all_wiretap_modules();
index 942bc59695648a37179945a7cc204bf8c53790b5..d83b21485c4675f369bedaf0caef24710cdb74af 100644 (file)
--- a/captype.c
+++ b/captype.c
@@ -70,14 +70,14 @@ print_usage(FILE *output)
 
 #ifdef HAVE_PLUGINS
 /*
- *  Don't report failures to load plugins because most (non-wiretap) plugins
- *  *should* fail to load (because we're not linked against libwireshark and
- *  dissector plugins need libwireshark).
+ * General errors are reported with an console message in captype.
  */
 static void
-failure_message(const char *msg_format _U_, va_list ap _U_)
+failure_message(const char *msg_format, va_list ap)
 {
-  return;
+  fprintf(stderr, "captype: ");
+  vfprintf(stderr, msg_format, ap);
+  fprintf(stderr, "\n");
 }
 #endif
 
@@ -141,8 +141,12 @@ main(int argc, char *argv[])
     init_report_err(failure_message,NULL,NULL,NULL);
 
     /* Scan for plugins.  This does *not* call their registration routines;
-       that's done later. */
-    scan_plugins();
+       that's done later.
+
+       Don't report failures to load plugins because most (non-wiretap)
+       plugins *should* fail to load (because we're not linked against
+       libwireshark and dissector plugins need libwireshark). */
+    scan_plugins(DONT_REPORT_LOAD_FAILURE);
 
     /* Register all libwiretap plugin modules. */
     register_all_wiretap_modules();
index 9b4276ecac2f49349e1e51c166533f62257cc8cd..888bfd1fad9e89d23a96400ef9d669af7859e8e3 100644 (file)
--- a/dftest.c
+++ b/dftest.c
@@ -88,7 +88,7 @@ main(int argc, char **argv)
 
        /* Scan for plugins.  This does *not* call their registration routines;
           that's done later. */
-       scan_plugins();
+       scan_plugins(REPORT_LOAD_FAILURE);
 #endif
 
        /* Register all dissectors; we must do this before checking for the
index 70d08231992e6409633840686cec6a14f11223e5..da9c76d3c3db29297b9ddb486e32266bb7d7cd9d 100644 (file)
--- a/editcap.c
+++ b/editcap.c
@@ -894,13 +894,14 @@ framenum_compare(gconstpointer a, gconstpointer b, gpointer user_data _U_)
 
 #ifdef HAVE_PLUGINS
 /*
- *  Don't report failures to load plugins because most (non-wiretap) plugins
- *  *should* fail to load (because we're not linked against libwireshark and
- *  dissector plugins need libwireshark).
+ * General errors are reported with an console message in editcap.
  */
 static void
-failure_message(const char *msg_format _U_, va_list ap _U_)
+failure_message(const char *msg_format, va_list ap)
 {
+  fprintf(stderr, "editcap: ");
+  vfprintf(stderr, msg_format, ap);
+  fprintf(stderr, "\n");
 }
 #endif
 
@@ -1011,8 +1012,12 @@ main(int argc, char *argv[])
         init_report_err(failure_message,NULL,NULL,NULL);
 
         /* Scan for plugins.  This does *not* call their registration routines;
-           that's done later. */
-        scan_plugins();
+           that's done later.
+
+           Don't report failures to load plugins because most (non-wiretap)
+           plugins *should* fail to load (because we're not linked against
+           libwireshark and dissector plugins need libwireshark). */
+        scan_plugins(DONT_REPORT_LOAD_FAILURE);
 
         /* Register all libwiretap plugin modules. */
         register_all_wiretap_modules();
index c6c97619ef07ac917fbf9f475123f55541ed3047..089ef0254daa28d246f8ae3ee5271647b0f9b3a9 100644 (file)
@@ -129,14 +129,14 @@ string_elem_print(gpointer data, gpointer not_used _U_)
 
 #ifdef HAVE_PLUGINS
 /*
- *  Don't report failures to load plugins because most (non-wiretap) plugins
- *  *should* fail to load (because we're not linked against libwireshark and
- *  dissector plugins need libwireshark).
+ * General errors are reported with an console message in mergecap.
  */
 static void
-failure_message(const char *msg_format _U_, va_list ap _U_)
+failure_message(const char *msg_format, va_list ap)
 {
-  return;
+  fprintf(stderr, "mergecap: ");
+  vfprintf(stderr, msg_format, ap);
+  fprintf(stderr, "\n");
 }
 #endif
 
@@ -310,8 +310,12 @@ main(int argc, char *argv[])
     init_report_err(failure_message,NULL,NULL,NULL);
 
     /* Scan for plugins.  This does *not* call their registration routines;
-       that's done later. */
-    scan_plugins();
+       that's done later.
+
+       Don't report failures to load plugins because most (non-wiretap)
+       plugins *should* fail to load (because we're not linked against
+       libwireshark and dissector plugins need libwireshark).*/
+    scan_plugins(DONT_REPORT_LOAD_FAILURE);
 
     /* Register all libwiretap plugin modules. */
     register_all_wiretap_modules();
index f604e77812a944f2a8c3082cefe479eae944fec6..4346afb52cc7c7c7c81482a0a01b3d864ddb95c7 100644 (file)
--- a/randpkt.c
+++ b/randpkt.c
 
 #ifdef HAVE_PLUGINS
 /*
- *  Don't report failures to load plugins because most (non-wiretap) plugins
- *  *should* fail to load (because we're not linked against libwireshark and
- *  dissector plugins need libwireshark).
+ * General errors are reported with an console message in randpkt.
  */
 static void
-failure_message(const char *msg_format _U_, va_list ap _U_)
+failure_message(const char *msg_format, va_list ap)
 {
-  return;
+       fprintf(stderr, "randpkt: ");
+       vfprintf(stderr, msg_format, ap);
+       fprintf(stderr, "\n");
 }
 #endif
 
@@ -141,8 +141,13 @@ main(int argc, char **argv)
                init_report_err(failure_message,NULL,NULL,NULL);
 
                /* Scan for plugins.  This does *not* call their registration routines;
-                  that's done later. */
-               scan_plugins();
+                  that's done later.
+
+                  Don't report failures to load plugins because most
+                  (non-wiretap) plugins *should* fail to load (because
+                  we're not linked against libwireshark and dissector
+                  plugins need libwireshark). */
+               scan_plugins(DONT_REPORT_LOAD_FAILURE);
 
                /* Register all libwiretap plugin modules. */
                register_all_wiretap_modules();
index 206a4888c83063524c422609410f5532f9a16719..e01f43c5fd9acf9bb1363efa0b45424d31a64458 100644 (file)
@@ -148,14 +148,14 @@ frames_compare(gconstpointer a, gconstpointer b)
 
 #ifdef HAVE_PLUGINS
 /*
- *  Don't report failures to load plugins because most (non-wiretap) plugins
- *  *should* fail to load (because we're not linked against libwireshark and
- *  dissector plugins need libwireshark).
+ * General errors are reported with an console message in reordercap.
  */
 static void
-failure_message(const char *msg_format _U_, va_list ap _U_)
+failure_message(const char *msg_format, va_list ap)
 {
-    return;
+    fprintf(stderr, "reordercap: ");
+    vfprintf(stderr, msg_format, ap);
+    fprintf(stderr, "\n");
 }
 #endif
 
@@ -231,8 +231,12 @@ main(int argc, char *argv[])
         init_report_err(failure_message,NULL,NULL,NULL);
 
         /* Scan for plugins.  This does *not* call their registration routines;
-           that's done later. */
-        scan_plugins();
+           that's done later.
+
+           Don't report failures to load plugins because most (non-wiretap)
+           plugins *should* fail to load (because we're not linked against
+           libwireshark and dissector plugins need libwireshark). */
+        scan_plugins(DONT_REPORT_LOAD_FAILURE);
 
         /* Register all libwiretap plugin modules. */
         register_all_wiretap_modules();
index 4bea91c727b157e24c37122e8868b05e5ebec58a..49cb26ab061703d902936bac033b82c6f90b1811 100644 (file)
--- a/tfshark.c
+++ b/tfshark.c
@@ -509,7 +509,7 @@ main(int argc, char *argv[])
 
   /* Scan for plugins.  This does *not* call their registration routines;
      that's done later. */
-  scan_plugins();
+  scan_plugins(REPORT_LOAD_FAILURE);
 
 #endif
 
index 7a8c2d4d63e80d1e8dc435f0cf9ef9bd8f407c3f..bb61320a0df2f5ea409074f94569987a28566424 100644 (file)
--- a/tshark.c
+++ b/tshark.c
@@ -791,7 +791,7 @@ main(int argc, char *argv[])
 
   /* Scan for plugins.  This does *not* call their registration routines;
      that's done later. */
-  scan_plugins();
+  scan_plugins(REPORT_LOAD_FAILURE);
 
   /* Register all libwiretap plugin modules. */
   register_all_wiretap_modules();
index 01de65a40c895816885280c6fa0c0f8a1a210d10..5c173384004c7761dc3a632ccdb782d3d75fc81f 100644 (file)
@@ -2292,7 +2292,7 @@ main(int argc, char *argv[])
 
     /* Scan for plugins.  This does *not* call their registration routines;
        that's done later. */
-    scan_plugins();
+    scan_plugins(REPORT_LOAD_FAILURE);
 
     /* Register all libwiretap plugin modules. */
     register_all_wiretap_modules();
index 22ceaa9d640044867a6018599bd908491737961d..8a1564af71393bcfaf6349e1bb286f555e3a20b1 100644 (file)
@@ -542,7 +542,7 @@ int main(int argc, char *argv[])
 
     /* Scan for plugins.  This does *not* call their registration routines;
        that's done later. */
-    scan_plugins();
+    scan_plugins(REPORT_LOAD_FAILURE);
 
     /* Register all libwiretap plugin modules. */
     register_all_wiretap_modules();
index 8a390948f56337175f13e5c92f4bef8f5a461b81..f2da1f57d2e6c796c58bd1d18f001f53767c332e 100644 (file)
@@ -143,7 +143,7 @@ call_plugin_callback(gpointer data, gpointer user_data)
 }
 
 static void
-plugins_scan_dir(const char *dirname)
+plugins_scan_dir(const char *dirname, plugin_load_failure_mode mode)
 {
 #define FILENAME_LEN        1024
     WS_DIR        *dir;             /* scanned directory */
@@ -175,8 +175,21 @@ plugins_scan_dir(const char *dirname)
                        dirname, name);
             if ((handle = g_module_open(filename, G_MODULE_BIND_LOCAL)) == NULL)
             {
-                report_failure("Couldn't load module %s: %s", filename,
-                               g_module_error());
+                /*
+                 * Only report load failures if we were asked to.
+                 *
+                 * XXX - we really should put different types of plugins
+                 * (libwiretap, libwireshark) in different subdirectories,
+                 * give libwiretap and libwireshark init routines that
+                 * load the plugins, and have them scan the appropriate
+                 * subdirectories so tha we don't even *try* to, for
+                 * example, load libwireshark plugins in programs that
+                 * only use libwiretap.
+                 */
+                if (mode == REPORT_LOAD_FAILURE) {
+                    report_failure("Couldn't load module %s: %s", filename,
+                                   g_module_error());
+                }
                 continue;
             }
 
@@ -241,7 +254,7 @@ plugins_scan_dir(const char *dirname)
  * Scan for plugins.
  */
 void
-scan_plugins(void)
+scan_plugins(plugin_load_failure_mode mode)
 {
     const char *plugin_dir;
     const char *name;
@@ -264,7 +277,7 @@ scan_plugins(void)
         {
             if ((dir = ws_dir_open(plugin_dir, 0, NULL)) != NULL)
             {
-                plugins_scan_dir(plugin_dir);
+                plugins_scan_dir(plugin_dir, mode);
                 while ((file = ws_dir_read_name(dir)) != NULL)
                 {
                     name = ws_dir_get_name(file);
@@ -290,14 +303,14 @@ scan_plugins(void)
                         plugin_dir_path = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s",
                             plugin_dir, name);
                     }
-                    plugins_scan_dir(plugin_dir_path);
+                    plugins_scan_dir(plugin_dir_path, mode);
                     g_free(plugin_dir_path);
                 }
                 ws_dir_close(dir);
             }
         }
         else
-            plugins_scan_dir(plugin_dir);
+            plugins_scan_dir(plugin_dir, mode);
 
         /*
          * If the program wasn't started with special privileges,
@@ -310,7 +323,7 @@ scan_plugins(void)
         if (!started_with_special_privs())
         {
             plugins_pers_dir = get_plugins_pers_dir();
-            plugins_scan_dir(plugins_pers_dir);
+            plugins_scan_dir(plugins_pers_dir, mode);
             g_free(plugins_pers_dir);
         }
     }
index 1d5f0b6fd9cc2508550938fd35bd6078aea8b1ee..677c6d3f0bb32c6a4897dc3979fdf623a8ddd9be 100644 (file)
@@ -34,7 +34,11 @@ extern "C" {
 
 typedef gboolean (*plugin_callback)(GModule *handle);
 
-WS_DLL_PUBLIC void scan_plugins(void);
+typedef enum {
+    REPORT_LOAD_FAILURE,
+    DONT_REPORT_LOAD_FAILURE
+} plugin_load_failure_mode;
+WS_DLL_PUBLIC void scan_plugins(plugin_load_failure_mode mode);
 WS_DLL_PUBLIC void add_plugin_type(const char *type, plugin_callback callback);
 typedef void (*plugin_description_callback)(const char *, const char *,
                                             const char *, const char *,