Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b
Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/src/dns/win32/srv.c b/src/dns/win32/srv.c
new file mode 100644
index 0000000..0ca0749
--- /dev/null
+++ b/src/dns/win32/srv.c
@@ -0,0 +1,100 @@
+/**
+ * @file win32/srv.c Get DNS Server IP code for Windows
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+#include <winsock2.h>
+#include <iphlpapi.h>
+#include <io.h>
+#include <re_types.h>
+#include <re_fmt.h>
+#include <re_mbuf.h>
+#include <re_list.h>
+#include <re_sa.h>
+#include <re_dns.h>
+#include "../dns.h"
+
+
+#define DEBUG_MODULE "win32/srv"
+#define DEBUG_LEVEL 5
+#include <re_dbg.h>
+
+
+int get_windns(char *domain, size_t dsize, struct sa *srvv, uint32_t *n)
+{
+ FIXED_INFO * FixedInfo = NULL;
+ ULONG ulOutBufLen;
+ DWORD dwRetVal;
+ IP_ADDR_STRING * pIPAddr;
+ HANDLE hLib;
+ union {
+ FARPROC proc;
+ DWORD (WINAPI *_GetNetworkParams)(FIXED_INFO*, DWORD*);
+ } u;
+ uint32_t i;
+ int err;
+
+ if (!srvv || !n || !*n)
+ return EINVAL;
+
+ hLib = LoadLibrary(TEXT("iphlpapi.dll"));
+ if (!hLib)
+ return ENOSYS;
+
+ u.proc = GetProcAddress(hLib, TEXT("GetNetworkParams"));
+ if (!u.proc) {
+ err = ENOSYS;
+ goto out;
+ }
+
+ FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, sizeof( FIXED_INFO ));
+ ulOutBufLen = sizeof( FIXED_INFO );
+
+ if (ERROR_BUFFER_OVERFLOW == (*u._GetNetworkParams)(FixedInfo,
+ &ulOutBufLen)) {
+ GlobalFree( FixedInfo );
+ FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, ulOutBufLen);
+ }
+
+ if ((dwRetVal = (*u._GetNetworkParams)( FixedInfo, &ulOutBufLen ))) {
+ DEBUG_WARNING("couldn't get network params (%d)\n", dwRetVal);
+ err = ENOENT;
+ goto out;
+ }
+
+ str_ncpy(domain, FixedInfo->DomainName, dsize);
+
+#if 0
+ printf( "Host Name: %s\n", FixedInfo->HostName);
+ printf( "Domain Name: %s\n", FixedInfo->DomainName);
+ printf( "DNS Servers:\n" );
+ printf( "\t%s\n", FixedInfo->DnsServerList.IpAddress.String );
+#endif
+
+ i = 0;
+ pIPAddr = &FixedInfo->DnsServerList;
+ while (pIPAddr && strlen(pIPAddr->IpAddress.String) > 0) {
+ err = sa_set_str(&srvv[i], pIPAddr->IpAddress.String,
+ DNS_PORT);
+ if (err) {
+ DEBUG_WARNING("sa_set_str: %s (%m)\n",
+ pIPAddr->IpAddress.String, err);
+ }
+ DEBUG_INFO("dns ip %u: %j\n", i, &srvv[i]);
+ ++i;
+ pIPAddr = pIPAddr ->Next;
+
+ if (i >= *n)
+ break;
+ }
+
+ *n = i;
+ DEBUG_INFO("got %u nameservers\n", i);
+ err = i>0 ? 0 : ENOENT;
+
+ out:
+ if (FixedInfo)
+ GlobalFree(FixedInfo);
+ FreeLibrary(hLib);
+ return err;
+}