40 #include "epicsVersion.h" 48 static void osiLocalAddrOnce (
void *raw )
53 INTERFACE_INFO *pIfinfo;
54 INTERFACE_INFO *pIfinfoList =
NULL;
57 DWORD cbBytesReturned;
59 memset ( (
void *) &addr,
'\0',
sizeof ( addr ) );
60 addr.
sa.sa_family = AF_UNSPEC;
68 pIfinfoList = (INTERFACE_INFO *) calloc ( nelem,
sizeof (INTERFACE_INFO) );
74 status = WSAIoctl (*psocket, SIO_GET_INTERFACE_LIST,
NULL, 0,
75 (LPVOID)pIfinfoList, nelem*
sizeof(INTERFACE_INFO),
78 if (status != 0 || cbBytesReturned == 0) {
79 errlogPrintf (
"WSAIoctl SIO_GET_INTERFACE_LIST failed %d\n",WSAGetLastError());
83 numifs = cbBytesReturned /
sizeof(INTERFACE_INFO);
84 for (pIfinfo = pIfinfoList; pIfinfo < (pIfinfoList+numifs); pIfinfo++){
89 if (!(pIfinfo->iiFlags & IFF_UP)) {
96 if (pIfinfo->iiFlags & IFF_LOOPBACK) {
100 addr.
sa = pIfinfo->iiAddress.Address;
103 if (addr.
sa.sa_family == 0) {
104 addr.
sa.sa_family = AF_INET;
107 osiLocalAddrResult = addr;
108 free ( pIfinfoList );
113 "osiLocalAddr(): only loopback found\n");
116 memset ( (
void *) &addr,
'\0',
sizeof ( addr ) );
117 addr.
ia.sin_family = AF_INET;
119 osiLocalAddrResult = addr;
121 free ( pIfinfoList );
127 return osiLocalAddrResult;
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;
LIBCOM_API void epicsStdCall osiSockDiscoverBroadcastAddresses(ELLLIST *pList, SOCKET socket, const osiSockAddr *pMatchAddr)
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
LIBCOM_API osiSockAddr epicsStdCall osiLocalAddr(SOCKET socket)
#define EPICS_THREAD_ONCE_INIT
LIBCOM_API void epicsStdCall epicsThreadOnce(epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg)
LIBCOM_API unsigned epicsStdCall wsaMajorVersion()
int errlogPrintf(const char *pFormat,...)
C++ and C descriptions for a thread.