slirp_dns.c revision 02408b6eb88b972d00f66fad1831cf57db55d619
/* $Id$ */
/** @file
* NAT - dns initialization.
*/
/*
* Copyright (C) 2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "slirp.h"
#ifdef RT_OS_OS2
# include <paths.h>
#endif
#ifdef RT_OS_WINDOWS
# include <Winnls.h>
# define _WINSOCK2API_
# include <IPHlpApi.h>
const char **ppszDomain)
{
ULONG flags = GAA_FLAG_INCLUDE_PREFIX; /*GAA_FLAG_INCLUDE_ALL_INTERFACES;*/ /* all interfaces registered in NDIS */
int wlen = 0;
char *pszSuffix;
/** @todo add SKIPing flags to get only required information */
/* determine size of buffer */
size = 0;
if (ret != ERROR_BUFFER_OVERFLOW)
{
return -1;
}
if (size == 0)
{
Log(("NAT: Win socket API returns non capacity\n"));
return -1;
}
if (!pAdapterAddr)
{
Log(("NAT: No memory available\n"));
return -1;
}
if (ret != ERROR_SUCCESS)
{
return -1;
}
{
int found;
continue;
{
continue;
/* add dns server to list */
if (!pDns)
{
Log(("NAT: Can't allocate buffer for DNS entry\n"));
return VERR_NO_MEMORY;
}
else
continue;
/* uniq */
{
continue;
}
found = 0;
{
{
found = 1;
break;
}
}
if (!found)
{
if (!pDomain)
{
Log(("NAT: not enough memory\n"));
return VERR_NO_MEMORY;
}
}
}
}
return 0;
}
#else /* !RT_OS_WINDOWS */
#include "resolv_conf_parser.h"
{
int rc;
unsigned i;
/* XXX: perhaps IPv6 shouldn't be ignored if we're using DNS proxy */
/* for historical reasons: Slirp returns 0 and fall down to host resolver if wasn't able open resolv.conf file */
if(rc == -1)
{
return 0;
}
/* for historical reasons: Slirp returns -1 if no nameservers were found */
if (st.rcps_num_nameserver == 0)
return -1;
/* XXX: We're composing the list, but we already knows
* its size so we can allocate array instead (Linux guests
* dont like >3 servers in the list anyway)
* or use pre-allocated array in NATState.
*/
for (i = 0; i != st.rcps_num_nameserver; ++i)
{
{
/**
* XXX: Note shouldn't patch the address in case of using DNS proxy,
* because DNS proxy we do revert it back actually.
*/
else if (pData->fUseDnsProxy == 0) {
/* We detects that using some address in 127/8 network */
LogRel(("NAT: DNS server %RTnaipv4 registration detected, switching to the DNS proxy\n", address->IPv4));
pData->fUseHostResolver = 0;
}
}
{
return VERR_NO_MEMORY;
}
}
if (st.rcps_domain != 0)
{
{
return -1;
}
}
return 0;
}
#endif /* !RT_OS_WINDOWS */
{
int rc = VINF_SUCCESS;
if (!pData->fUseHostResolverPermanent)
{
/*
* Some distributions haven't got /etc/resolv.conf
* so we should other way to configure DNS settings.
*/
{
/* Load the DNS handler if host resolver mode was not used before. */
if (!pData->fUseHostResolver)
pData->fUseHostResolver = true;
}
else
{
/* Unload to not intercept in the future. */
if (pData->fUseHostResolver)
pData->fUseHostResolver = false;
}
if (!pData->fUseHostResolver)
{
int cDNSListEntry = 0;
{
}
}
}
return rc;
}
{
int rc = VINF_SUCCESS;
{
}
{
}
return rc;
}