From 660db13037a764fdb78611c16d7b025bcd980099 Mon Sep 17 00:00:00 2001 From: Brands Helge Date: Tue, 3 Nov 2015 17:25:57 +0100 Subject: [PATCH 1/4] fix for the snprintf for windows --- require.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/require.c b/require.c index f98bdfd..179dcf9 100644 --- a/require.c +++ b/require.c @@ -190,6 +190,7 @@ int requireDebug=0; /* for readdir: Windows or Posix */ #if defined(_WIN32) + #define ENABLE_N_IN_PRINTF _set_printf_count_output(1); #define DIR_HANDLE HANDLE #define DIR_ENTRY WIN32_FIND_DATA #define IF_OPEN_DIR(f) if(snprintf(f+modulediroffs, sizeof(f)-modulediroffs, "\\*.*"), (dir=FindFirstFile(filename, &direntry)) != INVALID_HANDLE_VALUE || (FindClose(dir), 0)) @@ -200,6 +201,7 @@ int requireDebug=0; #else #include + #define ENABLE_N_IN_PRINTF #define DIR_HANDLE DIR* #define DIR_ENTRY struct dirent* #define IF_OPEN_DIR(f) if ((dir = opendir(f))) @@ -1418,7 +1420,8 @@ static void requireRegister(void) static int firstTime = 1; if (firstTime) { firstTime = 0; - iocshRegister (&ldDef, ldFunc); + ENABLE_N_IN_PRINTF; + iocshRegister (&ldDef, ldFunc); iocshRegister (&libversionShowDef, libversionShowFunc); iocshRegister (&requireDef, requireFunc); registerExternalModules(); From 346f746b321268f98e743394d5d58be3cc0188c9 Mon Sep 17 00:00:00 2001 From: Brands Helge Date: Wed, 4 Nov 2015 12:44:27 +0100 Subject: [PATCH 2/4] check of loaded objects before require for windows --- require.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/require.c b/require.c index 179dcf9..71b6707 100644 --- a/require.c +++ b/require.c @@ -153,6 +153,9 @@ int requireDebug=0; #endif #include + #include + #pragma comment(lib, "kernel32.lib") + #pragma comment(lib, "psapi.lib") #include "asprintf.h" #define snprintf _snprintf #define setenv(name,value,overwrite) _putenv_s(name,value) @@ -561,7 +564,61 @@ static void registerExternalModules() static void registerExternalModules() { - fprintf (stderr, "How to find symbols on Windows?\n"); + HMODULE hMods[1024]; + HANDLE hProcess = GetCurrentProcess(); + DWORD cbNeeded; + char* p; + char* version; + char* symname; + char* name; + char location[MAX_PATH]; + unsigned int i; + + if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) + { + + for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) + { + TCHAR szModName[MAX_PATH]; + + // Get the full path to the module's file. + + if (GetModuleFileNameEx(hProcess, hMods[i], szModName, + sizeof(szModName) / sizeof(TCHAR))) + { + // Print the module name and handle value. + name = malloc(strlen(szModName) + strlen("LibRelease")); + strcpy(name, szModName); + + p = strrchr(name, 92); /* find file name part in "/lib.so" */ + if (p) { *p = 0; strcpy(location, name); } /* terminate "/" */ + else p = szModName; + symname = p; + symname[0] = '_'; + p = strchr(symname, '.'); /* replace ".so" with "LibRelease" */ + if (p == NULL) p = symname + strlen(symname); + strcpy(p, "LibRelease"); + + version = (char*)GetProcAddress(hMods[i],symname); + if (version){ + registerModule(symname, version, location); + } + + free(name); + + } + } + + } + + // Release the handle to the process. + + CloseHandle(hProcess); + + + + + } From 47f1f59b85e347ffa83f6e2f0bb1916900176802 Mon Sep 17 00:00:00 2001 From: Brands Helge Date: Wed, 4 Nov 2015 13:10:57 +0100 Subject: [PATCH 3/4] loading standard epicsbase dbd file without version --- require.c | 1 + 1 file changed, 1 insertion(+) diff --git a/require.c b/require.c index 71b6707..5ce164b 100644 --- a/require.c +++ b/require.c @@ -1359,6 +1359,7 @@ loadlib: TRY_NONEMPTY_FILE(releasediroffs, "%s%s.dbd", module, versionstr) || TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "dbd" OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) || TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr)) + TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR "dbd" OSI_PATH_SEPARATOR "%s.dbd", module)) //org EPICSbase { printf("Loading dbd file %s\n", filename); if (dbLoadDatabase(filename, NULL, NULL) != 0) From ff6f524a8a20d2b9aae9aac5f82bab02426ce10b Mon Sep 17 00:00:00 2001 From: Brands Helge Date: Wed, 4 Nov 2015 13:16:21 +0100 Subject: [PATCH 4/4] missed commit for added path check --- require.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/require.c b/require.c index 5ce164b..ce8da62 100644 --- a/require.c +++ b/require.c @@ -1358,7 +1358,7 @@ loadlib: if (TRY_NONEMPTY_FILE(releasediroffs, "dbd" OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) || TRY_NONEMPTY_FILE(releasediroffs, "%s%s.dbd", module, versionstr) || TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "dbd" OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) || - TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr)) + TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr)|| TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR "dbd" OSI_PATH_SEPARATOR "%s.dbd", module)) //org EPICSbase { printf("Loading dbd file %s\n", filename);