diff options
Diffstat (limited to 'addons/ooh323c/src/ooSocket.c')
-rw-r--r-- | addons/ooh323c/src/ooSocket.c | 723 |
1 files changed, 723 insertions, 0 deletions
diff --git a/addons/ooh323c/src/ooSocket.c b/addons/ooh323c/src/ooSocket.c new file mode 100644 index 000000000..181cf6792 --- /dev/null +++ b/addons/ooh323c/src/ooSocket.c @@ -0,0 +1,723 @@ +/* + * Copyright (C) 1997-2005 by Objective Systems, Inc. + * + * This software is furnished under an open source license and may be + * used and copied only in accordance with the terms of this license. + * The text of the license may generally be found in the root + * directory of this installation in the COPYING file. It + * can also be viewed online at the following URL: + * + * http://www.obj-sys.com/open/license.html + * + * Any redistributions of this file including modified versions must + * maintain this copyright notice. + * + *****************************************************************************/ + +#include "ooSocket.h" +#include "ootrace.h" +#if defined(_WIN32_WCE) +static int inited = 0; +#define SEND_FLAGS 0 +#define SHUTDOWN_FLAGS 0 +#elif defined (_WIN32) +static LPFN_SEND send; +static LPFN_SOCKET socket; +static LPFN_SETSOCKOPT setsockopt; +static LPFN_BIND bind; +static LPFN_HTONL htonl; +static LPFN_HTONS htons; +static LPFN_CONNECT connect; +static LPFN_INET_ADDR inet_addr; +static LPFN_LISTEN listen; +static LPFN_ACCEPT accept; +static LPFN_NTOHL ntohl; +static LPFN_NTOHS ntohs; +static LPFN_RECV recv; +static LPFN_SHUTDOWN shutdown; + + +static LPFN_IOCTLSOCKET ioctlsocket; +static LPFN_SENDTO sendto; +static LPFN_INET_NTOA inet_ntoa; +static LPFN_RECVFROM recvfrom; +static LPFN_SELECT select; +static LPFN_GETHOSTNAME gethostname; +static LPFN_GETHOSTBYNAME gethostbyname; +static LPFN_WSAGETLASTERROR WSAGetLastError; +static LPFN_WSACLEANUP WSACleanup; +static LPFN_CLOSESOCKET closesocket; +static LPFN_GETSOCKNAME getsockname; +static HMODULE ws32 = 0; +#define SEND_FLAGS 0 +#define SHUTDOWN_FLAGS SD_BOTH +#else +#define SEND_FLAGS 0 +#define SHUTDOWN_FLAGS SHUT_RDWR +#define closesocket close +#endif + + + +int ooSocketsInit () +{ +#if defined(_WIN32_WCE) + WORD wVersionRequested; + WSADATA wsaData; + int err; + + if (inited) return ASN_OK; + + wVersionRequested = MAKEWORD( 1, 1 ); + + err = WSAStartup (wVersionRequested, &wsaData); + if ( err != 0 ) { + /* Tell the user that we could not find a usable */ + /* WinSock DLL. */ + return ASN_E_NOTINIT; + } + inited = 1; + +#elif defined (_WIN32) + LPFN_WSASTARTUP wsaStartup = NULL; + WSADATA wsaData; + + if (ws32 != 0) return ASN_OK; + +// ws32 = LoadLibrary ("WSOCK32.DLL"); + ws32 = LoadLibrary ("WS2_32.DLL"); + if (ws32 == NULL) return ASN_E_NOTINIT; + + wsaStartup = (LPFN_WSASTARTUP) GetProcAddress (ws32, "WSAStartup"); + if (wsaStartup == NULL) return ASN_E_NOTINIT; + + send = (LPFN_SEND) GetProcAddress (ws32, "send"); + if (send == NULL) return ASN_E_NOTINIT; + + socket = (LPFN_SOCKET) GetProcAddress (ws32, "socket"); + if (socket == NULL) return ASN_E_NOTINIT; + + setsockopt = (LPFN_SETSOCKOPT) GetProcAddress (ws32, "setsockopt"); + if (setsockopt == NULL) return ASN_E_NOTINIT; + + bind = (LPFN_BIND) GetProcAddress (ws32, "bind"); + if (bind == NULL) return ASN_E_NOTINIT; + + htonl = (LPFN_HTONL) GetProcAddress (ws32, "htonl"); + if (htonl == NULL) return ASN_E_NOTINIT; + + htons = (LPFN_HTONS) GetProcAddress (ws32, "htons"); + if (htons == NULL) return ASN_E_NOTINIT; + + connect = (LPFN_CONNECT) GetProcAddress (ws32, "connect"); + if (connect == NULL) return ASN_E_NOTINIT; + + listen = (LPFN_LISTEN) GetProcAddress (ws32, "listen"); + if (listen == NULL) return ASN_E_NOTINIT; + + accept = (LPFN_ACCEPT) GetProcAddress (ws32, "accept"); + if (accept == NULL) return ASN_E_NOTINIT; + + inet_addr = (LPFN_INET_ADDR) GetProcAddress (ws32, "inet_addr"); + if (inet_addr == NULL) return ASN_E_NOTINIT; + + ntohl = (LPFN_NTOHL) GetProcAddress (ws32, "ntohl"); + if (ntohl == NULL) return ASN_E_NOTINIT; + + ntohs = (LPFN_NTOHS) GetProcAddress (ws32, "ntohs"); + if (ntohs == NULL) return ASN_E_NOTINIT; + + recv = (LPFN_RECV) GetProcAddress (ws32, "recv"); + if (recv == NULL) return ASN_E_NOTINIT; + + shutdown = (LPFN_SHUTDOWN) GetProcAddress (ws32, "shutdown"); + if (shutdown == NULL) return ASN_E_NOTINIT; + + closesocket = (LPFN_CLOSESOCKET) GetProcAddress (ws32, "closesocket"); + if (closesocket == NULL) return ASN_E_NOTINIT; + + getsockname = (LPFN_GETSOCKNAME) GetProcAddress (ws32, "getsockname"); + if (getsockname == NULL) return ASN_E_NOTINIT; + + ioctlsocket = (LPFN_IOCTLSOCKET) GetProcAddress(ws32, "ioctlsocket"); + if(ioctlsocket == NULL) return ASN_E_NOTINIT; + + sendto = (LPFN_SENDTO) GetProcAddress (ws32, "sendto"); + if (sendto == NULL) return ASN_E_NOTINIT; + + inet_ntoa = (LPFN_INET_NTOA) GetProcAddress (ws32, "inet_ntoa"); + if (inet_ntoa == NULL) return ASN_E_NOTINIT; + + recvfrom = (LPFN_RECVFROM) GetProcAddress (ws32, "recvfrom"); + if (recvfrom == NULL) return ASN_E_NOTINIT; + + select = (LPFN_SELECT) GetProcAddress (ws32, "select"); + if (select == NULL) return ASN_E_NOTINIT; + + gethostname = (LPFN_GETHOSTNAME) GetProcAddress (ws32, "gethostname"); + if (gethostname == NULL) return ASN_E_NOTINIT; + + gethostbyname = (LPFN_GETHOSTBYNAME) GetProcAddress (ws32, "gethostbyname"); + if (gethostbyname == NULL) return ASN_E_NOTINIT; + + WSAGetLastError = (LPFN_WSAGETLASTERROR) GetProcAddress (ws32, + "WSAGetLastError"); + if (WSAGetLastError == NULL) return ASN_E_NOTINIT; + + WSACleanup = (LPFN_WSACLEANUP) GetProcAddress (ws32, "WSACleanup"); + if (WSACleanup == NULL) return ASN_E_NOTINIT; + + + if (wsaStartup (MAKEWORD(1, 1), &wsaData) == -1) return ASN_E_NOTINIT; +#endif + return ASN_OK; +} + +#if defined (_WIN32) || \ +defined(_HP_UX) || defined(__hpux) || defined(_HPUX_SOURCE) +typedef int OOSOCKLEN; +#else +typedef size_t OOSOCKLEN; +#endif + +int ooSocketCreate (OOSOCKET* psocket) +{ + int on; + + struct linger linger; + OOSOCKET sock = socket (AF_INET, + SOCK_STREAM, + 0); + + if (sock == OOSOCKET_INVALID){ + OOTRACEERR1("Error:Failed to create TCP socket\n"); + return ASN_E_INVSOCKET; + } + + on = 1; + if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, + (const char* ) &on, sizeof (on)) == -1) + { + OOTRACEERR1("Error:Failed to set socket option SO_REUSEADDR\n"); + return ASN_E_INVSOCKET; + } + linger.l_onoff = 1; + linger.l_linger = 0; + if (setsockopt (sock, SOL_SOCKET, SO_LINGER, + (const char* ) &linger, sizeof (linger)) == -1) + { + OOTRACEERR1("Error:Failed to set socket option linger\n"); + return ASN_E_INVSOCKET; + } + *psocket = sock; + return ASN_OK; +} + +int ooSocketCreateUDP (OOSOCKET* psocket) +{ + int on; + struct linger linger; + + OOSOCKET sock = socket (AF_INET, + SOCK_DGRAM, + 0); + + if (sock == OOSOCKET_INVALID){ + OOTRACEERR1("Error:Failed to create UDP socket\n"); + return ASN_E_INVSOCKET; + } + + on = 1; + if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, + (const char* ) &on, sizeof (on)) == -1) + { + OOTRACEERR1("Error:Failed to set socket option SO_REUSEADDR\n"); + return ASN_E_INVSOCKET; + } + linger.l_onoff = 1; + linger.l_linger = 0; + /*if (setsockopt (sock, SOL_SOCKET, SO_LINGER, + (const char* ) &linger, sizeof (linger)) == -1) + return ASN_E_INVSOCKET; + */ + *psocket = sock; + return ASN_OK; +} + +int ooSocketClose (OOSOCKET socket) +{ + shutdown (socket, SHUTDOWN_FLAGS); + if (closesocket (socket) == -1) + return ASN_E_INVSOCKET; + return ASN_OK; +} + +int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port) +{ + struct sockaddr_in m_addr; + + if (socket == OOSOCKET_INVALID) + { + OOTRACEERR1("Error:Invalid socket passed to bind\n"); + return ASN_E_INVSOCKET; + } + + memset (&m_addr, 0, sizeof (m_addr)); + m_addr.sin_family = AF_INET; + m_addr.sin_addr.s_addr = (addr == 0) ? INADDR_ANY : htonl (addr); + m_addr.sin_port = htons ((unsigned short)port); + + if (bind (socket, (struct sockaddr *) (void*) &m_addr, + sizeof (m_addr)) == -1) + { + perror ("bind"); + OOTRACEERR1("Error:Bind failed\n"); + return ASN_E_INVSOCKET; + } + + return ASN_OK; +} + + +int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, int *size) +{ + int ret; + ret = getsockname(socket, (struct sockaddr*)name, size); + if(ret == 0) + return ASN_OK; + else{ + OOTRACEERR1("Error:ooSocketGetSockName - getsockname\n"); + return ASN_E_INVSOCKET; + } +} + +int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port) +{ + int ret=ASN_OK, size; + struct sockaddr_in addr; + char *host=NULL; + + size = sizeof(addr); + + ret = ooSocketGetSockName(socket, &addr, &size); + if(ret != 0) + return ASN_E_INVSOCKET; + + host = inet_ntoa(addr.sin_addr); + + if(host && strlen(host) < (unsigned)len) + strcpy(ip, host); + else{ + OOTRACEERR1("Error:Insufficient buffer for ip address - " + "ooSocketGetIpAndPort\n"); + return -1; + } + + *port = addr.sin_port; + + return ASN_OK; +} + +int ooSocketListen (OOSOCKET socket, int maxConnection) +{ + if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET; + + if (listen (socket, maxConnection) == -1) + return ASN_E_INVSOCKET; + + return ASN_OK; +} + +int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket, + OOIPADDR* destAddr, int* destPort) +{ + struct sockaddr_in m_addr; + OOSOCKLEN addr_length = sizeof (m_addr); + + if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET; + if (pNewSocket == 0) return ASN_E_INVPARAM; + + *pNewSocket = accept (socket, (struct sockaddr *) (void*) &m_addr, + (socklen_t *) &addr_length); + if (*pNewSocket <= 0) return ASN_E_INVSOCKET; + + if (destAddr != 0) + *destAddr = ntohl (m_addr.sin_addr.s_addr); + if (destPort != 0) + *destPort = ntohs (m_addr.sin_port); + + return ASN_OK; +} + +int ooSocketConnect (OOSOCKET socket, const char* host, int port) +{ + struct sockaddr_in m_addr; + + if (socket == OOSOCKET_INVALID) + { + return ASN_E_INVSOCKET; + } + + memset (&m_addr, 0, sizeof (m_addr)); + + m_addr.sin_family = AF_INET; + m_addr.sin_port = htons ((unsigned short)port); + m_addr.sin_addr.s_addr = inet_addr (host); + + if (connect (socket, (struct sockaddr *) (void*) &m_addr, + sizeof (struct sockaddr_in)) == -1) + { + return ASN_E_INVSOCKET; + } + return ASN_OK; +} +/* +// **Need to add check whether complete data was sent by checking the return +// **value of send and if complete data is not sent then add mechanism to +// **send remaining bytes. This will make ooSocketSend call atomic. +*/ +int ooSocketSend (OOSOCKET socket, const ASN1OCTET* pdata, ASN1UINT size) +{ + if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET; + + if (send (socket, (const char*) pdata, size, SEND_FLAGS) == -1) + return ASN_E_INVSOCKET; + return ASN_OK; +} + +int ooSocketSendTo(OOSOCKET socket, const ASN1OCTET* pdata, ASN1UINT size, + const char* host, int port) +{ + struct sockaddr_in m_addr; + if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET; + + memset (&m_addr, 0, sizeof (m_addr)); + + m_addr.sin_family = AF_INET; + m_addr.sin_port = htons ((unsigned short)port); + m_addr.sin_addr.s_addr = inet_addr (host); + if (sendto (socket, (const char*) pdata, size, SEND_FLAGS, + (const struct sockaddr*)&m_addr, + sizeof(m_addr)) == -1) + return ASN_E_INVSOCKET; + return ASN_OK; +} + +int ooSocketRecvPeek(OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize) +{ + int len; + int flags = MSG_PEEK; + + if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET; + + if ((len = recv (socket, (char*) pbuf, bufsize, flags)) == -1) + return ASN_E_INVSOCKET; + return len; +} + +int ooSocketRecv (OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize) +{ + int len; + if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET; + + if ((len = recv (socket, (char*) pbuf, bufsize, 0)) == -1) + return ASN_E_INVSOCKET; + return len; +} + +int ooSocketRecvFrom (OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize, + char* remotehost, ASN1UINT hostBufLen, int * remoteport) +{ + struct sockaddr_in m_addr; + int len, addrlen; + 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) + return ASN_E_INVSOCKET; + + if(remoteport) + *remoteport = ntohs(m_addr.sin_port); + if(remotehost) + { + host = inet_ntoa(m_addr.sin_addr); + if(strlen(host) < (hostBufLen-1)) + strcpy(remotehost, host); + else + return -1; + } + return len; +} + +int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds, + fd_set *exceptfds, struct timeval * timeout) +{ + int ret; +#if defined (_WIN32) + ret = select(nfds, readfds, writefds, exceptfds, + (const struct timeval *) timeout); +#else + ret = select(nfds, readfds, writefds, exceptfds, timeout); +#endif + return ret; +} + +int ooGetLocalIPAddress(char * pIPAddrs) +{ + int ret; + struct hostent *phost; + struct in_addr addr; + char hostname[100]; + + if(pIPAddrs == NULL) + return -1; /* Need to find suitable return value */ + ret = gethostname(hostname, 100); + if(ret == 0) + { + phost = gethostbyname(hostname); + if(phost == 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)); + + } + else{ + return -1; + } + return ASN_OK; +} + +int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr) +{ + int b1, b2, b3, b4; + int rv = sscanf (pIPAddrStr, "%d.%d.%d.%d", &b1, &b2, &b3, &b4); + if (rv != 4 || + (b1 < 0 || b1 > 256) || (b2 < 0 || b2 > 256) || + (b3 < 0 || b3 > 256) || (b4 < 0 || b4 > 256)) + return ASN_E_INVPARAM; + *pIPAddr = ((b1 & 0xFF) << 24) | ((b2 & 0xFF) << 16) | + ((b3 & 0xFF) << 8) | (b4 & 0xFF); + return ASN_OK; +} + +int ooSocketConvertIpToNwAddr(char *inetIp, char *netIp) +{ + + struct sockaddr_in sin = {0}; +#ifdef _WIN32 + sin.sin_addr.s_addr = inet_addr(inetIp); + if(sin.sin_addr.s_addr == INADDR_NONE) + { + OOTRACEERR1("Error:Failed to convert address\n"); + return -1; + } +#else + if(!inet_aton(inetIp, &sin.sin_addr)) + { + OOTRACEERR1("Error:Failed to convert address\n"); + return -1; + } + +#endif + + memcpy(netIp, (char*)&sin.sin_addr.s_addr, sizeof(unsigned long)); + return ASN_OK; +} + +int ooSocketAddrToStr (OOIPADDR ipAddr, char* pbuf, int bufsize) +{ + char buf1[5], buf2[5], buf3[5], buf4[5]; + int cnt = 0; + + if (bufsize < 8) + return ASN_E_BUFOVFLW; + + cnt += sprintf (buf1, "%lu", (ipAddr >> 24) & 0xFF); + cnt += sprintf (buf2, "%lu", (ipAddr >> 16) & 0xFF); + cnt += sprintf (buf3, "%lu", (ipAddr >> 8) & 0xFF); + cnt += sprintf (buf4, "%lu", ipAddr & 0xFF); + if (bufsize < cnt + 4) + return ASN_E_BUFOVFLW; + sprintf (pbuf, "%s.%s.%s.%s", buf1, buf2, buf3, buf4); + return ASN_OK; +} + +int ooSocketsCleanup (void) +{ +#ifdef _WIN32 + int ret = WSACleanup(); + if(ret == 0) + return ASN_OK; + else + return ret; +#endif + return ASN_OK; +} + +long ooSocketHTONL(long val) +{ + return htonl(val); +} + +short ooSocketHTONS(short val) +{ + return htons(val); +} + +#ifndef _WIN32 +int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList) +{ + OOSOCKET sock; + struct ifconf ifc; + int ifNum; + OOInterface *pIf=NULL; + + OOTRACEDBGA1("Retrieving local interfaces\n"); + if(ooSocketCreateUDP(&sock)!= ASN_OK) + { + OOTRACEERR1("Error:Failed to create udp socket - " + "ooSocketGetInterfaceList\n"); + return -1; + } +#ifdef SIOCGIFNUM + if(ioctl(sock, SIOCGIFNUM, &ifNum) >= 0) + { + OOTRACEERR1("Error: ioctl for ifNum failed\n"); + return -1; + } +#else + ifNum = 50; +#endif + + ifc.ifc_len = ifNum * sizeof(struct ifreq); + ifc.ifc_req = (struct ifreq *)memAlloc(pctxt, ifNum *sizeof(struct ifreq)); + if(!ifc.ifc_req) + { + OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - ifc.ifc_req\n"); + return -1; + } + + if (ioctl(sock, SIOCGIFCONF, &ifc) >= 0) { + void * ifEndList = (char *)ifc.ifc_req + ifc.ifc_len; + struct ifreq *ifName; + struct ifreq ifReq; + int flags; + for (ifName = ifc.ifc_req; (void*)ifName < ifEndList; ifName++) { + char *pName=NULL; + char addr[50]; +#ifdef ifr_netmask + char mask[50]; +#endif + + pIf = (struct OOInterface*)memAlloc(pctxt, sizeof(struct OOInterface)); + pName = (char*)memAlloc(pctxt, strlen(ifName->ifr_name)+1); + if(!pIf) + { + OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - " + "pIf/pName\n"); + return -1; + } + OOTRACEDBGA2("\tInterface name: %s\n", ifName->ifr_name); + + + strcpy(ifReq.ifr_name, ifName->ifr_name); + strcpy(pName, ifName->ifr_name); + pIf->name = pName; + + /* Check whether the interface is up*/ + if (ioctl(sock, SIOCGIFFLAGS, &ifReq) < 0) { + OOTRACEERR2("Error:Unable to determine status of interface %s\n", + pName); + memFreePtr(pctxt, pIf->name); + memFreePtr(pctxt, pIf); + continue; + } + flags = ifReq.ifr_flags; + if (!(flags & IFF_UP)) { + OOTRACEWARN2("Warn:Interface %s is not up\n", pName); + memFreePtr(pctxt, pIf->name); + memFreePtr(pctxt, pIf); + continue; + } + + /* Retrieve interface address */ + if (ioctl(sock, SIOCGIFADDR, &ifReq) < 0) + { + OOTRACEWARN2("Warn:Unable to determine address of interface %s\n", + pName); + memFreePtr(pctxt, pIf->name); + memFreePtr(pctxt, pIf); + continue; + } + strcpy(addr, 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) + { + OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - " + "pIf->addr\n"); + memFreePtr(pctxt, pIf->name); + memFreePtr(pctxt, pIf); + return -1; + } + strcpy(pIf->addr, addr); + +#ifdef ifr_netmask + if (ioctl(sock, SIOCGIFNETMASK, &ifReq) < 0) + { + OOTRACEWARN2("Warn:Unable to determine mask for interface %s\n", + pName); + memFreePtr(pctxt, pIf->name); + memFreePtr(pctxt, pIf->addr); + memFreePtr(pctxt, pIf); + continue; + } + strcpy(mask, 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) + { + OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - " + "pIf->mask\n"); + memFreePtr(pctxt, pIf->name); + memFreePtr(pctxt, pIf->addr); + memFreePtr(pctxt, pIf); + return -1; + } + strcpy(pIf->mask, mask); +#endif + pIf->next = NULL; + + /* Add to the list */ + if(!*ifList) + { + *ifList = pIf; + pIf = NULL; + } + else{ + pIf->next = *ifList; + *ifList = pIf; + pIf=NULL; + } +/* +#if defined(OO_FREEBSD) || defined(OO_OPENBSD) || defined(OO_NETBSD) || defined(OO_MACOSX) || defined(OO_VXWORKS) || defined(OO_RTEMS) || defined(OO_QNX) +#ifndef _SIZEOF_ADDR_IFREQ +#define _SIZEOF_ADDR_IFREQ(ifr) \ + ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \ + (sizeof(struct ifreq) - sizeof(struct sockaddr) + \ + (ifr).ifr_addr.sa_len) : sizeof(struct ifreq)) +#endif + ifName = (struct ifreq *)((char *)ifName + _SIZEOF_ADDR_IFREQ(*ifName)); +#else + ifName++; +*/ + } + + } + return ASN_OK; +} +#endif |