137 INTERFACE_INFO *pIfinfo;
138 INTERFACE_INFO *pIfinfoList;
141 DWORD cbBytesReturned;
144 if ( pMatchAddr->
sa.sa_family == AF_INET ) {
147 if ( pNewNode ==
NULL ) {
150 pNewNode->
addr.
ia.sin_family = AF_INET;
151 pNewNode->
addr.
ia.sin_port = htons ( 0 );
160 fprintf(
stderr,
"Need to set EPICS_CA_AUTO_ADDR_LIST=NO for winsock 1\n");
165 pIfinfoList = (INTERFACE_INFO *) calloc(nelem,
sizeof(INTERFACE_INFO));
170 status = WSAIoctl (socket, SIO_GET_INTERFACE_LIST,
172 (LPVOID)pIfinfoList, nelem*
sizeof(INTERFACE_INFO),
175 if (status != 0 || cbBytesReturned == 0) {
176 fprintf(
stderr,
"WSAIoctl SIO_GET_INTERFACE_LIST failed %d\n",WSAGetLastError());
181 numifs = cbBytesReturned/
sizeof(INTERFACE_INFO);
182 for (pIfinfo = pIfinfoList; pIfinfo < (pIfinfoList+numifs); pIfinfo++){
187 if (!(pIfinfo->iiFlags & IFF_UP)) {
191 if (pIfinfo->iiFlags & IFF_LOOPBACK) {
198 if (pIfinfo->iiAddress.Address.sa_family != AF_INET) {
199 if (pIfinfo->iiAddress.Address.sa_family == 0) {
200 pIfinfo->iiAddress.Address.sa_family = AF_INET;
208 if (pMatchAddr->
sa.sa_family != AF_UNSPEC) {
209 if (pIfinfo->iiAddress.Address.sa_family != pMatchAddr->
sa.sa_family) {
212 if (pIfinfo->iiAddress.Address.sa_family != AF_INET) {
215 if (pMatchAddr->
sa.sa_family != AF_INET) {
218 if (pMatchAddr->
ia.sin_addr.s_addr != htonl(INADDR_ANY)) {
219 if (pIfinfo->iiAddress.AddressIn.sin_addr.s_addr != pMatchAddr->
ia.sin_addr.s_addr) {
226 if (pNewNode==
NULL) {
227 errlogPrintf (
"osiSockDiscoverBroadcastAddresses(): no memory available for configuration\n");
231 if (pIfinfo->iiAddress.Address.sa_family == AF_INET &&
232 pIfinfo->iiFlags & IFF_BROADCAST) {
233 const unsigned mask = pIfinfo->iiNetmask.AddressIn.sin_addr.s_addr;
234 const unsigned bcast = pIfinfo->iiBroadcastAddress.AddressIn.sin_addr.s_addr;
235 const unsigned addr = pIfinfo->iiAddress.AddressIn.sin_addr.s_addr;
236 unsigned result = (addr & mask) | (bcast &~mask);
237 pNewNode->
addr.
ia.sin_family = AF_INET;
239 pNewNode->
addr.
ia.sin_port = htons ( 0 );
242 pNewNode->
addr.
sa = pIfinfo->iiBroadcastAddress.Address;
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
LIBCOM_API unsigned epicsStdCall wsaMajorVersion()
int errlogPrintf(const char *pFormat,...)