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