diff options
-rw-r--r-- | ares/ares_library_init.c | 109 | ||||
-rw-r--r-- | ares/ares_library_init.h | 24 |
2 files changed, 133 insertions, 0 deletions
diff --git a/ares/ares_library_init.c b/ares/ares_library_init.c new file mode 100644 index 000000000..92bcedf2d --- /dev/null +++ b/ares/ares_library_init.c @@ -0,0 +1,109 @@ +/* $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; +} + diff --git a/ares/ares_library_init.h b/ares/ares_library_init.h new file mode 100644 index 000000000..1b4c760a4 --- /dev/null +++ b/ares/ares_library_init.h @@ -0,0 +1,24 @@ +#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 */ + |