Ignore:
Timestamp:
Feb 21, 2002, 6:01:57 PM (24 years ago)
Author:
sandervl
Message:

PF: GetNetworkParams bugfixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/iphlpapi/iphlpapi.cpp

    r7973 r7981  
    1 /* $Id: iphlpapi.cpp,v 1.6 2002-02-20 11:57:31 sandervl Exp $ */
     1/* $Id: iphlpapi.cpp,v 1.7 2002-02-21 17:01:57 sandervl Exp $ */
    22/*
    33 *      IPHLPAPI library
     
    303303}
    304304
    305 static DWORD i_sizeOfFIXED_INFO(PFIXED_INFO pinfo)
    306 {
    307  PIP_ADDR_STRING pias;
    308 
    309  DWORD dwRequired = sizeof( FIXED_INFO );
    310  
    311  // follow the IP_ADDR_STRING lists
    312  pias = &pinfo->DnsServerList;
    313  while( pias )
    314  {
    315    dwRequired += sizeof( IP_ADDR_STRING );
    316    pias = pias->Next;
    317  }
    318  return dwRequired;
    319 }
    320 
    321305static DWORD i_sizeOfIP_ADAPTER_INFO(PIP_ADAPTER_INFO piai)
    322306{
     
    448432{
    449433  struct sockaddr_in * sin;
    450   FIXED_INFO fi;
     434  PFIXED_INFO fi = pFixedInfo;
    451435  DWORD memNeeded;
    452436  PIP_ADDR_STRING dnslist = NULL, pdnslist = NULL;
    453 
    454   // This is dynamically updated info
     437  PBYTE pTarget        = (PBYTE)pFixedInfo;
     438
     439  dprintf(("GetNetworkParams pFixedInfo:%x pOutBufLen:%d",pFixedInfo,*pOutBufLen));
    455440  res_init();
    456   memset(&fi,0,sizeof(FIXED_INFO));
    457 
    458   dprintf(("GetNetworkParams pFixedInfo:%x pOutBufLen:%d",pFixedInfo,*pOutBufLen));
    459 
    460   gethostname(fi.HostName,128);
    461   strcpy(fi.DomainName,_res.defdname);
    462 
    463   // For VPC DNS Servers are pretty much enough for now
    464   fi.CurrentDnsServer = &fi.DnsServerList;   
    465   dnslist = &fi.DnsServerList;
    466   pdnslist = dnslist;
    467 
    468   for (int i = 0; i<_res.nscount; i++)
    469   {
    470       if (!dnslist)   
    471       {
    472           dnslist = (PIP_ADDR_STRING) malloc(sizeof(IP_ADDR_STRING));
    473           memset(dnslist,0,sizeof(IP_ADDR_STRING));
    474           pdnslist->Next = dnslist;
    475       }
    476       sin = (struct sockaddr_in *)&_res.nsaddr_list[i];               
    477       strcpy(dnslist->IpAddress.String,inet_ntoa(sin->sin_addr));
    478       dnslist->Context = 0;
    479       dprintf(("IPHLPAPI: GetNetworkParams Adding DNS Server %s",inet_ntoa(sin->sin_addr)));
    480       pdnslist = dnslist;
    481       dnslist = dnslist->Next;
    482   }     
    483   fi.EnableDns = 1;
    484   // NodeType (?)
    485   memNeeded = i_sizeOfFIXED_INFO(&fi);
    486   LONG buflen = *pOutBufLen;
    487   PBYTE pTarget        = (PBYTE)pFixedInfo;
    488   if (((LONG)(buflen - memNeeded)) > 0)
    489   {
    490     // copy over the whole structure hierarchy
    491     memcpy(pTarget, &fi, sizeof( FIXED_INFO ));
    492     pTarget += sizeof( FIXED_INFO );
    493     i_copyIP_ADDRESS_STRING(&pTarget, &pFixedInfo->DnsServerList,&fi.DnsServerList);
    494   }
    495   else
     441
     442  // Check how much mem we will need
     443  memNeeded = sizeof(FIXED_INFO)+_res.nscount*sizeof(IP_ADDR_STRING);
     444
     445  if (((LONG)(*pOutBufLen - memNeeded)) < 0)
    496446  {
    497447   // return overall size of required buffer
     
    499449   return ERROR_BUFFER_OVERFLOW;
    500450  }
    501 
    502  //cleanup
    503  pdnslist = fi.DnsServerList.Next;
    504  while( pdnslist )
    505  {
    506    dnslist = pdnslist->Next;
    507    free(pdnslist);
    508    pdnslist = dnslist;
    509  }
    510 
    511  return ERROR_SUCCESS;
     451 
     452  // This is dynamically updated info
     453  memset(pFixedInfo,0,memNeeded);
     454 
     455  gethostname(fi->HostName,128);
     456  strcpy(fi->DomainName,_res.defdname);
     457
     458  // For VPC DNS Servers are pretty much enough for now
     459  fi->CurrentDnsServer = &fi->DnsServerList;   
     460  pTarget += sizeof( FIXED_INFO );
     461  dnslist = &fi->DnsServerList;
     462   
     463  for (int i = 0; i<_res.nscount; i++)
     464  {
     465      if (pdnslist) pdnslist->Next = dnslist;
     466      sin = (struct sockaddr_in *)&_res.nsaddr_list[i];               
     467      strcpy(dnslist->IpAddress.String,inet_ntoa(sin->sin_addr));
     468      dprintf(("IPHLPAPI: GetNetworkParams Adding DNS Server %s",inet_ntoa(sin->sin_addr)));
     469      pdnslist = dnslist;
     470      if ( pdnslist == &fi->DnsServerList) dnslist = (PIP_ADDR_STRING)(pTarget + sizeof(IP_ADDR_STRING));
     471      else dnslist += sizeof(IP_ADDR_STRING);
     472  }     
     473  fi->EnableDns = 1;
     474  return ERROR_SUCCESS;
    512475}
    513476//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.