diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/core/logs.h | 12 | ||||
-rw-r--r-- | src/core/paths.c | 117 | ||||
-rw-r--r-- | src/core/paths.h | 10 | ||||
-rw-r--r-- | src/plugins/pglist.c | 9 |
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"); |