bool Instance_LocateModule(const char * name, char * fileName) { #if defined(__WIN32__) HMODULE hModule = null; if(name && name[0]) { uint16 _wmoduleName[MAX_LOCATION]; UTF8toUTF16Buffer(name, _wmoduleName, MAX_LOCATION); hModule = GetModuleHandle(_wmoduleName); if(!hModule) { wcscat(_wmoduleName, L".exe"); hModule = GetModuleHandle(_wmoduleName); } if(hModule) { uint16 _wfileName[MAX_LOCATION]; GetModuleFileNameW(hModule, _wfileName, MAX_LOCATION); UTF16toUTF8Buffer(_wfileName, fileName, MAX_LOCATION); return true; } } else { uint16 _wfileName[MAX_LOCATION]; GetModuleFileNameW(null, _wfileName, MAX_LOCATION); UTF16toUTF8Buffer(_wfileName, fileName, MAX_LOCATION); return true; } #elif defined(__APPLE__) if(name && name[0]) { int imageCount = _dyld_image_count(); int c; int nameLen = strlen(name); for(c = 0; c<imageCount; c++) { struct mach_header * header = _dyld_get_image_header(c); char * path = _dyld_get_image_name(c); int pathLen = strlen(path); char * subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".dylib", 6))) { strcpy(fileName, path); return true; } } } } else { int size = MAX_LOCATION; _NSGetExecutablePath(fileName, &size); return true; } #elif defined(__unix__) //File f = FileOpen("/proc/self/maps", read); FILE * f = null; char exeName[MAX_FILENAME]; exeName[0] = 0; #if defined(__linux__) f = fopen("/proc/self/status", "r"); #else f = fopen("/proc/curproc/status", "r"); #endif if(f) { char line[1025]; while(fgets(line, sizeof(line), f)) { char * name = strstr(line, "Name:\t"); if(name) { int nameLen; name += 6; nameLen = strlen(name); name[--nameLen] = 0; strcpy(exeName, name); break; } } fclose(f); } #if defined(__linux__) f = fopen("/proc/self/maps", "r"); #else f = fopen("/proc/curproc/map", "r"); #endif if(f) { char line[1025]; //while(f.GetLine(line, sizeof(line))) while(fgets(line, sizeof(line), f)) { char * path = strstr(line, "/"); if(path) { int pathLen = strlen(path); path[--pathLen] = 0; if(name && name[0]) { int nameLen = strlen(name); char * subStr; subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".so", 3))) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); fclose(f); return true; } } } else { char name[MAX_FILENAME]; GetLastDirectory(path, name); if(!exeName[0] || !strcmp(name, exeName)) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); fclose(f); return true; } } } } fclose(f); } #if !defined(ECERE_NOFILE) && !defined(__linux__) && !defined(__EMSCRIPTEN__) if(name && name[0]) { // Couldn't locate libraries with /proc/curmap/map, attempt with ldd FILE * in = null, * out = null; _DualPipe * p; char command[MAX_LOCATION]; snprintf(command, sizeof(command), "ldd /proc/%d/file", (int)getpid()); p = _DualPipeOpen(1, command, null, &in, &out); if(p) { bool result = false; char line[1025]; int nameLen = strlen(name); while(DualPipe_GetLine(in, line, sizeof(line))) { char * path = strstr(line, "/"); if(path) { int pathLen = strlen(path); char * subStr; path[--pathLen] = 0; subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".so", 3))) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); result = true; } } } } DualPipe_Wait(p); fclose(in); DualPipe_Destructor(p); return result; } } #endif if(!name || !name[0]) { #if defined(__FreeBSD__) { int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; size_t cb = MAX_LOCATION; fileName[0] = 0; sysctl(mib, 4, fileName, &cb, null, 0); if(fileName[0]) return true; } #endif #if !defined(__linux__) { char * env; if(!access("/proc/curproc/file", F_OK)) { strcpy(fileName, "/proc/curproc/file"); return true; } if((env = getenv("_"))) { strcpy(fileName, env); return true; } } #endif strcpy(fileName, exeLocation); return true; } #endif return false; }
bool Instance_LocateModule(char * name, char * fileName) { #if defined(__WIN32__) HMODULE hModule = null; if(name && name[0]) { uint16 _wmoduleName[MAX_LOCATION]; UTF8toUTF16Buffer(name, _wmoduleName, MAX_LOCATION); hModule = GetModuleHandle(_wmoduleName); if(!hModule) { wcscat(_wmoduleName, L".exe"); hModule = GetModuleHandle(_wmoduleName); } if(hModule) { uint16 _wfileName[MAX_LOCATION]; GetModuleFileNameW(hModule, _wfileName, MAX_LOCATION); UTF16toUTF8Buffer(_wfileName, (byte *)fileName, MAX_LOCATION); return true; } } else { uint16 _wfileName[MAX_LOCATION]; GetModuleFileNameW(null, _wfileName, MAX_LOCATION); UTF16toUTF8Buffer(_wfileName, (byte *)fileName, MAX_LOCATION); return true; } #elif defined(__APPLE__) if(name && name[0]) { int imageCount = _dyld_image_count(); int c; int nameLen = strlen(name); for(c = 0; c<imageCount; c++) { struct mach_header * header = _dyld_get_image_header(c); char * path = _dyld_get_image_name(c); int pathLen = strlen(path); char * subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".dylib", 6))) { strcpy(fileName, path); return true; } } } } else { int size = MAX_LOCATION; _NSGetExecutablePath(fileName, &size); return true; } #elif defined(__unix__) //File f = FileOpen("/proc/self/maps", read); FILE * f; char exeName[MAX_FILENAME]; exeName[0] = 0; #if defined(__linux__) f = fopen("/proc/self/status", "r"); #else f = fopen("/proc/curproc/status", "r"); #endif if(f) { char line[1025]; while(fgets(line, sizeof(line), f)) { char * name = strstr(line, "Name:\t"); if(name) { int nameLen; name += 6; nameLen = strlen(name); name[--nameLen] = 0; strcpy(exeName, name); break; } } fclose(f); } #if defined(__linux__) f = fopen("/proc/self/maps", "r"); #else f = fopen("/proc/curproc/map", "r"); #endif if(f) { char line[1025]; //while(f.GetLine(line, sizeof(line))) while(fgets(line, sizeof(line), f)) { char * path = strstr(line, "/"); if(path) { int pathLen = strlen(path); path[--pathLen] = 0; if(name && name[0]) { int nameLen = strlen(name); char * subStr; subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".so", 3))) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); fclose(f); return true; } } } else { char name[MAX_FILENAME]; GetLastDirectory(path, name); if(!exeName[0] || !strcmp(name, exeName)) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); fclose(f); return true; } } } } fclose(f); } if(!name || !name[0]) { strcpy(fileName, exeLocation); return true; } #endif return false; }