diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/logs.h | 12 | ||||
-rw-r--r-- | src/core/paths.c | 117 | ||||
-rw-r--r-- | src/core/paths.h | 10 |
3 files changed, 139 insertions, 0 deletions
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 *); |