aboutsummaryrefslogtreecommitdiffstats
path: root/addons/ooh323c/src/ooSocket.c
diff options
context:
space:
mode:
Diffstat (limited to 'addons/ooh323c/src/ooSocket.c')
-rw-r--r--addons/ooh323c/src/ooSocket.c81
1 files changed, 57 insertions, 24 deletions
diff --git a/addons/ooh323c/src/ooSocket.c b/addons/ooh323c/src/ooSocket.c
index 181cf6792..590536550 100644
--- a/addons/ooh323c/src/ooSocket.c
+++ b/addons/ooh323c/src/ooSocket.c
@@ -13,6 +13,9 @@
* maintain this copyright notice.
*
*****************************************************************************/
+#include <asterisk.h>
+#include <asterisk/lock.h>
+#include <asterisk/network.h>
#include "ooSocket.h"
#include "ootrace.h"
@@ -177,7 +180,7 @@ int ooSocketsInit ()
defined(_HP_UX) || defined(__hpux) || defined(_HPUX_SOURCE)
typedef int OOSOCKLEN;
#else
-typedef size_t OOSOCKLEN;
+typedef socklen_t OOSOCKLEN;
#endif
int ooSocketCreate (OOSOCKET* psocket)
@@ -270,8 +273,10 @@ int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port)
if (bind (socket, (struct sockaddr *) (void*) &m_addr,
sizeof (m_addr)) == -1)
{
- perror ("bind");
- OOTRACEERR1("Error:Bind failed\n");
+ if (errno != EADDRINUSE) {
+ perror ("bind");
+ OOTRACEERR2("Error:Bind failed, error: %d\n", errno);
+ }
return ASN_E_INVSOCKET;
}
@@ -279,7 +284,7 @@ int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port)
}
-int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, int *size)
+int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, socklen_t *size)
{
int ret;
ret = getsockname(socket, (struct sockaddr*)name, size);
@@ -293,9 +298,10 @@ int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, int *size)
int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port)
{
- int ret=ASN_OK, size;
+ int ret=ASN_OK;
+ socklen_t size;
struct sockaddr_in addr;
- char *host=NULL;
+ const char *host=NULL;
size = sizeof(addr);
@@ -303,7 +309,7 @@ int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port)
if(ret != 0)
return ASN_E_INVSOCKET;
- host = inet_ntoa(addr.sin_addr);
+ host = ast_inet_ntoa(addr.sin_addr);
if(host && strlen(host) < (unsigned)len)
strcpy(ip, host);
@@ -338,7 +344,7 @@ int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket,
if (pNewSocket == 0) return ASN_E_INVPARAM;
*pNewSocket = accept (socket, (struct sockaddr *) (void*) &m_addr,
- (socklen_t *) &addr_length);
+ &addr_length);
if (*pNewSocket <= 0) return ASN_E_INVSOCKET;
if (destAddr != 0)
@@ -430,21 +436,21 @@ int ooSocketRecvFrom (OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize,
{
struct sockaddr_in m_addr;
int len, addrlen;
- char * host=NULL;
+ const char * host=NULL;
if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;
addrlen = sizeof(m_addr);
memset (&m_addr, 0, sizeof (m_addr));
if ((len = recvfrom (socket, (char*) pbuf, bufsize, 0,
- (struct sockaddr*)&m_addr, &addrlen)) == -1)
+ (struct sockaddr*)&m_addr, (socklen_t *) &addrlen)) == -1)
return ASN_E_INVSOCKET;
if(remoteport)
*remoteport = ntohs(m_addr.sin_port);
if(remotehost)
{
- host = inet_ntoa(m_addr.sin_addr);
+ host = ast_inet_ntoa(m_addr.sin_addr);
if(strlen(host) < (hostBufLen-1))
strcpy(remotehost, host);
else
@@ -466,24 +472,54 @@ int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds,
return ret;
}
+int ooSocketPoll(struct pollfd *pfds, int nfds, int timeout)
+{
+ return poll(pfds, nfds, timeout);
+}
+
+int ooPDRead(struct pollfd *pfds, int nfds, int fd)
+{
+ int i;
+ for (i=0;i<nfds;i++)
+ if (pfds[i].fd == fd && (pfds[i].revents & POLLIN))
+ return 1;
+ return 0;
+}
+
+int ooPDWrite(struct pollfd *pfds, int nfds, int fd)
+{
+ int i;
+ for (i=0;i<nfds;i++)
+ if (pfds[i].fd == fd && (pfds[i].revents & POLLOUT))
+ return 1;
+ return 0;
+}
+
int ooGetLocalIPAddress(char * pIPAddrs)
{
int ret;
- struct hostent *phost;
+ struct hostent phost;
+ struct hostent* reshost;
+ int h_errnop;
struct in_addr addr;
char hostname[100];
+ char buf[2048];
if(pIPAddrs == NULL)
return -1; /* Need to find suitable return value */
ret = gethostname(hostname, 100);
if(ret == 0)
{
- phost = gethostbyname(hostname);
- if(phost == NULL)
+ if (!gethostbyname_r(hostname,
+ &phost, buf, sizeof(buf),
+ &reshost, &h_errnop)) {
+ if(reshost == NULL)
return -1; /* Need to define a return value if made part of rtsrc */
- memcpy(&addr, phost->h_addr_list[0], sizeof(struct in_addr));
- strcpy(pIPAddrs, inet_ntoa(addr));
-
+ memcpy(&addr, &phost.h_addr_list[0], sizeof(struct in_addr));
+ strcpy(pIPAddrs, (ast_inet_ntoa(addr) == NULL) ? "127.0.0.1" : ast_inet_ntoa(addr));
+ } else {
+ return -1;
+ }
}
else{
return -1;
@@ -504,7 +540,7 @@ int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr)
return ASN_OK;
}
-int ooSocketConvertIpToNwAddr(char *inetIp, char *netIp)
+int ooSocketConvertIpToNwAddr(char *inetIp, unsigned char *netIp)
{
struct sockaddr_in sin = {0};
@@ -608,10 +644,7 @@ int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList)
int flags;
for (ifName = ifc.ifc_req; (void*)ifName < ifEndList; ifName++) {
char *pName=NULL;
- char addr[50];
-#ifdef ifr_netmask
- char mask[50];
-#endif
+ char addr[50], mask[50];
pIf = (struct OOInterface*)memAlloc(pctxt, sizeof(struct OOInterface));
pName = (char*)memAlloc(pctxt, strlen(ifName->ifr_name)+1);
@@ -653,7 +686,7 @@ int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList)
memFreePtr(pctxt, pIf);
continue;
}
- strcpy(addr, inet_ntoa(((struct sockaddr_in*)&ifReq.ifr_addr)->sin_addr));
+ strcpy(addr, ast_inet_ntoa(((struct sockaddr_in*)&ifReq.ifr_addr)->sin_addr));
OOTRACEDBGA2("\tIP address is %s\n", addr);
pIf->addr = (char*)memAlloc(pctxt, strlen(addr)+1);
if(!pIf->addr)
@@ -676,7 +709,7 @@ int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList)
memFreePtr(pctxt, pIf);
continue;
}
- strcpy(mask, inet_ntoa(((struct sockaddr_in *)&ifReq.ifr_netmask)->sin_addr));
+ strcpy(mask, ast_inet_ntoa(((struct sockaddr_in *)&ifReq.ifr_netmask)->sin_addr));
OOTRACEDBGA2("\tMask is %s\n", mask);
pIf->mask = (char*)memAlloc(pctxt, strlen(mask)+1);
if(!pIf->mask)