slirp_dns.c revision a23fabd0d28588765599497dc1faa277e95a5e50
/* $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
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 */
{
char bTest;
int rc = VERR_NO_MEMORY;
*pcbRead = 0;
{
if (cbRead == 0)
return VERR_EOF;
{
*pu8Buf = 0;
return VINF_SUCCESS;
}
pu8Buf++;
(*pcbRead)++;
}
return rc;
}
{
char buff[512];
char buff2[256];
RTFILE f;
int cNameserversFound = 0;
bool fWarnTooManyDnsServers = false;
int rc;
# ifdef RT_OS_OS2
/* Try various locations. */
if (etc)
{
}
if (RT_FAILURE(rc))
{
}
if (RT_FAILURE(rc))
{
}
# else /* !RT_OS_OS2 */
# ifndef DEBUG_vvl
# else
if (RT_SUCCESS(rc))
else
{
}
# endif
# endif /* !RT_OS_OS2 */
if (RT_FAILURE(rc))
return -1;
if (ppszDomain)
*ppszDomain = NULL;
Log(("NAT: DNS Servers:\n"));
{
if ( cNameserversFound == 4
{
fWarnTooManyDnsServers = true;
LogRel(("NAT: too many nameservers registered.\n"));
}
{
continue;
/* localhost mask */
if (!pDns)
{
Log(("can't alloc memory for DNS entry\n"));
return -1;
}
/* check */
if ((pDns->de_addr.s_addr & RT_H2N_U32_C(IN_CLASSA_NET)) == RT_N2H_U32_C(INADDR_LOOPBACK & IN_CLASSA_NET))
{
}
}
{
char *tok;
char *saveptr;
int fFoundDomain = 0;
{
{
fFoundDomain = 1;
break;
}
}
{
if (!pDomain)
{
Log(("NAT: not enought memory to add domain list\n"));
return VERR_NO_MEMORY;
}
}
}
}
RTFileClose(f);
if (!cNameserversFound)
return -1;
return 0;
}
#endif /* !RT_OS_WINDOWS */
{
int rc = VINF_SUCCESS;
if (!pData->fUseHostResolver)
{
/**
* Some distributions haven't got /etc/resolv.conf
* so we should other way to configure DNS settings.
*/
else
}
return rc;
}
{
int rc = VINF_SUCCESS;
{
}
{
}
return rc;
}