500 if (
int sockerrno = makeSocket ( port,
true, & sock ) ) {
506 debugPrintf ( (
"CA Repeater: exiting because a repeater is already running\n" ) );
512 sockErrBuf,
sizeof ( sockErrBuf ), sockerrno );
513 fprintf (
stderr,
"%s: Unable to create repeater socket because \"%s\" - fatal\n",
514 __FILE__, sockErrBuf );
520 #ifdef IP_ADD_MEMBERSHIP 545 if(pNode->
addr.
ia.sin_family==AF_INET) {
547 if(top>=224 && top<=239) {
552 memset(&mreq, 0,
sizeof(mreq));
553 mreq.imr_multiaddr = pNode->
addr.
ia.sin_addr;
554 mreq.imr_interface.s_addr = INADDR_ANY;
556 if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
557 (
char *) &mreq,
sizeof(mreq)) != 0) {
562 errlogPrintf(
"caR: Socket mcast join to %s failed: %s\n", name, sockErrBuf );
570 debugPrintf ( (
"CA Repeater: Attached and initialized\n" ) );
575 &from.
sa, &from_size );
588 sockErrBuf,
sizeof ( sockErrBuf ) );
589 fprintf (
stderr,
"CA Repeater: unexpected UDP recv err: %s\n",
600 if ( ( (
size_t) size) >=
sizeof (*pMsg) ) {
602 register_new_client ( from, freeList );
608 size -=
sizeof ( *pMsg );
619 else if ( size == 0 ) {
620 register_new_client ( from, freeList );
624 fanOut ( from, pMsg, size, freeList );
#define SOCK_ECONNREFUSED
LIBCA_API void epicsStdCall removeDuplicateAddresses(struct ELLLIST *pDestList, ELLLIST *pSrcList, int silent)
#define REPEATER_REGISTER
#define assert(exp)
Declare that a condition should be true.
LIBCA_API int epicsStdCall addAddrToChannelAccessAddressList(struct ELLLIST *pList, const ENV_PARAM *pEnv, unsigned short port, int ignoreNonDefaultPort)
#define ELLLIST_INIT
Value of an empty list.
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
#define ellNext(PNODE)
Find the next node in list.
LIBCOM_API const ENV_PARAM EPICS_CA_REPEATER_PORT
LIBCOM_API unsigned short epicsStdCall envGetInetPortConfigParam(const ENV_PARAM *pEnv, unsigned short defaultPort)
Get value of a port number configuration parameter.
LIBCOM_API const ENV_PARAM EPICS_CA_ADDR_LIST
int errlogPrintf(const char *pFormat,...)
LIBCOM_API const ENV_PARAM EPICS_CAS_BEACON_ADDR_LIST
#define debugPrintf(argsInParen)
#define CA_PROTO_RSRV_IS_UP
void epicsSocketConvertErrorToString(char *pBuf, unsigned bufSize, int theSockError)
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
#define ellFirst(PLIST)
Find the first node in list.