#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; iiAddressCount; i++) { MemFree(pList->Address[i].lpSockaddr); } MemFree(pList); }