VirtualBox

Ignore:
Timestamp:
Nov 12, 2007 5:21:33 PM (17 years ago)
Author:
vboxsync
Message:

Make sure DNS forwarding address is kept current. It can change at
runtime.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r5332 r5716  
    1313#ifdef _WIN32
    1414
    15 static int get_dns_addr_domain(PNATState pData, struct in_addr *pdns_addr,
     15static int get_dns_addr_domain(PNATState pData, bool fVerbose,
     16                               struct in_addr *pdns_addr,
    1617                               const char **ppszDomain)
    1718{
     
    2627    BufLen = sizeof(FIXED_INFO);
    2728
     29    /** @todo: this API returns all DNS servers, no matter whether the
     30     * corresponding network adapter is disabled or not. Maybe replace
     31     * this by GetAdapterAddresses(), which is XP/Vista only though. */
    2832    if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(FixedInfo, &BufLen)) {
    2933        if (FixedInfo) {
     
    4650    pIPAddr = &(FixedInfo->DnsServerList);
    4751    inet_aton(pIPAddr->IpAddress.String, &tmp_addr);
     52    Log(("nat: DNS Servers:\n"));
     53    if (fVerbose || pdns_addr->s_addr != tmp_addr.s_addr)
     54        LogRel(("NAT: DNS address: %s\n", pIPAddr->IpAddress.String));
    4855    *pdns_addr = tmp_addr;
    49     Log(("nat: DNS Servers:\n"));
    50     LogRel(("NAT: DNS address: %s\n", pIPAddr->IpAddress.String));
    5156
    5257    pIPAddr = FixedInfo -> DnsServerList.Next;
    5358    while ( pIPAddr )
    5459    {
    55         LogRel(("NAT: ignored DNS address: %s\n", pIPAddr ->IpAddress.String));
     60        if (fVerbose)
     61            LogRel(("NAT: ignored DNS address: %s\n", pIPAddr ->IpAddress.String));
    5662        pIPAddr = pIPAddr ->Next;
    5763    }
     
    6268
    6369get_dns_prefix:
    64     *ppszDomain = NULL;
     70    if (ppszDomain)
    6571    {
    6672        OSVERSIONINFO ver;
     
    6874        DWORD dwSize = sizeof(szDnsDomain);
    6975
     76        *ppszDomain = NULL;
    7077        GetVersionEx(&ver);
    7178        if (ver.dwMajorVersion >= 5)
     
    7986                    *ppszDomain = RTStrDup(szDnsDomain);
    8087                    if (pData->fPassDomain)
    81                         LogRel(("NAT: passing domain name %s\n", szDnsDomain));
     88                    {
     89                        if (fVerbose)
     90                            LogRel(("NAT: passing domain name %s\n", szDnsDomain));
     91                    }
    8292                    else
    8393                        Log(("nat: ignoring domain %s\n", szDnsDomain));
     
    93103#else
    94104
    95 static int get_dns_addr_domain(PNATState pData, struct in_addr *pdns_addr,
     105static int get_dns_addr_domain(PNATState pData, bool fVerbose,
     106                               struct in_addr *pdns_addr,
    96107                               const char **ppszDomain)
    97108{
     
    125136        return -1;
    126137
    127     *ppszDomain = NULL;
     138    if (ppszDomain)
     139        *ppszDomain = NULL;
    128140    Log(("nat: DNS Servers:\n"));
    129141    while (fgets(buff, 512, f) != NULL) {
     
    136148            if (!found)
    137149            {
     150                if (fVerbose || pdns_addr->s_addr != tmp_addr.s_addr)
     151                    LogRel(("NAT: DNS address: %s\n", buff2));
    138152                *pdns_addr = tmp_addr;
    139                 LogRel(("NAT: DNS address: %s\n", buff2));
    140153            }
    141154            else
    142                 LogRel(("NAT: ignored DNS address: %s\n", buff2));
     155            {
     156                if (fVerbose)
     157                    LogRel(("NAT: ignored DNS address: %s\n", buff2));
     158            }
    143159            found++;
    144160        }
    145         if (!strncmp(buff, "domain", 6) || !strncmp(buff, "search", 6))
     161        if (   ppszDomain
     162            && (!strncmp(buff, "domain", 6) || !strncmp(buff, "search", 6)))
    146163        {
    147164            /* Domain name/search list present. Pick first entry */
     
    149166            {
    150167                char *tok;
    151                 tok = strtok(&buff[6], " \t\n");
     168                char *saveptr;
     169                tok = strtok_r(&buff[6], " \t\n", &saveptr);
    152170                if (tok)
    153171                {
    154172                    *ppszDomain = RTStrDup(tok);
    155173                    if (pData->fPassDomain)
    156                         LogRel(("NAT: passing domain name %s\n", tok));
     174                    {
     175                        if (fVerbose)
     176                            LogRel(("NAT: passing domain name %s\n", tok));
     177                    }
    157178                    else
    158179                        Log(("nat: ignoring domain %s\n", tok));
     
    168189
    169190#endif
     191
     192int get_dns_addr(PNATState pData, struct in_addr *pdns_addr)
     193{
     194    return get_dns_addr_domain(pData, false, pdns_addr, NULL);
     195}
    170196
    171197int slirp_init(PNATState *ppData, const char *pszNetAddr, bool fPassDomain,
     
    207233    inet_aton("127.0.0.1", &dns_addr);
    208234
    209     if (get_dns_addr_domain(pData, &dns_addr, &pData->pszDomain) < 0)
     235    if (get_dns_addr_domain(pData, true, &dns_addr, &pData->pszDomain) < 0)
    210236        fNATfailed = 1;
    211237
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette