From ecdd53438e814906d8d2429f3c71458cd5128656 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Tue, 5 Aug 1997 00:37:50 +0000 Subject: [PATCH] installed --- src/libCom/aToIPAddr.c | 106 ++++++++++++++++++++++++++++++++++++ src/libCom/misc/aToIPAddr.c | 106 ++++++++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 src/libCom/aToIPAddr.c create mode 100644 src/libCom/misc/aToIPAddr.c diff --git a/src/libCom/aToIPAddr.c b/src/libCom/aToIPAddr.c new file mode 100644 index 000000000..55cad0126 --- /dev/null +++ b/src/libCom/aToIPAddr.c @@ -0,0 +1,106 @@ +/* + * rational replacement for inet_addr() + * + * author: Jeff Hill + */ +#include +#include +#include + +#include "osiSock.h" +#define epicsExportSharedSymbols +#include "ipAddrToA.h" + +#ifndef NELEMENTS +#define NELEMENTS(A) (sizeof(A)/sizeof(A[0])) +#endif /*NELEMENTS*/ + +static int addrArrayToUL (const long *pAddr, unsigned nElements, unsigned long *pIpAddr); +static int initIPAddr (unsigned long ipAddr, unsigned short port, struct sockaddr_in *pIP); + +/* + * rational replacement for inet_addr() + * which allows the limited broadcast address + * 255.255.255.255 and also allows the user + * to specify a port number + * + * Sets the port number to "defaultPort" only if + * "pAddrString" does not contain an addres of the form + * "n.n.n.n:p" + */ +epicsShareFunc int epicsShareAPI + aToIPAddr(const char *pAddrString, unsigned short defaultPort, struct sockaddr_in *pIP) +{ + int status; + long addr[4]; + int port; + + unsigned long ipAddr; + + status = sscanf (pAddrString, "%li.%li.%li.%li:%i", + addr, addr+1u, addr+2u, addr+3u, &port); + if (status==5) { + status = addrArrayToUL (addr, NELEMENTS(addr), &ipAddr); + if (status<0) { + return -1; + } + if (port<0 || port>USHRT_MAX) { + return -1; + } + return initIPAddr (ipAddr, (unsigned short) port, pIP); + } + + status = sscanf (pAddrString, "%li.%li.%li.%li", + addr, addr+1u, addr+2u, addr+3u); + if (status==4) { + status = addrArrayToUL (addr, NELEMENTS(addr), &ipAddr); + if (status<0) { + return -1; + } + return initIPAddr (ipAddr, defaultPort, pIP); + } + + status = sscanf (pAddrString, "%li", addr); + if (status==1) { + if (*addr<0x0 && *addr>0xffffffff) { + return -1; + } + return initIPAddr ((unsigned long)*addr, defaultPort, pIP); + } + + return -1; +} + +/* + * initIPAddr() + */ +static int initIPAddr (unsigned long ipAddr, unsigned short port, struct sockaddr_in *pIP) +{ + if (port<=IPPORT_USERRESERVED) { + return -1; + } + + memset (pIP, '\0', sizeof(*pIP)); + pIP->sin_family = AF_INET; + pIP->sin_port = htons(port); + pIP->sin_addr.s_addr = htonl(ipAddr); + return 0; +} + +/* + * addrArrayToUL() + */ +static int addrArrayToUL (const long *pAddr, unsigned nElements, unsigned long *pIpAddr) +{ + unsigned i; + + for (i=0u; i0xff) { + return -1; + } + } + *pIpAddr = (unsigned long) + (pAddr[3u] | (pAddr[2u]<<8u) | + (pAddr[1u]<<16u) | (pAddr[0u]<<24u)); + return 0; +} diff --git a/src/libCom/misc/aToIPAddr.c b/src/libCom/misc/aToIPAddr.c new file mode 100644 index 000000000..55cad0126 --- /dev/null +++ b/src/libCom/misc/aToIPAddr.c @@ -0,0 +1,106 @@ +/* + * rational replacement for inet_addr() + * + * author: Jeff Hill + */ +#include +#include +#include + +#include "osiSock.h" +#define epicsExportSharedSymbols +#include "ipAddrToA.h" + +#ifndef NELEMENTS +#define NELEMENTS(A) (sizeof(A)/sizeof(A[0])) +#endif /*NELEMENTS*/ + +static int addrArrayToUL (const long *pAddr, unsigned nElements, unsigned long *pIpAddr); +static int initIPAddr (unsigned long ipAddr, unsigned short port, struct sockaddr_in *pIP); + +/* + * rational replacement for inet_addr() + * which allows the limited broadcast address + * 255.255.255.255 and also allows the user + * to specify a port number + * + * Sets the port number to "defaultPort" only if + * "pAddrString" does not contain an addres of the form + * "n.n.n.n:p" + */ +epicsShareFunc int epicsShareAPI + aToIPAddr(const char *pAddrString, unsigned short defaultPort, struct sockaddr_in *pIP) +{ + int status; + long addr[4]; + int port; + + unsigned long ipAddr; + + status = sscanf (pAddrString, "%li.%li.%li.%li:%i", + addr, addr+1u, addr+2u, addr+3u, &port); + if (status==5) { + status = addrArrayToUL (addr, NELEMENTS(addr), &ipAddr); + if (status<0) { + return -1; + } + if (port<0 || port>USHRT_MAX) { + return -1; + } + return initIPAddr (ipAddr, (unsigned short) port, pIP); + } + + status = sscanf (pAddrString, "%li.%li.%li.%li", + addr, addr+1u, addr+2u, addr+3u); + if (status==4) { + status = addrArrayToUL (addr, NELEMENTS(addr), &ipAddr); + if (status<0) { + return -1; + } + return initIPAddr (ipAddr, defaultPort, pIP); + } + + status = sscanf (pAddrString, "%li", addr); + if (status==1) { + if (*addr<0x0 && *addr>0xffffffff) { + return -1; + } + return initIPAddr ((unsigned long)*addr, defaultPort, pIP); + } + + return -1; +} + +/* + * initIPAddr() + */ +static int initIPAddr (unsigned long ipAddr, unsigned short port, struct sockaddr_in *pIP) +{ + if (port<=IPPORT_USERRESERVED) { + return -1; + } + + memset (pIP, '\0', sizeof(*pIP)); + pIP->sin_family = AF_INET; + pIP->sin_port = htons(port); + pIP->sin_addr.s_addr = htonl(ipAddr); + return 0; +} + +/* + * addrArrayToUL() + */ +static int addrArrayToUL (const long *pAddr, unsigned nElements, unsigned long *pIpAddr) +{ + unsigned i; + + for (i=0u; i0xff) { + return -1; + } + } + *pIpAddr = (unsigned long) + (pAddr[3u] | (pAddr[2u]<<8u) | + (pAddr[1u]<<16u) | (pAddr[0u]<<24u)); + return 0; +}