summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am6
-rw-r--r--src/core/logs.h12
-rw-r--r--src/core/paths.c117
-rw-r--r--src/core/paths.h10
-rw-r--r--src/plugins/pglist.c9
5 files changed, 145 insertions, 9 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 30a043e..d239a0d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -20,7 +20,11 @@ endif
libchrysacore_la_SOURCES = \
$(GOBJECT_LEAKS_SOURCES)
-libchrysacore_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBXML_LIBS) $(LIBSQLITE_LIBS) $(LIBARCHIVE_LIBS)
+# -ldl: dladdr(), dlerror()
+libchrysacore_la_LDFLAGS = \
+ -avoid-version -ldl \
+ $(LIBGTK_LIBS) $(LIBXML_LIBS) \
+ $(LIBSQLITE_LIBS) $(LIBARCHIVE_LIBS)
libchrysacore_la_LIBADD = \
analysis/libanalysis.la \
diff --git a/src/core/logs.h b/src/core/logs.h
index d3a81b6..a58a5a8 100644
--- a/src/core/logs.h
+++ b/src/core/logs.h
@@ -25,6 +25,7 @@
#define _CORE_LOGS_H
+#include <dlfcn.h>
#include <errno.h>
#include <netdb.h>
#include <stdarg.h>
@@ -105,6 +106,17 @@ void log_variadic_message(LogMessageType, const char *, ...);
} \
while (0)
+#define LOG_ERROR_DL_N(func) \
+ do \
+ { \
+ const char *__msg_ptr; \
+ __msg_ptr = dlerror(); \
+ if (__msg_ptr == NULL) \
+ __msg_ptr = "???"; \
+ log_variadic_message(LMT_EXT_ERROR, "[%s:%u] %s: %s", __FUNCTION__, __LINE__, func, __msg_ptr); \
+ } \
+ while (0)
+
#define LOG_ERROR_GAI_N(func, errcode) \
do \
{ \
diff --git a/src/core/paths.c b/src/core/paths.c
index 7f4765e..0bb59e7 100644
--- a/src/core/paths.c
+++ b/src/core/paths.c
@@ -24,7 +24,10 @@
#include "paths.h"
+#include <assert.h>
+#include <dlfcn.h>
#include <glib.h>
+#include <libgen.h>
#include <malloc.h>
#include <stdio.h>
#include <string.h>
@@ -34,6 +37,7 @@
#include <config.h>
+#include "logs.h"
#include "../common/extstr.h"
@@ -108,6 +112,119 @@ char *get_effective_directory(const char *template)
/******************************************************************************
* *
+* Paramètres : type = type de répertoire de travail visé. *
+* *
+* Description : Fournit le répertoire réel correspondant à une cible. *
+* *
+* Retour : Répertoire de travail effectif. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *get_effective_directory_new(TargetDirectoryType type)
+{
+ char *result; /* Répertoire à retourner */
+#ifdef DISCARD_LOCAL
+ Dl_info info; /* Informations dynamiques */
+ int ret; /* Bilan d'une récupération */
+ char *dyn_path_tmp; /* Chemin d'accès modifiable */
+ const char *dyn_path; /* Chemin d'accès courant */
+# ifdef PYTHON_PACKAGE
+ size_t len; /* Taille de comparaison */
+ size_t pos; /* Position dans une chaîne */
+# endif
+#endif
+
+ /**
+ * Toutes les définitions traitées dans cette fonction doivent rester synchronisées
+ * avec celles du fichier configure.ac.
+ *
+ * Quand les ressources issues du code source ne sont pas utilisées, deux cas de
+ * figure sont pris en compte :
+ *
+ * - .../lib
+ * - .../lib/chrysalide-plugins
+ *
+ * - .../lib/python3.7/site-packages/chrysalide-libs
+ * - .../lib/python3.7/site-packages
+ *
+ * Le chemin courant pointe sur le premier élément et doit permettre de retrouver
+ * les autres sur demandes.
+ */
+
+ result = NULL;
+
+#ifdef DISCARD_LOCAL
+
+ ret = dladdr(__FUNCTION__, &info);
+ if (ret == 0)
+ {
+ LOG_ERROR_DL_N("dladdr");
+ goto exit;
+ }
+
+ dyn_path_tmp = strdup(info.dli_fname);
+ dyn_path = dirname(dyn_path_tmp);
+
+#endif
+
+ switch (type)
+ {
+ case TDT_PLUGINS_LIB:
+
+#ifndef DISCARD_LOCAL
+ result = strdup(PACKAGE_SOURCE_DIR G_DIR_SEPARATOR_S "plugins");
+#else
+# ifdef PYTHON_PACKAGE
+
+ len = strlen("chrysalide-libs");
+ pos = strlen(dyn_path);
+
+ if (pos <= len)
+ goto bad_sync;
+
+ pos -= len;
+
+ if (strcmp(&dyn_path[pos], "chrysalide-libs") != 0)
+ goto bad_sync;
+
+ result = strdup(dyn_path);
+ result[pos] = '\0';
+ result = stradd(result, "chrysalide-plugins");
+
+# else
+ result = strdup(dyn_path);
+ result = stradd(result, G_DIR_SEPARATOR_S "chrysalide-plugins");
+# endif
+#endif
+ break;
+
+ default:
+ result = NULL;
+ break;
+
+ }
+
+ bad_sync:
+
+#ifdef DISCARD_LOCAL
+
+ free(dyn_path_tmp);
+
+#endif
+
+ exit:
+
+ assert(result != NULL);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : dirname = répertoire de travail à fouiller. *
* filename = nom de fichier seul comme indice. *
* *
diff --git a/src/core/paths.h b/src/core/paths.h
index e6ce61f..f56beb0 100644
--- a/src/core/paths.h
+++ b/src/core/paths.h
@@ -32,6 +32,16 @@ void register_new_prefix(const char *);
/* Fournit le répertoire réel correspondant à une cible. */
char *get_effective_directory(const char *);
+/* Listes de répertoires d'installation */
+typedef enum _TargetDirectoryType
+{
+ TDT_PLUGINS_LIB, /* Répertoire des extensions */
+
+} TargetDirectoryType;
+
+/* Fournit le répertoire réel correspondant à une cible. */
+char *get_effective_directory_new(TargetDirectoryType);
+
/* Trouve le chemin d'accès complet à un fichier d'image. */
char *find_pixmap_file(const char *);
diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c
index dd4e127..e7ca037 100644
--- a/src/plugins/pglist.c
+++ b/src/plugins/pglist.c
@@ -32,7 +32,6 @@
#include <string.h>
-#include <config.h>
#include <i18n.h>
@@ -75,22 +74,16 @@ static void on_plugin_ref_toggle(gpointer, GPluginModule *, gboolean);
bool init_all_plugins(bool load)
{
-#ifdef DISCARD_LOCAL
char *edir; /* Répertoire de base effectif */
-#endif
char *env; /* Contenu environnemental */
char *saveptr; /* Sauvegarde pour parcours */
char *udir; /* Répertoire supplémentaire ? */
g_rw_lock_init(&_pg_lock);
-#ifndef DISCARD_LOCAL
- browse_directory_for_plugins(PACKAGE_SOURCE_DIR "/plugins");
-#else
- edir = get_effective_directory(PLUGINS_LIB_DIR);
+ edir = get_effective_directory_new(TDT_PLUGINS_LIB);
browse_directory_for_plugins(edir);
free(edir);
-#endif
env = getenv("CHRYSALIDE_PLUGINS_PATH");