120 lines
2.7 KiB
C
120 lines
2.7 KiB
C
|
#include "dpsp.h"
|
||
|
|
||
|
#undef DPF_MODNAME
|
||
|
#define DPF_MODNAME "GetHostAddr"
|
||
|
|
||
|
#define DUMMYPORTNAME "1" // value unused but must be non-zero
|
||
|
|
||
|
void
|
||
|
AddAddress(IPV6_INFO_INTERFACE *IF, IPV6_INFO_ADDRESS *ADE, void *Context)
|
||
|
{
|
||
|
int i;
|
||
|
LPSOCKADDR_IN6 ps;
|
||
|
SOCKET_ADDRESS_LIST *pList = (SOCKET_ADDRESS_LIST *)Context;
|
||
|
ULONG ulSize = sizeof(SOCKADDR_IN6);
|
||
|
|
||
|
// Skip it if it's not a unicast address
|
||
|
if (IN6_IS_ADDR_MULTICAST(&ADE->This.Address))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ps = MemAlloc(ulSize);
|
||
|
if (ps == NULL)
|
||
|
{
|
||
|
// Memory allocation failed
|
||
|
DEBUGPRINTADDR(0,"Could not add address : \n",ps);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
i = pList->iAddressCount++;
|
||
|
|
||
|
ZeroMemory(ps, ulSize);
|
||
|
ps->sin6_family = AF_INET6;
|
||
|
ps->sin6_addr = ADE->This.Address;
|
||
|
ps->sin6_scope_id = IF->ZoneIndices[ADE->Scope];
|
||
|
|
||
|
pList->Address[i].iSockaddrLength = ulSize;
|
||
|
pList->Address[i].lpSockaddr = (LPSOCKADDR)ps;
|
||
|
|
||
|
DEBUGPRINTADDR(0,"Added address : \n",ps);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
AddInterfaceAddresses(IPV6_INFO_INTERFACE *IF, void *Context1, void *Context2, void *Context3)
|
||
|
{
|
||
|
// Skip the loopback interface
|
||
|
if (IF->This.Index == 1)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
DPF(0,"Processing interface %d",IF->This.Index);
|
||
|
ForEachAddress(IF, AddAddress, Context1);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CountAddress(IPV6_INFO_INTERFACE *IF, IPV6_INFO_ADDRESS *ADE, void *Context)
|
||
|
{
|
||
|
ULONG *pulNumAddresses = (ULONG *)Context;
|
||
|
|
||
|
// Skip it if it's not a unicast address
|
||
|
if (IN6_IS_ADDR_MULTICAST(&ADE->This.Address))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
(*pulNumAddresses)++;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CountInterfaceAddresses(IPV6_INFO_INTERFACE *IF, void *Context1, void *Context2, void *Context3)
|
||
|
{
|
||
|
// Skip the loopback interface
|
||
|
if (IF->This.Index == 1)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ForEachAddress(IF, CountAddress, Context1);
|
||
|
}
|
||
|
|
||
|
// Helper function to retrieve host IP Address(es).
|
||
|
// Caller must call FreeHostAddr on list returned
|
||
|
SOCKET_ADDRESS_LIST *GetHostAddr(void)
|
||
|
{
|
||
|
UINT err;
|
||
|
ULONG ulNumAddresses = 0;
|
||
|
SOCKET_ADDRESS_LIST *pList;
|
||
|
|
||
|
ForEachInterface(CountInterfaceAddresses, &ulNumAddresses, NULL, NULL);
|
||
|
if (ulNumAddresses == 0)
|
||
|
{
|
||
|
DPF(0,"could not get addresses for local machine\n");
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
pList = MemAlloc( FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[ulNumAddresses] ));
|
||
|
if (pList == NULL)
|
||
|
{
|
||
|
DPF(0,"could not get addresses for local machine - err = %d\n", GetLastError());
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
pList->iAddressCount = 0;
|
||
|
ForEachInterface(AddInterfaceAddresses, pList, NULL, NULL);
|
||
|
|
||
|
return pList;
|
||
|
} // GetHostAddr
|
||
|
|
||
|
void
|
||
|
FreeHostAddr(SOCKET_ADDRESS_LIST *pList)
|
||
|
{
|
||
|
int i;
|
||
|
for (i=0; i<pList->iAddressCount; i++)
|
||
|
{
|
||
|
MemFree(pList->Address[i].lpSockaddr);
|
||
|
}
|
||
|
MemFree(pList);
|
||
|
}
|