aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ares/ares_library_init.c109
-rw-r--r--ares/ares_library_init.h24
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 */
+