Changeset 49824 in vbox
- Timestamp:
- Dec 9, 2013 8:59:41 AM (11 years ago)
- Location:
- trunk/src/VBox/NetworkServices/DHCP
- Files:
-
- 2 edited
-
Makefile.kmk (modified) (1 diff)
-
VBoxNetDHCP.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/NetworkServices/DHCP/Makefile.kmk
r49563 r49824 49 49 ../NetLib/VBoxNetUDP.cpp \ 50 50 ../NetLib/VBoxNetARP.cpp \ 51 ../NetLib/VBoxNetBaseService.cpp 51 ../NetLib/VBoxNetBaseService.cpp \ 52 ../NetLib/ComHostUtils.cpp 52 53 VBoxNetDHCP_LIBS = \ 53 54 $(LIB_RUNTIME) -
trunk/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp
r49735 r49824 64 64 65 65 #include "../NetLib/VBoxNetBaseService.h" 66 #include "../NetLib/utils.h" 66 67 67 68 #ifdef RT_OS_WINDOWS /* WinMain */ … … 109 110 int initNoMain(); 110 111 int initWithMain(); 112 int fetchAndUpdateDnsInfo(); 111 113 112 114 protected: … … 503 505 confManager->addToAddressList(RTNET_DHCP_OPT_ROUTERS, gateway); 504 506 505 unsigned int i; 506 unsigned int count_strs; 507 com::SafeArray<BSTR> strs; 508 std::map<RTNETADDRIPV4, uint32_t> MapIp4Addr2Off; 509 510 hrc = m_NATNetwork->COMGETTER(LocalMappings)(ComSafeArrayAsOutParam(strs)); 511 if ( SUCCEEDED(hrc) 512 && (count_strs = strs.size())) 513 { 514 for (i = 0; i < count_strs; ++i) 515 { 516 char szAddr[17]; 517 RTNETADDRIPV4 ip4addr; 518 char *pszTerm; 519 uint32_t u32Off; 520 com::Utf8Str strLo2Off(strs[i]); 521 const char *pszLo2Off = strLo2Off.c_str(); 522 523 RT_ZERO(szAddr); 524 525 pszTerm = RTStrStr(pszLo2Off, "="); 526 527 if ( pszTerm 528 && (pszTerm - pszLo2Off) <= INET_ADDRSTRLEN) 529 { 530 memcpy(szAddr, pszLo2Off, (pszTerm - pszLo2Off)); 531 int rc = RTNetStrToIPv4Addr(szAddr, &ip4addr); 532 if (RT_SUCCESS(rc)) 533 { 534 u32Off = RTStrToUInt32(pszTerm + 1); 535 if (u32Off != 0) 536 MapIp4Addr2Off.insert( 537 std::map<RTNETADDRIPV4,uint32_t>::value_type(ip4addr, u32Off)); 538 } 539 } 540 } 541 } 542 543 544 RTNETADDRIPV4 address = getIpv4Address(); 545 RTNETADDRIPV4 netmask = getIpv4Netmask(); 546 strs.setNull(); 547 ComPtr<IHost> host; 548 if (SUCCEEDED(virtualbox->COMGETTER(Host)(host.asOutParam()))) 549 { 550 if (SUCCEEDED(host->COMGETTER(NameServers)(ComSafeArrayAsOutParam(strs)))) 551 { 552 RTNETADDRIPV4 addr; 553 554 confManager->flushAddressList(RTNET_DHCP_OPT_DNS); 555 int rc; 556 for (i = 0; i < strs.size(); ++i) 557 { 558 rc = RTNetStrToIPv4Addr(com::Utf8Str(strs[i]).c_str(), &addr); 559 if (RT_SUCCESS(rc)) 560 { 561 if (addr.au8[0] == 127) 562 { 563 if (MapIp4Addr2Off[addr] != 0) 564 { 565 addr.u = RT_H2N_U32(RT_N2H_U32(address.u & netmask.u) 566 + MapIp4Addr2Off[addr]); 567 } 568 else 569 continue; 570 } 571 572 confManager->addToAddressList(RTNET_DHCP_OPT_DNS, addr); 573 } 574 } 575 } 576 577 strs.setNull(); 578 #if 0 579 if (SUCCEEDED(host->COMGETTER(SearchStrings)(ComSafeArrayAsOutParam(strs)))) 580 { 581 /* XXX: todo. */; 582 } 583 strs.setNull(); 584 #endif 585 com::Bstr domain; 586 if (SUCCEEDED(host->COMGETTER(DomainName)(domain.asOutParam()))) 587 confManager->setString(RTNET_DHCP_OPT_DOMAIN_NAME, std::string(com::Utf8Str(domain).c_str())); 588 } 507 int rc = fetchAndUpdateDnsInfo(); 508 AssertMsgRCReturn(rc, ("Wasn't able to fetch Dns info"), rc); 589 509 590 510 com::Bstr strUpperIp, strLowerIp; … … 602 522 RTNetStrToIPv4Addr(com::Utf8Str(strLowerIp).c_str(), &LowerAddress); 603 523 604 RTNETADDRIPV4 networkId; 605 networkId.u = address.u & netmask.u; 524 RTNETADDRIPV4 address = getIpv4Address(); 525 RTNETADDRIPV4 netmask = getIpv4Netmask(); 526 527 RTNETADDRIPV4 networkId = networkid(address, netmask); 606 528 std::string name = std::string("default"); 607 529 … … 618 540 confManager->loadFromFile(strXmlLeaseFile); 619 541 542 return VINF_SUCCESS; 543 } 544 545 546 int VBoxNetDhcp::fetchAndUpdateDnsInfo() 547 { 548 ComHostPtr host; 549 if (SUCCEEDED(virtualbox->COMGETTER(Host)(host.asOutParam()))) 550 { 551 AddressToOffsetMapping mapIp4Addr2Off; 552 int rc = localMappings(m_NATNetwork, mapIp4Addr2Off); 553 /* XXX: here could be several cases: 1. COM error, 2. not found (empty) 3. ? */ 554 AssertMsgRCReturn(rc, ("Can't fetch local mappings"), rc); 555 556 RTNETADDRIPV4 address = getIpv4Address(); 557 RTNETADDRIPV4 netmask = getIpv4Netmask(); 558 559 AddressList nameservers; 560 rc = hostDnsServers(host, networkid(address, netmask), mapIp4Addr2Off, nameservers); 561 AssertMsgRCReturn(rc, ("Debug me!!!"), rc); 562 /* XXX: Search strings */ 563 564 std::string domain; 565 rc = hostDnsDomain(host, domain); 566 AssertMsgRCReturn(rc, ("Debug me!!"), rc); 567 568 { 569 ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager(); 570 confManager->flushAddressList(RTNET_DHCP_OPT_DNS); 571 572 for (AddressList::iterator it = nameservers.begin(); it != nameservers.end(); ++it) 573 confManager->addToAddressList(RTNET_DHCP_OPT_DNS, *it); 574 575 confManager->setString(RTNET_DHCP_OPT_DOMAIN_NAME, domain); 576 } 577 } 578 620 579 return VINF_SUCCESS; 621 580 }
Note:
See TracChangeset
for help on using the changeset viewer.

