21 #define NELEMENTS(A) (sizeof(A)/sizeof(A[0])) 27 static int addrArrayToUL (
const unsigned *pAddr,
28 unsigned nElements,
struct in_addr *pIpAddr )
33 for ( i=0u; i < nElements; i++ ) {
34 if ( pAddr[i] > 0xff ) {
40 pIpAddr->s_addr = htonl ( addr );
50 static int initIPAddr (
struct in_addr ipAddr,
unsigned port,
51 struct sockaddr_in *pIP )
53 if ( port > 0xffff ) {
58 memset (pIP,
'\0',
sizeof(*pIP));
59 pIP->sin_family = AF_INET;
60 pIP->sin_port = htons(port_16);
61 pIP->sin_addr = ipAddr;
77 LIBCOM_API
int epicsStdCall
78 aToIPAddr(
const char *pAddrString,
unsigned short defaultPort,
79 struct sockaddr_in *pIP )
83 unsigned long rawAddr;
95 status = sscanf ( pAddrString,
" %u . %u . %u . %u %7s ",
96 addr, addr+1u, addr+2u, addr+3u, dummy );
98 if ( addrArrayToUL ( addr,
NELEMENTS ( addr ), & ina ) < 0 ) {
102 return initIPAddr ( ina, port, pIP );
108 status = sscanf ( pAddrString,
" %u . %u . %u . %u : %u %7s",
109 addr, addr+1u, addr+2u, addr+3u, &port, dummy );
117 if ( addrArrayToUL ( addr,
NELEMENTS ( addr ), &ina ) < 0 ) {
120 return initIPAddr ( ina, port, pIP );
126 status = sscanf ( pAddrString,
" %lu %7s ", &rawAddr, dummy );
128 if ( rawAddr > 0xffffffff ) {
134 ina.s_addr = htonl ( rawAddr_32 );
135 return initIPAddr ( ina, port, pIP );
142 status = sscanf ( pAddrString,
" %lu : %u %7s ", &rawAddr, &port, dummy );
150 if ( rawAddr > 0xffffffff ) {
155 ina.s_addr = htonl ( rawAddr_32 );
156 return initIPAddr ( ina, port, pIP );
164 status = sscanf ( pAddrString,
" %511[^:] %s ", hostName, dummy );
169 return initIPAddr ( ina, port, pIP );
176 status = sscanf ( pAddrString,
" %511[^:] : %u %s ", hostName,
187 return initIPAddr ( ina, port, pIP );
LIBCOM_API int epicsStdCall aToIPAddr(const char *pAddrString, unsigned short defaultPort, struct sockaddr_in *pIP)
unsigned short epicsUInt16
LIBCOM_API int epicsStdCall hostToIPAddr(const char *pHostName, struct in_addr *pIPA)
epics::pvData::PVStructurePtr dummy