From 58e8071eb8d6ef0511c2ef08164a487ae57dc258 Mon Sep 17 00:00:00 2001 From: "Lucas A. M. Magalhaes" <lucas.magalhaes@ess.eu> Date: Wed, 2 Aug 2023 09:52:25 +0200 Subject: [PATCH] Remove registerExternalModules The E3 does not use modules linked out of require so this code is superfluous here. It was used to register require itself however the code complexity was not justified for such simple task. To fulfill this a simpler function was added just to register require. --- require-ess/src/require.c | 83 ++++++++++----------------------------- 1 file changed, 21 insertions(+), 62 deletions(-) diff --git a/require-ess/src/require.c b/require-ess/src/require.c index b97b7a7e..b4be07c4 100644 --- a/require-ess/src/require.c +++ b/require-ess/src/require.c @@ -97,6 +97,9 @@ int requireDebug; #define TEMPLATEDIR "db" #define LIBRELEASE "LibRelease" +#define E3_REQUIRE_LOCATION "E3_REQUIRE_LOCATION" +#define E3_REQUIRE_VERSION "E3_REQUIRE_VERSION" + #ifndef OS_CLASS #error OS_CLASS not defined: Try to compile with USR_CFLAGS += -DOS_CLASS='"${OS_CLASS}"' #endif // OS_CLASS @@ -260,70 +263,24 @@ static void fillModuleListRecord(initHookState state) { } } -#if defined(__linux) -/* This is the Linux link.h, not the EPICS link.h ! */ -#include <link.h> - -static int findLibRelease(struct dl_phdr_info *info, /* shared library info */ - size_t size, /* size of info structure */ - void *data /* user-supplied arg */ -) { - void *handle = NULL; - char *location = NULL; - char *p = NULL; - char *version = NULL; - char *symname = NULL; - /* get space for library path + "LibRelease" */ - char name[PATH_MAX + (sizeof(LIBRELEASE)/sizeof(char))] = {0}; - - struct linkedList *linkedlist = (struct linkedList*)data; - if (size < sizeof(struct dl_phdr_info)) - return 0; /* wrong version of struct dl_phdr_info */ - - /* find a symbol with a name like "_<module>LibRelease" - where <module> is from the library name "<location>/lib<module>.so" */ - - /* no library name */ - if (info->dlpi_name == NULL || info->dlpi_name[0] == 0) return 0; - /* get a modifiable copy of the library name */ - strcpy(name, info->dlpi_name); - /* re-open already loaded library */ - handle = dlopen(info->dlpi_name, RTLD_LAZY); - /* find file name part in "<location>/lib<module>.so" */ - p = strrchr(name, '/'); - if (p) { - location = name; - *++p = 0; - } else { - /* terminate "<location>/" (if exists) */ - p = name; - } - *(symname = p + 2) = '_'; /* replace "lib" with "_" */ - p = strchr(symname, '.'); /* find ".so" extension */ - if (p == NULL) p = symname + strnlen(symname, PATH_MAX); /* no file extension ? */ - strcpy(p, LIBRELEASE); /* append "LibRelease" to module name */ - version = dlsym(handle, symname); /* find symbol "_<module>LibRelease" */ - if (version) { - *p = 0; - symname++; /* get "<module>" from "_<module>LibRelease" */ - if ((p = strstr(name, "/" LIBDIR)) != NULL) - p[1] = 0; /* cut "<location>" before LIBDIR */ - if (getLibVersion(linkedlist, symname) == NULL) - registerModule(linkedlist, symname, version, location); - } - dlclose(handle); - return 0; -} +static int registerRequire(){ + char *requireLocation = NULL; + char *requireVersion = NULL; -static void registerExternalModules() { - /* iterate over all loaded libraries */ - dl_iterate_phdr(findLibRelease, (void *)&loadedModules); + requireLocation = getenv(E3_REQUIRE_LOCATION); + if (!requireLocation){ + printf("require: Failed to get " E3_REQUIRE_LOCATION "\n"); + return -1; + } + requireVersion = getenv(E3_REQUIRE_VERSION); + if (!requireVersion){ + printf("require: Failed to get " E3_REQUIRE_VERSION "\n"); + return -1; + } + registerModule(&loadedModules, "require", requireVersion, requireLocation); + return 0; } -#else -static void registerExternalModules() { ; } -#endif - int libversionShow(const char *outfile) { struct module *m = NULL; @@ -1000,7 +957,9 @@ static void requireRegister(void) { iocshRegister(&libversionShowDef, libversionShowFunc); iocshRegister(&ldDef, ldFunc); iocshRegister(&pathAddDef, pathAddFunc); - registerExternalModules(); + if(registerRequire() != 0){ + printf("require: Could not register require.\n"); + } set_require_env(); initHookRegister(fillModuleListRecord); -- GitLab