Loading ares/ares_library_init.c 0 → 100644 +109 −0 Original line number Diff line number Diff line /* $Id$ */ #include "setup.h" #include "ares.h" #include "ares_library_init.h" #include "ares_private.h" /* library-private global and unique instance vars */ #ifdef WIN32 fpGetNetworkParams_t fpGetNetworkParams = ZERO_NULL; fpSystemFunction036_t fpSystemFunction036 = ZERO_NULL; #endif /* library-private global vars with source visibility restricted to this file */ static unsigned int ares_initialized; static int ares_init_flags; #ifdef WIN32 static HMODULE hnd_iphlpapi; static HMODULE hnd_advapi32; #endif static int ares_win32_init(void) { #ifdef WIN32 hnd_iphlpapi = 0; hnd_iphlpapi = LoadLibrary("iphlpapi.dll"); if (!hnd_iphlpapi) return ARES_ELOADIPHLPAPI; fpGetNetworkParams = (fpGetNetworkParams_t) GetProcAddress(hnd_iphlpapi, "GetNetworkParams"); if (!fpGetNetworkParams) { FreeLibrary(hnd_iphlpapi); return ARES_EADDRGetNetworkParams; } hnd_advapi32 = 0; hnd_advapi32 = LoadLibrary("advapi32.dll"); if (!hnd_advapi32) { FreeLibrary(hnd_iphlpapi); return ARES_ELOADADVAPI32; } fpSystemFunction036 = (fpSystemFunction036_t) GetProcAddress(hnd_advapi32, "SystemFunction036"); if (!fpSystemFunction036) { FreeLibrary(hnd_advapi32); FreeLibrary(hnd_iphlpapi); return ARES_EADDRSYSTEMFUNCTION036; } #endif return ARES_SUCCESS; } static void ares_win32_cleanup(void) { #ifdef WIN32 if (hnd_advapi32) FreeLibrary(hnd_advapi32); if (hnd_iphlpapi) FreeLibrary(hnd_iphlpapi); #endif } int ares_library_init(int flags) { int res; if (ares_initialized) return ARES_SUCCESS; ares_initialized++; if (flags & ARES_LIB_INIT_WIN32) { res = ares_win32_init(); if (res != ARES_SUCCESS) return res; } ares_init_flags = flags; return ARES_SUCCESS; } void ares_library_cleanup(void) { if (!ares_initialized) return; ares_initialized--; if (ares_init_flags & ARES_LIB_INIT_WIN32) ares_win32_cleanup(); ares_init_flags = ARES_LIB_INIT_NONE; } ares/ares_library_init.h 0 → 100644 +24 −0 Original line number Diff line number Diff line #ifndef HEADER_CARES_LIBRARY_INIT_H #define HEADER_CARES_LIBRARY_INIT_H /* $Id$ */ #include "setup.h" #ifdef WIN32 #include <iphlpapi.h> typedef DWORD (WINAPI *fpGetNetworkParams_t) (FIXED_INFO*, DWORD*); typedef BOOLEAN (APIENTRY *fpSystemFunction036_t) (void*, ULONG); /* Forward-declaration of variables defined in ares_library_init.c */ /* that are global and unique instances for whole c-ares library. */ extern fpGetNetworkParams_t fpGetNetworkParams; extern fpSystemFunction036_t fpSystemFunction036; #endif /* WIN32 */ #endif /* HEADER_CARES_LIBRARY_INIT_H */ Loading
ares/ares_library_init.c 0 → 100644 +109 −0 Original line number Diff line number Diff line /* $Id$ */ #include "setup.h" #include "ares.h" #include "ares_library_init.h" #include "ares_private.h" /* library-private global and unique instance vars */ #ifdef WIN32 fpGetNetworkParams_t fpGetNetworkParams = ZERO_NULL; fpSystemFunction036_t fpSystemFunction036 = ZERO_NULL; #endif /* library-private global vars with source visibility restricted to this file */ static unsigned int ares_initialized; static int ares_init_flags; #ifdef WIN32 static HMODULE hnd_iphlpapi; static HMODULE hnd_advapi32; #endif static int ares_win32_init(void) { #ifdef WIN32 hnd_iphlpapi = 0; hnd_iphlpapi = LoadLibrary("iphlpapi.dll"); if (!hnd_iphlpapi) return ARES_ELOADIPHLPAPI; fpGetNetworkParams = (fpGetNetworkParams_t) GetProcAddress(hnd_iphlpapi, "GetNetworkParams"); if (!fpGetNetworkParams) { FreeLibrary(hnd_iphlpapi); return ARES_EADDRGetNetworkParams; } hnd_advapi32 = 0; hnd_advapi32 = LoadLibrary("advapi32.dll"); if (!hnd_advapi32) { FreeLibrary(hnd_iphlpapi); return ARES_ELOADADVAPI32; } fpSystemFunction036 = (fpSystemFunction036_t) GetProcAddress(hnd_advapi32, "SystemFunction036"); if (!fpSystemFunction036) { FreeLibrary(hnd_advapi32); FreeLibrary(hnd_iphlpapi); return ARES_EADDRSYSTEMFUNCTION036; } #endif return ARES_SUCCESS; } static void ares_win32_cleanup(void) { #ifdef WIN32 if (hnd_advapi32) FreeLibrary(hnd_advapi32); if (hnd_iphlpapi) FreeLibrary(hnd_iphlpapi); #endif } int ares_library_init(int flags) { int res; if (ares_initialized) return ARES_SUCCESS; ares_initialized++; if (flags & ARES_LIB_INIT_WIN32) { res = ares_win32_init(); if (res != ARES_SUCCESS) return res; } ares_init_flags = flags; return ARES_SUCCESS; } void ares_library_cleanup(void) { if (!ares_initialized) return; ares_initialized--; if (ares_init_flags & ARES_LIB_INIT_WIN32) ares_win32_cleanup(); ares_init_flags = ARES_LIB_INIT_NONE; }
ares/ares_library_init.h 0 → 100644 +24 −0 Original line number Diff line number Diff line #ifndef HEADER_CARES_LIBRARY_INIT_H #define HEADER_CARES_LIBRARY_INIT_H /* $Id$ */ #include "setup.h" #ifdef WIN32 #include <iphlpapi.h> typedef DWORD (WINAPI *fpGetNetworkParams_t) (FIXED_INFO*, DWORD*); typedef BOOLEAN (APIENTRY *fpSystemFunction036_t) (void*, ULONG); /* Forward-declaration of variables defined in ares_library_init.c */ /* that are global and unique instances for whole c-ares library. */ extern fpGetNetworkParams_t fpGetNetworkParams; extern fpSystemFunction036_t fpSystemFunction036; #endif /* WIN32 */ #endif /* HEADER_CARES_LIBRARY_INIT_H */