diff --git a/tests/server/util.c b/tests/server/util.c index 06f3ce10de..8158cb2914 100644 --- a/tests/server/util.c +++ b/tests/server/util.c @@ -55,6 +55,10 @@ #define EINVAL 22 /* errno.h value */ #endif +#if __MINGW32__ +#include +#endif + #if defined(ENABLE_IPV6) && defined(__MINGW32__) const struct in6_addr in6addr_any = {{ IN6ADDR_ANY_INIT }}; #endif @@ -248,6 +252,58 @@ int wait_ms(int timeout_ms) return r; } +#ifdef __MINGW32__ +/* WORKAROUND + * + * These functions make it possible to get the Msys PID instead of the + * Windows PID assigned to the current process. This is done by walking up + * to the Msys sh.exe process that launched the shadow Windows processes. + * + * Usually an Msys process would result in following process tree: + * sh.exe <-- waiting Windows process, but running Msys process + * \ + * .exe <-- waiting Windows process + * \ + * .exe <-- running Windows process + * + * Attention: This may not be true for all Msys processes. + */ +static pid_t getpid_msys(void) +{ + PROCESSENTRY32 entry; + HANDLE snapshot; + DWORD pid; + BOOL walk; + + pid = (DWORD)getpid(); + + entry.dwSize = sizeof(PROCESSENTRY32); + snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, pid); + + if(snapshot != INVALID_HANDLE_VALUE) { + walk = TRUE; + while(walk) { + if(Process32First(snapshot, &entry)) { + do { + if(pid == entry.th32ProcessID) { + if(!strcmp(entry.szExeFile, "sh.exe")) { + walk = FALSE; + break; + } + pid = entry.th32ParentProcessID; + break; + } + } while (Process32Next(snapshot, &entry)); + } + } + CloseHandle(snapshot); + } + + return (pid_t)pid; +} +#define getpid() getpid_msys() +#endif + int write_pidfile(const char *filename) { FILE *pidfile;