#ifndef DISABLE_LTDL
static int gvconfig_plugin_install_from_config(GVC_t * gvc, char *s)
{
- char *p, *path, *packagename, *api, *type;
+ char *path, *packagename, *api, *type;
api_t gv_api;
int quality, rc;
int nest = 0;
separator(&nest, &s);
while (*s) {
- p = token(&nest, &s);
- if (p[0] == '/') {
- path = strdup(p);
- } else {
- path = malloc(strlen(libdir)
- + 1
- + strlen(p)
- + 1);
- strcpy(path, libdir);
- strcat(path, "/");
- strcat(path, p);
- }
-
+ path = token(&nest, &s);
if (nest == 0)
packagename = token(&nest, &s);
else
gv_api = gvplugin_api(api);
if (gv_api == -1) {
agerr(AGERR, "invalid api in config: %s %s\n", path, api);
- free(path);
return 0;
}
do {
type, quality, packagename, path, NULL);
if (!rc) {
agerr(AGERR, "config error: %s %s %s\n", path, api, type);
- free(path);
return 0;
}
}
} while (nest == 2);
} while (nest == 1);
- free(path);
}
return 1;
}
#include "gvc.h"
#include "graph.h"
+static char *libdir = GVLIBDIR;
+
/*
* Define an apis array of name strings using an enumerated api_t as index.
* The enumerated type is defined gvplugin.h. The apis array is
lt_ptr ptr;
char *s, *sym;
int len;
+ static char *p;
char *suffix = "_LTX_library";
+ p = realloc(p,strlen(libdir)
+ + 1
+ + strlen(path)
+ + 1);
+ if (path[0] == '/') {
+ strcpy(p, path);
+ } else {
+ strcpy(p, libdir);
+ strcat(p, "/");
+ strcat(p, path);
+ }
+
if (lt_dlinit()) {
agerr(AGERR, "failed to init libltdl\n");
return NULL;
}
- hndl = lt_dlopen (path);
+ hndl = lt_dlopen (p);
if (!hndl) {
- agerr(AGERR, "failed to dlopen %s\n", path);
+ agerr(AGERR, "failed to dlopen %s\n", p);
return NULL;
}
- s = strrchr(path, '/');
+ s = strrchr(p, '/');
len = strlen(s);
- if (len < strlen("libgvplugin_x")) {
- agerr (AGERR,"invalid plugin path \"%s\"\n", path);
+ if (len < strlen("/libgvplugin_x")) {
+ agerr (AGERR,"invalid plugin path \"%s\"\n", p);
return NULL;
}
sym = malloc(len + strlen(suffix) + 1);
ptr = lt_dlsym (hndl, sym);
if (!ptr) {
- agerr (AGERR,"failed to resolve %s in %s\n", sym, path);
+ agerr (AGERR,"failed to resolve %s in %s\n", sym, p);
free(sym);
return NULL;
}