blob: 0ca07498fa5e5724545aae92d07f090c386a7c04 [file] [log] [blame]
/**
* @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;
}