- Timestamp:
- Mar 2, 2009 9:19:24 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 43544
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/slirp.c
r17225 r17227 326 326 const char **ppszDomain) 327 327 { 328 OSVERSIONINFOEX osvi; 329 DWORDLONG condition = 0; 330 int op = VER_GREATER_EQUAL; 331 332 /* DNS information retriving is window's version specific, 333 * so the OS version should be defined first 334 */ 335 memset(&osvi, 0, sizeof(OSVERSIONINFOEX)); 336 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 337 osvi.dwMajorVersion = 5; /* Win XP*/ 338 osvi.dwMinorVersion = 1; 328 /* Get amount of memory required for operation */ 329 ULONG flags = GAA_FLAG_INCLUDE_PREFIX; /*GAA_FLAG_INCLUDE_ALL_INTERFACES;*/ /* all interfaces registered in NDIS */ 330 PIP_ADAPTER_ADDRESSES addresses = NULL; 331 PIP_ADAPTER_ADDRESSES addr = NULL; 332 PIP_ADAPTER_DNS_SERVER_ADDRESS dns = NULL; 333 ULONG size = 0; 334 char *suffix; 335 struct dns_entry *da = NULL; 336 ULONG ret = ERROR_SUCCESS; 339 337 340 VER_SET_CONDITION(condition, VER_MAJORVERSION, op); 341 VER_SET_CONDITION(condition, VER_MINORVERSION, op); 338 /* @todo add SKIPing flags to get only required information */ 339 340 ret = pData->pfGetAdaptersAddresses(AF_INET, 0, NULL /* reserved */, addresses, &size); 341 if (ret != ERROR_BUFFER_OVERFLOW) 342 { 343 LogRel(("NAT: error %lu occured on capacity detection operation\n", ret)); 344 return -1; 345 } 342 346 343 if (VerifyVersionInfo(&osvi, 344 VER_MAJORVERSION 345 | VER_MINORVERSION, 346 condition)) 347 { 348 /* WinXP sp1 and latter */ 349 /* Get amount of memory required for operation */ 350 ULONG flags = GAA_FLAG_INCLUDE_PREFIX; /*GAA_FLAG_INCLUDE_ALL_INTERFACES;*/ /* all interfaces registered in NDIS */ 351 PIP_ADAPTER_ADDRESSES addresses = NULL; 352 PIP_ADAPTER_ADDRESSES addr = NULL; 353 PIP_ADAPTER_DNS_SERVER_ADDRESS dns = NULL; 354 ULONG size = 0; 355 char *suffix; 356 struct dns_entry *da = NULL; 357 ULONG ret = ERROR_SUCCESS; 358 359 /* @todo add SKIPing flags to get only required information */ 360 361 ret = pData->pfGetAdaptersAddresses(AF_INET, 0, NULL /* reserved */, addresses, &size); 362 if (ret != ERROR_BUFFER_OVERFLOW) 347 if (size == 0) 348 { 349 LogRel(("NAT: Win socket API returns non capacity\n")); 350 return -1; 351 } 352 353 addresses = RTMemAllocZ(size); 354 if (addresses == NULL) 355 { 356 LogRel(("NAT: No memory available \n")); 357 return -1; 358 } 359 360 ret = pData->pfGetAdaptersAddresses(AF_INET, 0, NULL /* reserved */, addresses, &size); 361 if (ret != ERROR_SUCCESS) 362 { 363 LogRel(("NAT: error %lu occured on fetching adapters info\n", ret)); 364 return -1; 365 } 366 addr = addresses; 367 while(addr != NULL) 368 { 369 size_t buff_size; 370 if (addr->OperStatus != IfOperStatusUp) 371 goto next; 372 dns = addr->FirstDnsServerAddress; 373 while (dns != NULL) 363 374 { 364 LogRel(("NAT: error %lu occured on capacity detection operation\n", ret)); 365 return -1; 375 struct sockaddr *saddr = dns->Address.lpSockaddr; 376 if (saddr->sa_family != AF_INET) 377 goto next_dns; 378 /* add dns server to list */ 379 da = RTMemAllocZ(sizeof(struct dns_entry)); 380 if (da == NULL) 381 { 382 LogRel(("NAT: Can't allocate buffer for DNS entry\n")); 383 return VERR_NO_MEMORY; 384 } 385 LogRel(("NAT: adding %R[IP4] to DNS server list\n", &((struct sockaddr_in *)saddr)->sin_addr)); 386 if ((((struct sockaddr_in *)saddr)->sin_addr.s_addr & htonl(IN_CLASSA_NET)) == ntohl(INADDR_LOOPBACK & IN_CLASSA_NET)) { 387 da->de_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_ALIAS); 388 } 389 else 390 { 391 da->de_addr.s_addr = ((struct sockaddr_in *)saddr)->sin_addr.s_addr; 392 } 393 LIST_INSERT_HEAD(&pData->dns_list_head, da, de_list); 394 next_dns: 395 dns = dns->Next; 366 396 } 367 368 if (size == 0) 369 { 370 LogRel(("NAT: Win socket API returns non capacity\n")); 371 return -1; 372 } 373 374 addresses = RTMemAllocZ(size); 375 if (addresses == NULL) 376 { 377 LogRel(("NAT: No memory available \n")); 378 return -1; 379 } 380 381 ret = pData->pfGetAdaptersAddresses(AF_INET, 0, NULL /* reserved */, addresses, &size); 382 if (ret != ERROR_SUCCESS) 383 { 384 LogRel(("NAT: error %lu occured on fetching adapters info\n", ret)); 385 return -1; 386 } 387 addr = addresses; 388 while(addr != NULL) 389 { 390 size_t buff_size; 391 if (addr->OperStatus != IfOperStatusUp) 392 goto next; 393 dns = addr->FirstDnsServerAddress; 394 while (dns != NULL) 395 { 396 struct sockaddr *saddr = dns->Address.lpSockaddr; 397 if (saddr->sa_family != AF_INET) 398 goto next_dns; 399 /* add dns server to list */ 400 da = RTMemAllocZ(sizeof(struct dns_entry)); 401 if (da == NULL) 402 { 403 LogRel(("NAT: Can't allocate buffer for DNS entry\n")); 404 return VERR_NO_MEMORY; 405 } 406 LogRel(("NAT: adding %R[IP4] to DNS server list\n", &((struct sockaddr_in *)saddr)->sin_addr)); 407 if ((((struct sockaddr_in *)saddr)->sin_addr.s_addr & htonl(IN_CLASSA_NET)) == ntohl(INADDR_LOOPBACK & IN_CLASSA_NET)) { 408 da->de_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_ALIAS); 409 } 410 else 411 { 412 da->de_addr.s_addr = ((struct sockaddr_in *)saddr)->sin_addr.s_addr; 413 } 414 LIST_INSERT_HEAD(&pData->dns_list_head, da, de_list); 415 next_dns: 416 dns = dns->Next; 417 } 418 buff_size = wcstombs(NULL, addr->DnsSuffix, 0); 419 if (buff_size == 0) 420 goto next; 421 suffix = RTMemAllocZ(buff_size); 422 wcstombs(suffix, addr->DnsSuffix, buff_size); 423 LogRel(("NAT: adding %s to DNS suffix list\n", suffix)); 424 *ppszDomain = suffix; 425 next: 426 addr = addr->Next; 427 } 428 /*@todo add dns suffix if required */ 429 LogRel(("NAT: adding dns suffix %s to the list \n", ppszDomain)); 430 } 431 else 432 { 433 /* Win 2000 and earlier */ 434 } 397 buff_size = wcstombs(NULL, addr->DnsSuffix, 0); 398 if (buff_size == 0) 399 goto next; 400 suffix = RTMemAllocZ(buff_size); 401 wcstombs(suffix, addr->DnsSuffix, buff_size); 402 LogRel(("NAT: adding %s to DNS suffix list\n", suffix)); 403 *ppszDomain = suffix; 404 next: 405 addr = addr->Next; 406 } 407 /*@todo add dns suffix if required */ 408 LogRel(("NAT: adding dns suffix %s to the list \n", ppszDomain)); 435 409 return 0; 436 410 }
Note:
See TracChangeset
for help on using the changeset viewer.