chiark / gitweb /
Fix dlerror() abuse.
[disorder] / lib / plugin.c
index 946f4990e72ad89bab109e6e4951289800dfcbfb..abeaa6625e706d411085dbb3afe42a5028519239 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 #include <config.h>
+#include "types.h"
 
 #include <dlfcn.h>
 #include <unistd.h>
@@ -57,6 +58,7 @@ const struct plugin *open_plugin(const char *name,
   for(pl = plugins; pl && strcmp(pl->name, name); pl = pl->next)
     ;
   if(pl) return pl;
+  /* Search the plugin path */
   for(n = 0; n <= config->plugins.n; ++n) {
     byte_xasprintf(&p, "%s/%s" SOSUFFIX,
                   n == config->plugins.n ? pkglibdir : config->plugins.s[n],
@@ -82,22 +84,22 @@ const struct plugin *open_plugin(const char *name,
 function_t *get_plugin_function(const struct plugin *pl,
                                const char *symbol) {
   function_t *f;
-  const char *e;
 
   f = (function_t *)dlsym(pl->dlhandle, symbol);
-  if((e = dlerror()))
-    fatal(0, "error looking up function '%s' in '%s': %s",symbol, pl->name, e);
+  if(!f)
+    fatal(0, "error looking up function '%s' in '%s': %s",
+         symbol, pl->name, dlerror());
   return f;
 }
 
 const void *get_plugin_object(const struct plugin *pl,
                              const char *symbol) {
   void *o;
-  const char *e;
 
   o = dlsym(pl->dlhandle, symbol);
-  if((e = dlerror()))
-    fatal(0, "error looking up object '%s' in '%s': %s", symbol, pl->name, e);
+  if(!o)
+    fatal(0, "error looking up object '%s' in '%s': %s",
+         symbol, pl->name, dlerror());
   return o;
 }
 
@@ -105,13 +107,18 @@ const void *get_plugin_object(const struct plugin *pl,
 
 typedef long tracklength_fn(const char *track, const char *path);
 
-long tracklength(const char *track, const char *path) {
-  static tracklength_fn *f = 0;
+/** Compute the length of a track
+ * @param plugin plugin to use, as configured
+ * @param track UTF-8 name of track
+ * @param path file system path or 0
+ * @return length of track in seconds, 0 for unknown, -1 for error
+ */
+long tracklength(const char *plugin, const char *track, const char *path) {
+  tracklength_fn *f = 0;
 
-  if(!f)
-    f = (tracklength_fn *)get_plugin_function(open_plugin("tracklength",
-                                                         PLUGIN_FATAL),
-                                             "disorder_tracklength");
+  f = (tracklength_fn *)get_plugin_function(open_plugin(plugin,
+                                                       PLUGIN_FATAL),
+                                           "disorder_tracklength");
   return (*f)(track, path);
 }