static int getAddrsFromAdapter(IP_ADAPTER_ADDRESSES *ptr, netaddr **netaddrPP) { LPSOCKADDR sock; int count = 0; netaddr *curr, *start=0, *prev=0; PIP_ADAPTER_UNICAST_ADDRESS uni_addr; PIP_ADAPTER_ANYCAST_ADDRESS any_addr; PIP_ADAPTER_PREFIX prefix; /* If chain passed in, find end */ if (*netaddrPP != NULL) { for (start=*netaddrPP; start->next!=NULL; start=start->next) { } prev=start; } prefix = ptr->FirstPrefix; /* Unicast */ uni_addr = ptr->FirstUnicastAddress; while (uni_addr != NULL) { /* address is only usable if dad state is preferred or deprecated */ if (uni_addr->DadState == IpDadStateDeprecated || uni_addr->DadState == IpDadStatePreferred) { curr = (netaddr *)calloc (1, sizeof (netaddr)); if (curr == 0) { return -1; } if (start == NULL) { start = curr; } if (prev != NULL) { prev->next = curr; } prev = curr; sock = uni_addr->Address.lpSockaddr; SOCKETADDRESS_COPY (&curr->addr, sock); if (prefix != NULL) { curr->mask = (short)prefix->PrefixLength; if (sock->sa_family == AF_INET) { sock = prefix->Address.lpSockaddr; SOCKETADDRESS_COPY(&curr->brdcast, sock); curr->brdcast.him4.sin_addr.s_addr |= htonl((0xffffffff >> curr->mask)); } prefix = prefix->Next; }
static int getAddrsFromAdapter(IP_ADAPTER_ADDRESSES *ptr, netaddr **netaddrPP) { LPSOCKADDR sock; int count = 0; netaddr *curr, *start = NULL, *prev = NULL; PIP_ADAPTER_UNICAST_ADDRESS uni_addr; PIP_ADAPTER_ANYCAST_ADDRESS any_addr; PIP_ADAPTER_PREFIX prefix; /* If chain passed in, find end */ if (*netaddrPP != NULL) { for (start=*netaddrPP; start->next!=NULL; start=start->next) ; prev=start; } prefix = ptr->FirstPrefix; /* Unicast */ uni_addr = ptr->FirstUnicastAddress; while (uni_addr != NULL) { /* address is only usable if dad state is preferred or deprecated */ if (uni_addr->DadState == IpDadStateDeprecated || uni_addr->DadState == IpDadStatePreferred) { sock = uni_addr->Address.lpSockaddr; // IPv4 addresses already retrieved with enumAddresses_win if (sock->sa_family == AF_INET) { uni_addr = uni_addr->Next; continue; } curr = (netaddr *)calloc (1, sizeof (netaddr)); if (curr == NULL) goto freeAllocatedMemory; if (start == NULL) start = curr; if (prev != NULL) prev->next = curr; prev = curr; SOCKETADDRESS_COPY (&curr->addr, sock); if (prefix != NULL) { curr->mask = (short)prefix->PrefixLength; prefix = prefix->Next; } count ++; } uni_addr = uni_addr->Next; } /* Anycast */ any_addr = ptr->FirstAnycastAddress; while (any_addr != NULL) { curr = (netaddr *)calloc (1, sizeof (netaddr)); if (curr == NULL) goto freeAllocatedMemory; if (start == NULL) start = curr; if (prev != NULL) prev->next = curr; prev = curr; sock = any_addr->Address.lpSockaddr; SOCKETADDRESS_COPY (&curr->addr, sock); count ++; any_addr = any_addr->Next; } if (*netaddrPP == NULL) { *netaddrPP = start; } return count; freeAllocatedMemory: if (*netaddrPP != NULL) { //N.B. the variable "start" cannot be NULL at this point because we started with an //existing list. curr=start->next; start->next = NULL; start = curr; } // otherwise, "start" points to the beginning of an incomplete list that we must deallocate. while (start != NULL) { curr = start->next; free(start); start = curr; } return -1; }
static int getAddrsFromAdapter(IP_ADAPTER_ADDRESSES *ptr, netaddr **netaddrPP) { LPSOCKADDR sock; int count = 0; netaddr *curr, *start=0, *prev=0; PIP_ADAPTER_UNICAST_ADDRESS uni_addr; PIP_ADAPTER_ANYCAST_ADDRESS any_addr; PIP_ADAPTER_PREFIX prefix; /* If chain passed in, find end */ if (*netaddrPP != NULL) { for (start=*netaddrPP; start->next!=NULL; start=start->next) { } prev=start; } prefix = ptr->FirstPrefix; /* Unicast */ uni_addr = ptr->FirstUnicastAddress; while (uni_addr != NULL) { /* address is only usable if dad state is preferred or deprecated */ if (uni_addr->DadState == IpDadStateDeprecated || uni_addr->DadState == IpDadStatePreferred) { sock = uni_addr->Address.lpSockaddr; // IPv4 addresses already retrieved with enumAddresses_win if (sock->sa_family == AF_INET) { uni_addr = uni_addr->Next; continue; } curr = (netaddr *)calloc (1, sizeof (netaddr)); if (curr == 0) { return -1; } if (start == NULL) { start = curr; } if (prev != NULL) { prev->next = curr; } prev = curr; SOCKETADDRESS_COPY (&curr->addr, sock); if (prefix != NULL) { curr->mask = (short)prefix->PrefixLength; prefix = prefix->Next; } count ++; } uni_addr = uni_addr->Next; } /* Anycast */ any_addr = ptr->FirstAnycastAddress; while (any_addr != NULL) { curr = (netaddr *)calloc (1, sizeof (netaddr)); if (curr == 0) { return -1; } if (start == NULL) { start = curr; } if (prev != NULL) { prev->next = curr; } prev = curr; sock = any_addr->Address.lpSockaddr; SOCKETADDRESS_COPY (&curr->addr, sock); count ++; any_addr = any_addr->Next; } if (*netaddrPP == NULL) { *netaddrPP = start; } return count; }