summaryrefslogtreecommitdiff
path: root/sal/osl/os2/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'sal/osl/os2/socket.c')
-rw-r--r--sal/osl/os2/socket.c2851
1 files changed, 0 insertions, 2851 deletions
diff --git a/sal/osl/os2/socket.c b/sal/osl/os2/socket.c
deleted file mode 100644
index cfe015ceee41..000000000000
--- a/sal/osl/os2/socket.c
+++ /dev/null
@@ -1,2851 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include "system.h"
-
-#include <osl/socket.h>
-#include <osl/diagnose.h>
-#include <osl/mutex.h>
-#include <osl/signal.h>
-
-#include <rtl/alloc.h>
-
-#include <ctype.h>
-#include <sal/types.h>
-
-#include "sockimpl.h"
-
-
-/* defines for poll */
-#ifdef HAVE_POLL_H
-#undef HAVE_POLL_H
-#endif
-
-#if defined(LINUX) || defined(NETBSD) || defined ( FREEBSD ) || defined (MACOSX)
-#include <sys/poll.h>
-#define HAVE_POLL_H
-#endif /* HAVE_POLL_H */
-
-#if defined(SOLARIS)
-#include <poll.h>
-#define HAVE_POLL_H
-#endif /* SOLARIS */
-
-#ifndef HAVE_POLL_H
-#define POLLIN 0x0001
-#define POLLOUT 0x0002
-#define POLLPRI 0x0004
-#endif /* HAVE_POLL_H */
-
-
-/* defines for shutdown */
-#define SD_RECEIVE 0
-#define SD_SEND 1
-#define SD_BOTH 2
-
-
-/*
- oslSocketAddr is a pointer to a Berkeley struct sockaddr.
- I refrained from using sockaddr_in because of possible further
- extensions of this socket-interface (IP-NG?).
- The intention was to hide all Berkeley data-structures from
- direct access past the osl-interface.
-
- The current implementation is internet (IP) centered. All
- the constructor-functions (osl_create...) take parameters
- that will probably make sense only in the IP-environment
- (e.g. because of using the dotted-address-format).
-
- If the interface will be extended to host other protocol-
- families, I expect no externally visible changes in the
- existing functions. You'll probably need only new
- constructor-functions who take the different address
- formats into consideration (maybe a long dotted address
- or whatever).
-*/
-
-/* _Note_ that I rely on the fact that oslSocketAddr and struct sockaddr */
-/* are the same! I don't like it very much but see no other easy way to */
-/* conceal the struct sockaddr from the eyes of the user. */
-
-
-#define OSL_INVALID_SOCKET -1
-#define OSL_SOCKET_ERROR -1
-
-
-/* Buffer size for gethostbyname */
-#define MAX_HOSTBUFFER_SIZE 2048
-
-/*****************************************************************************/
-/* enum oslAddrFamily */
-/*****************************************************************************/
-
-/* map */
-static unsigned long FamilyMap[]= {
- AF_INET, /* osl_Socket_FamilyInet */
- AF_IPX, /* osl_Socket_FamilyIpx */
- 0 /* osl_Socket_FamilyInvalid */
-};
-
-/* reverse map */
-static oslAddrFamily osl_AddrFamilyFromNative(sal_uInt32 nativeType)
-{
- oslAddrFamily i= (oslAddrFamily)0;
-
- while(i != osl_Socket_FamilyInvalid)
- {
- if(FamilyMap[i] == nativeType)
- return i;
- i = (oslAddrFamily) ( i + 1 );
- }
-
- return i;
-}
-
-/* macros */
-#define FAMILY_FROM_NATIVE(y) osl_AddrFamilyFromNative(y)
-#define FAMILY_TO_NATIVE(x) (short)FamilyMap[x]
-
-/*****************************************************************************/
-/* enum oslProtocol */
-/*****************************************************************************/
-
-/* map */
-static sal_uInt32 ProtocolMap[]= {
- 0, /* osl_Socket_ProtocolIp */
- NSPROTO_IPX, /* osl_Socket_ProtocolIpx */
- NSPROTO_SPX, /* osl_Socket_ProtocolSpx */
- NSPROTO_SPXII, /* osl_Socket_ProtocolSpxII */
- 0 /* osl_Socket_ProtocolInvalid */
-};
-
-/* reverse map */
-/* mfe: NOT USED
-static oslProtocol osl_ProtocolFromNative(sal_uInt32 nativeType)
-{
- oslProtocol i= (oslProtocol)0;
-
- while(i != osl_Socket_ProtocolInvalid)
- {
- if(ProtocolMap[i] == nativeType)
- return i;
- i = (oslProtocol) ( i + 1);
- }
-
- return i;
-}
-*/
-
-/* macros */
-#define PROTOCOL_FROM_NATIVE(y) osl_ProtocolFromNative(y)
-#define PROTOCOL_TO_NATIVE(x) ProtocolMap[x]
-
-
-/*****************************************************************************/
-/* enum oslSocketType */
-/*****************************************************************************/
-
-/* map */
-static sal_uInt32 TypeMap[]= {
- SOCK_STREAM, /* osl_Socket_TypeStream */
- SOCK_DGRAM, /* osl_Socket_TypeDgram */
- SOCK_RAW, /* osl_Socket_TypeRaw */
- SOCK_RDM, /* osl_Socket_TypeRdm */
- SOCK_SEQPACKET, /* osl_Socket_TypeSeqPacket */
- 0 /* osl_Socket_TypeInvalid */
-};
-
-/* reverse map */
-static oslSocketType osl_SocketTypeFromNative(sal_uInt32 nativeType)
-{
- oslSocketType i= (oslSocketType)0;
-
- while(i != osl_Socket_TypeInvalid)
- {
- if(TypeMap[i] == nativeType)
- return i;
- i = (oslSocketType)(i + 1);
- }
-
- return i;
-}
-
-/* macros */
-#define TYPE_TO_NATIVE(x) TypeMap[x]
-#define TYPE_FROM_NATIVE(y) osl_SocketTypeFromNative(y)
-
-
-/*****************************************************************************/
-/* enum oslSocketOption */
-/*****************************************************************************/
-
-/* map */
-static sal_uInt32 OptionMap[]= {
- SO_DEBUG, /* osl_Socket_OptionDebug */
- SO_ACCEPTCONN, /* osl_Socket_OptionAcceptConn */
- SO_REUSEADDR, /* osl_Socket_OptionReuseAddr */
- SO_KEEPALIVE, /* osl_Socket_OptionKeepAlive */
- SO_DONTROUTE, /* osl_Socket_OptionDontRoute */
- SO_BROADCAST, /* osl_Socket_OptionBroadcast */
- SO_USELOOPBACK, /* osl_Socket_OptionUseLoopback */
- SO_LINGER, /* osl_Socket_OptionLinger */
- SO_OOBINLINE, /* osl_Socket_OptionOOBinLine */
- SO_SNDBUF, /* osl_Socket_OptionSndBuf */
- SO_RCVBUF, /* osl_Socket_OptionRcvBuf */
- SO_SNDLOWAT, /* osl_Socket_OptionSndLowat */
- SO_RCVLOWAT, /* osl_Socket_OptionRcvLowat */
- SO_SNDTIMEO, /* osl_Socket_OptionSndTimeo */
- SO_RCVTIMEO, /* osl_Socket_OptionRcvTimeo */
- SO_ERROR, /* osl_Socket_OptionError */
- SO_TYPE, /* osl_Socket_OptionType */
- TCP_NODELAY, /* osl_Socket_OptionTcpNoDelay */
- 0 /* osl_Socket_OptionInvalid */
-};
-
-/* reverse map */
-/* mfe: NOT USED
-static oslSocketOption osl_SocketOptionFromNative(sal_uInt32 nativeType)
-{
- oslSocketOption i= (oslSocketOption)0;
-
- while(i != osl_Socket_OptionInvalid)
- {
- if(OptionMap[i] == nativeType)
- return i;
- i = (oslSocketOption) ( i + 1 );
- }
-
- return i;
-}
-*/
-/* macros */
-#define OPTION_TO_NATIVE(x) OptionMap[x]
-#define OPTION_FROM_NATIVE(y) osl_SocketOptionFromNative(y)
-
-
-/*****************************************************************************/
-/* enum oslSocketOptionLevel */
-/*****************************************************************************/
-
-static sal_uInt32 OptionLevelMap[]= {
- SOL_SOCKET, /* osl_Socket_LevelSocket */
- IPPROTO_TCP, /* osl_Socket_LevelTcp */
- 0 /* osl_Socket_LevelInvalid */
-};
-
-/* reverse map */
-/* mfe: NOT USED
-static oslSocketOptionLevel osl_SocketOptionLevelFromNative(sal_uInt32 nativeType)
-{
- oslSocketOptionLevel i= (oslSocketOptionLevel)0;
-
- while(i != osl_Socket_LevelInvalid)
- {
- if(OptionLevelMap[i] == nativeType)
- return i;
- i = (oslSocketOptionLevel) ( i + 1 );
- }
-
- return i;
-}
-*/
-/* macros */
-#define OPTION_LEVEL_TO_NATIVE(x) OptionLevelMap[x]
-#define OPTION_LEVEL_FROM_NATIVE(y) osl_SocketOptionLevelFromNative(y)
-
-/*****************************************************************************/
-/* enum oslSocketMsgFlag */
-/*****************************************************************************/
-
-static sal_uInt32 SocketMsgFlagMap[]= {
- 0, /* osl_Socket_MsgNormal */
- MSG_OOB, /* osl_Socket_MsgOOB */
- MSG_PEEK, /* osl_Socket_MsgPeek */
- MSG_DONTROUTE, /* osl_Socket_MsgDontRoute */
- MSG_MAXIOVLEN, /* osl_Socket_MsgMaxIOVLen */
- 0 /* osl_Socket_MsgInvalid */
-};
-
-/* reverse map */
-/* mfe: NOT USED
-static oslSocketMsgFlag osl_SocketMsgFlagFromNative(sal_uInt32 nativeType)
-{
- oslSocketMsgFlag i= (oslSocketMsgFlag)0;
-
- while(i != osl_Socket_MsgInvalid)
- {
- if(SocketMsgFlagMap[i] == nativeType)
- return i;
- i = (oslSocketMsgFlag) ( i + 1 );
- }
-
- return i;
-}
-*/
-
-/* macros */
-#define MSG_FLAG_TO_NATIVE(x) SocketMsgFlagMap[x]
-#define MSG_FLAG_FROM_NATIVE(y) osl_SocketMsgFlagFromNative(y)
-
-
-/*****************************************************************************/
-/* enum oslSocketDirection */
-/*****************************************************************************/
-
-static sal_uInt32 SocketDirection[]= {
- SD_RECEIVE, /* osl_Socket_DirRead */
- SD_SEND, /* osl_Socket_DirWrite */
- SD_BOTH, /* osl_Socket_DirReadWrite */
- 0 /* osl_Socket_DirInvalid */
-};
-
-/* reverse map */
-/* mfe: NOT USED
-static oslSocketDirection osl_SocketDirectionFromNative(sal_uInt32 nativeType)
-{
- oslSocketDirection i= (oslSocketDirection)0;
-
- while(i != osl_Socket_DirInvalid)
- {
- if(SocketDirection[i] == nativeType)
- return i;
- i = (oslSocketDirection) ( i + 1 );
- }
-
- return i;
-}
-*/
-
-/* macros */
-#define DIRECTION_TO_NATIVE(x) SocketDirection[x]
-#define DIRECTION_FROM_NATIVE(y) osl_SocketDirectionFromNative(y)
-
-/*****************************************************************************/
-/* enum oslSocketError */
-/*****************************************************************************/
-
-static struct
-{
- int errcode;
- oslSocketError error;
-} SocketError[]= {
- { 0, osl_Socket_E_None }, /* no error */
- { ENOTSOCK, osl_Socket_E_NotSocket }, /* Socket operation on non-socket */
- { EDESTADDRREQ, osl_Socket_E_DestAddrReq }, /* Destination address required */
- { EMSGSIZE, osl_Socket_E_MsgSize }, /* Message too long */
- { EPROTOTYPE, osl_Socket_E_Prototype }, /* Protocol wrong type for socket */
- { ENOPROTOOPT, osl_Socket_E_NoProtocol }, /* Protocol not available */
- { EPROTONOSUPPORT, osl_Socket_E_ProtocolNoSupport }, /* Protocol not supported */
- { ESOCKTNOSUPPORT, osl_Socket_E_TypeNoSupport }, /* Socket type not supported */
- { EOPNOTSUPP, osl_Socket_E_OpNotSupport }, /* Operation not supported on socket */
- { EPFNOSUPPORT, osl_Socket_E_PfNoSupport }, /* Protocol family not supported */
- { EAFNOSUPPORT, osl_Socket_E_AfNoSupport }, /* Address family not supported by */
- /* protocol family */
- { EADDRINUSE, osl_Socket_E_AddrInUse }, /* Address already in use */
- { EADDRNOTAVAIL, osl_Socket_E_AddrNotAvail }, /* Can't assign requested address */
- { ENETDOWN, osl_Socket_E_NetDown }, /* Network is down */
- { ENETUNREACH, osl_Socket_E_NetUnreachable }, /* Network is unreachable */
- { ENETRESET, osl_Socket_E_NetReset }, /* Network dropped connection because */
- /* of reset */
- { ECONNABORTED, osl_Socket_E_ConnAborted }, /* Software caused connection abort */
- { ECONNRESET, osl_Socket_E_ConnReset }, /* Connection reset by peer */
- { ENOBUFS, osl_Socket_E_NoBufferSpace }, /* No buffer space available */
- { EISCONN, osl_Socket_E_IsConnected }, /* Socket is already connected */
- { ENOTCONN, osl_Socket_E_NotConnected }, /* Socket is not connected */
- { ESHUTDOWN, osl_Socket_E_Shutdown }, /* Can't send after socket shutdown */
- { ETOOMANYREFS, osl_Socket_E_TooManyRefs }, /* Too many references: can't splice */
- { ETIMEDOUT, osl_Socket_E_TimedOut }, /* Connection timed out */
- { ECONNREFUSED, osl_Socket_E_ConnRefused }, /* Connection refused */
- { EHOSTDOWN, osl_Socket_E_HostDown }, /* Host is down */
- { EHOSTUNREACH, osl_Socket_E_HostUnreachable }, /* No route to host */
- { EWOULDBLOCK, osl_Socket_E_WouldBlock }, /* call would block on non-blocking socket */
- { EALREADY, osl_Socket_E_Already }, /* operation already in progress */
- { EINPROGRESS, osl_Socket_E_InProgress }, /* operation now in progress */
- { EAGAIN, osl_Socket_E_WouldBlock }, /* same as EWOULDBLOCK */
- { -1, osl_Socket_E_InvalidError }
-};
-
-/* map */
-/* mfe: NOT USED
-static int osl_NativeFromSocketError(oslSocketError errorCode)
-{
- int i = 0;
-
- while ((SocketError[i].error != osl_Socket_E_InvalidError) &&
- (SocketError[i].error != errorCode)) i++;
-
- return SocketError[i].errcode;
-}
-*/
-
-/* reverse map */
-static oslSocketError osl_SocketErrorFromNative(int nativeType)
-{
- int i = 0;
-
- while ((SocketError[i].error != osl_Socket_E_InvalidError) &&
- (SocketError[i].errcode != nativeType)) i++;
-
- return SocketError[i].error;
-}
-
-/* macros */
-#define ERROR_TO_NATIVE(x) osl_NativeFromSocketError(x)
-#define ERROR_FROM_NATIVE(y) osl_SocketErrorFromNative(y)
-
-/*****************************************************************************/
-/* local function prototypes */
-/*****************************************************************************/
-
-oslSocketAddr SAL_CALL osl_psz_createInetSocketAddr (
- const sal_Char* pszDottedAddr, sal_Int32 Port);
-
-oslSocketAddr SAL_CALL osl_psz_createIpxSocketAddr (
- const sal_Char NetNumber[4],
- const sal_Char NodeNumber[6],
- sal_uInt32 SocketNumber);
-
-oslHostAddr SAL_CALL osl_psz_createHostAddr (
- const sal_Char *pszHostname, const oslSocketAddr Addr);
-
-oslHostAddr SAL_CALL osl_psz_createHostAddrByName (
- const sal_Char *pszHostname);
-
-const sal_Char* SAL_CALL osl_psz_getHostnameOfHostAddr (
- const oslHostAddr Addr);
-
-oslSocketResult SAL_CALL osl_psz_getLocalHostname (
- sal_Char *pBuffer, sal_uInt32 nBufLen);
-
-oslSocketAddr SAL_CALL osl_psz_resolveHostname (
- const sal_Char* pszHostname);
-
-sal_Int32 SAL_CALL osl_psz_getServicePort (
- const sal_Char* pszServicename, const sal_Char* pszProtocol);
-
-oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr (
- oslSocketAddr Addr, sal_Char *pBuffer, sal_uInt32 BufferSize);
-
-oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr (
- oslSocketAddr Addr, sal_Char *pBuffer, sal_uInt32 BufferSize);
-
-void SAL_CALL osl_psz_getLastSocketErrorDescription (
- oslSocket Socket, sal_Char* pBuffer, sal_uInt32 BufferSize);
-
-/*****************************************************************************/
-/* osl_create/destroy-SocketImpl */
-/*****************************************************************************/
-
-#if OSL_DEBUG_LEVEL > 1
-static sal_uInt32 g_nSocketImpl = 0;
-static sal_uInt32 g_nSocketAddr = 0;
-
-#endif /* OSL_DEBUG_LEVEL */
-
-
-oslSocket __osl_createSocketImpl(int Socket)
-{
- oslSocket pSocket;
-
- pSocket = (oslSocket)calloc(1, sizeof(struct oslSocketImpl));
-
- pSocket->m_Socket = Socket;
- pSocket->m_nLastError = 0;
- pSocket->m_CloseCallback = 0;
- pSocket->m_CallbackArg = 0;
- pSocket->m_nRefCount = 1;
-
-#if defined(LINUX)
- pSocket->m_bIsAccepting = sal_False;
-#endif
-
-#if OSL_DEBUG_LEVEL > 1
- g_nSocketImpl ++;
-#endif
- return pSocket;
-}
-
-void __osl_destroySocketImpl(oslSocket Socket)
-{
- if ( Socket != NULL)
- free((struct oslSocketImpl *) Socket);
-#if OSL_DEBUG_LEVEL > 1
- g_nSocketImpl --;
-#endif
-}
-
-static oslSocketAddr __osl_createSocketAddr( )
-{
- oslSocketAddr pAddr = (oslSocketAddr) rtl_allocateZeroMemory( sizeof( struct oslSocketAddrImpl ));
-#if OSL_DEBUG_LEVEL > 1
- g_nSocketAddr ++;
-#endif
- return pAddr;
-}
-
-static oslSocketAddr __osl_createSocketAddrWithFamily(
- oslAddrFamily family, sal_Int32 port, sal_uInt32 nAddr )
-{
- oslSocketAddr pAddr;
-
- OSL_ASSERT( family == osl_Socket_FamilyInet );
-
- pAddr = __osl_createSocketAddr();
- switch( family )
- {
- case osl_Socket_FamilyInet:
- {
- struct sockaddr_in* pInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
-
- pInetAddr->sin_family = FAMILY_TO_NATIVE(osl_Socket_FamilyInet);
- pInetAddr->sin_addr.s_addr = nAddr;
- pInetAddr->sin_port = (sal_uInt16)(port&0xffff);
- break;
- }
- default:
- pAddr->m_sockaddr.sa_family = FAMILY_TO_NATIVE(family);
- }
- return pAddr;
-}
-
-static oslSocketAddr __osl_createSocketAddrFromSystem( struct sockaddr *pSystemSockAddr )
-{
- oslSocketAddr pAddr = __osl_createSocketAddr();
- memcpy( &(pAddr->m_sockaddr), pSystemSockAddr, sizeof( struct sockaddr ) );
- return pAddr;
-}
-
-static void __osl_destroySocketAddr( oslSocketAddr addr )
-{
-#if OSL_DEBUG_LEVEL > 1
- g_nSocketAddr --;
-#endif
- rtl_freeMemory( addr );
-}
-
-/*****************************************************************************/
-/* osl_createEmptySocketAddr */
-/*****************************************************************************/
-oslSocketAddr SAL_CALL osl_createEmptySocketAddr(oslAddrFamily Family)
-{
- oslSocketAddr pAddr = 0;
-
- /* is it an internet-Addr? */
- if (Family == osl_Socket_FamilyInet)
- {
- pAddr = __osl_createSocketAddrWithFamily(Family, 0 , htonl(INADDR_ANY) );
- }
- else
- {
- pAddr = __osl_createSocketAddrWithFamily( Family , 0 , 0 );
- }
-
- return pAddr;
-}
-
-/*****************************************************************************/
-/* osl_copySocketAddr */
-/*****************************************************************************/
-oslSocketAddr SAL_CALL osl_copySocketAddr(oslSocketAddr Addr)
-{
- oslSocketAddr pCopy = 0;
- if (Addr)
- {
- pCopy = __osl_createSocketAddr();
-
- if (pCopy)
- memcpy(&(pCopy->m_sockaddr),&(Addr->m_sockaddr), sizeof(struct sockaddr));
- }
- return pCopy;
-}
-
-/*****************************************************************************/
-/* osl_isEqualSocketAddr */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_isEqualSocketAddr (
- oslSocketAddr Addr1,
- oslSocketAddr Addr2)
-{
- struct sockaddr* pAddr1= &(Addr1->m_sockaddr);
- struct sockaddr* pAddr2= &(Addr2->m_sockaddr);
-
- OSL_ASSERT(pAddr1);
- OSL_ASSERT(pAddr2);
-
- if (pAddr1->sa_family == pAddr2->sa_family)
- {
- switch (pAddr1->sa_family)
- {
- case AF_INET:
- {
- struct sockaddr_in* pInetAddr1= (struct sockaddr_in*)pAddr1;
- struct sockaddr_in* pInetAddr2= (struct sockaddr_in*)pAddr2;
-
- if ((pInetAddr1->sin_family == pInetAddr2->sin_family) &&
- (pInetAddr1->sin_addr.s_addr == pInetAddr2->sin_addr.s_addr) &&
- (pInetAddr1->sin_port == pInetAddr2->sin_port))
- return (sal_True);
- }
-
- default:
- {
- return (memcmp(pAddr1, Addr2, sizeof(struct sockaddr)) == 0);
- }
- }
- }
-
- return (sal_False);
-}
-
-/*****************************************************************************/
-/* osl_createInetBroadcastAddr */
-/*****************************************************************************/
-oslSocketAddr SAL_CALL osl_createInetBroadcastAddr (
- rtl_uString *strDottedAddr,
- sal_Int32 Port)
-{
- sal_uInt32 nAddr = OSL_INADDR_NONE;
- oslSocketAddr pAddr;
-
- if (strDottedAddr && strDottedAddr->length)
- {
- /* Dotted host address for limited broadcast */
- rtl_String *pDottedAddr = NULL;
-
- rtl_uString2String (
- &pDottedAddr, strDottedAddr->buffer, strDottedAddr->length,
- RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
-
- nAddr = inet_addr (pDottedAddr->buffer);
- rtl_string_release (pDottedAddr);
- }
-
- if (nAddr != OSL_INADDR_NONE)
- {
- /* Limited broadcast */
- nAddr = ntohl(nAddr);
- if (IN_CLASSA(nAddr))
- {
- nAddr &= IN_CLASSA_NET;
- nAddr |= IN_CLASSA_HOST;
- }
- else if (IN_CLASSB(nAddr))
- {
- nAddr &= IN_CLASSB_NET;
- nAddr |= IN_CLASSB_HOST;
- }
- else if (IN_CLASSC(nAddr))
- {
- nAddr &= IN_CLASSC_NET;
- nAddr |= IN_CLASSC_HOST;
- }
- else
- {
- /* No broadcast in class D */
- return ((oslSocketAddr)NULL);
- }
- nAddr = htonl(nAddr);
- }
-
- pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons(Port), nAddr );
- return pAddr;
-}
-
-/*****************************************************************************/
-/* osl_createInetSocketAddr */
-/*****************************************************************************/
-oslSocketAddr SAL_CALL osl_createInetSocketAddr (
- rtl_uString *ustrDottedAddr,
- sal_Int32 Port)
-{
- rtl_String* strDottedAddr=0;
- oslSocketAddr Addr;
- sal_Char* pszDottedAddr=0;
-
- if ( ustrDottedAddr != 0 )
- {
- rtl_uString2String( &strDottedAddr,
- rtl_uString_getStr(ustrDottedAddr),
- rtl_uString_getLength(ustrDottedAddr),
- RTL_TEXTENCODING_UTF8,
- OUSTRING_TO_OSTRING_CVTFLAGS);
- pszDottedAddr = rtl_string_getStr(strDottedAddr);
- }
-
-
- Addr = osl_psz_createInetSocketAddr(pszDottedAddr, Port);
-
- if ( strDottedAddr != 0 )
- {
- rtl_string_release(strDottedAddr);
- }
-
- return Addr;
-}
-
-oslSocketAddr SAL_CALL osl_psz_createInetSocketAddr (
- const sal_Char* pszDottedAddr,
- sal_Int32 Port)
-{
- oslSocketAddr pAddr = 0;
- sal_Int32 Addr = inet_addr(pszDottedAddr);
- if(Addr != -1)
- {
- /* valid dotted addr */
- pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons(Port) , Addr );
- }
- return pAddr;
-}
-
-/*****************************************************************************/
-/* osl_setAddrOfSocketAddr */
-/*****************************************************************************/
-oslSocketResult SAL_CALL osl_setAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence *pByteSeq )
-{
- oslSocketResult res = osl_Socket_Error;
-
- OSL_ASSERT( pAddr );
- OSL_ASSERT( pByteSeq );
-
- if( pAddr && pByteSeq )
- {
- struct sockaddr_in * pSystemInetAddr;
-
- OSL_ASSERT( pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE( osl_Socket_FamilyInet ) );
- OSL_ASSERT( pByteSeq->nElements == 4 );
-
- pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr);
- memcpy( &(pSystemInetAddr->sin_addr) , pByteSeq->elements , 4 );
- res = osl_Socket_Ok;
- }
- return res;
-}
-
-/*****************************************************************************/
-/* osl_getAddrOfSocketAddr */
-/*****************************************************************************/
-oslSocketResult SAL_CALL osl_getAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence **ppByteSeq )
-{
- oslSocketResult res = osl_Socket_Error;
-
- OSL_ASSERT( pAddr );
- OSL_ASSERT( ppByteSeq );
-
- if( pAddr && ppByteSeq )
- {
- struct sockaddr_in * pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr);
- rtl_byte_sequence_constructFromArray( ppByteSeq , (sal_Int8 *) &(pSystemInetAddr->sin_addr),4);
- res = osl_Socket_Ok;
- }
- return res;
-}
-
-
-/*****************************************************************************/
-/* _osl_getFullQualifiedDomainName */
-/*****************************************************************************/
-
-/** try to figure out a full-qualified hostname, by adding the current domain
- as given by the domainname program to the given hostname.
- This function MUST NOT call gethostbyname since pHostName allready points
- to data returned by gethostname and would be garbled: use gethostname_r
- instead!
- */
-
-/* wrap around different interfaces to reentrant gethostbyname */
-static struct hostent* _osl_gethostbyname_r (
- const char *name, struct hostent *result,
- char *buffer, int buflen, int *h_errnop)
-{
-
-#ifdef LINUX
- struct hostent *__result; /* will be the same as result */
- int __error;
- __error = gethostbyname_r (name, result, buffer, buflen,
- &__result, h_errnop);
- return __error ? NULL : __result ;
-#elif defined OS2
- // YD FIXME!!!
- return 0;
-#else
- return gethostbyname_r( name, result, buffer, buflen, h_errnop);
-#endif
-}
-
-static sal_Bool _osl_getDomainName (sal_Char *buffer, sal_Int32 bufsiz)
-{
- sal_Bool result;
- int p[2];
-
- result = sal_False;
-
- return (result);
-}
-
-static sal_Char* _osl_getFullQualifiedDomainName (const sal_Char *pHostName)
-{
-# define DOMAINNAME_LENGTH 512
- sal_uInt32 nLengthOfHostName;
- static sal_uInt32 nLengthOfDomainName = 0;
- static sal_Char *pDomainName = NULL;
-
- sal_Char *pFullQualifiedName;
-
- /* get a '\0' terminated domainname */
-
- /* read default domainname default from environment */
- if (nLengthOfDomainName == 0)
- {
- sal_Char *pEnvDomain;
-
- pEnvDomain = getenv ("STAR_OVERRIDE_DOMAINNAME");
- if (pEnvDomain)
- {
- pDomainName = strdup (pEnvDomain);
- nLengthOfDomainName = strlen (pDomainName);
- }
- }
-
-#if 1 /* NEW */
- if (nLengthOfDomainName == 0)
- {
- sal_Char pDomainNameBuffer[ DOMAINNAME_LENGTH ];
-
- pDomainNameBuffer[0] = '\0';
-
- if (_osl_getDomainName (pDomainNameBuffer, DOMAINNAME_LENGTH))
- {
- pDomainName = strdup (pDomainNameBuffer);
- nLengthOfDomainName = strlen (pDomainName);
- }
- }
-
-#endif /* NEW */
-
- /* compose hostname and domainname */
- nLengthOfHostName = strlen( pHostName );
- pFullQualifiedName = (sal_Char*) malloc( (nLengthOfHostName + 1
- + nLengthOfDomainName + 1) * sizeof(sal_Char) );
- memcpy( pFullQualifiedName, pHostName,
- (nLengthOfHostName + 1) * sizeof(sal_Char) );
-
- if ( nLengthOfDomainName > 0 )
- {
- /* fqdn = hostname + '.' + domainname + '\0' */
- pFullQualifiedName[ nLengthOfHostName ] = '.';
- memcpy( pFullQualifiedName + nLengthOfHostName + 1, pDomainName,
- nLengthOfDomainName + 1 );
- }
-
- /* check whether full-qualified name and hostname point to the same host
- * should almost always be true */
- if ( nLengthOfDomainName > 0 )
- {
- struct hostent *pQualifiedHostByName;
- struct hostent *pHostByName;
- sal_Bool bHostsAreEqual;
-
- /* buffer for calls to reentrant version of gethostbyname */
- struct hostent aHostByName, aQualifiedHostByName;
- sal_Char pHostBuffer[ MAX_HOSTBUFFER_SIZE ];
- sal_Char pQualifiedHostBuffer[ MAX_HOSTBUFFER_SIZE ];
- int nErrorNo;
-
- pHostBuffer[0] = '\0';
- pQualifiedHostBuffer[0] = '\0';
-
- /* get list of addresses */
- pQualifiedHostByName = _osl_gethostbyname_r (
- pFullQualifiedName,
- &aQualifiedHostByName, pQualifiedHostBuffer,
- sizeof(pQualifiedHostBuffer), &nErrorNo );
- pHostByName = _osl_gethostbyname_r (
- pHostName,
- &aHostByName, pHostBuffer,
- sizeof(pHostBuffer), &nErrorNo );
-
- /* compare addresses */
- bHostsAreEqual = sal_False;
- if ( pQualifiedHostByName && pHostByName )
- {
- sal_Char **p, **q;
- struct in_addr in;
-
- /* lists are expected to be (very) short */
- for ( p = pQualifiedHostByName->h_addr_list; *p != NULL; p++ )
- {
- for ( q = pHostByName->h_addr_list; *q != NULL; q++ )
- {
- /* in.s_addr may be in_addr_t or uint32_t or heaven knows */
- if ( memcmp( *p, *q, sizeof(in.s_addr) ) == 0 )
- {
- bHostsAreEqual = sal_True;
- break;
- }
- }
- if ( bHostsAreEqual )
- break;
- }
- }
-
- /* very strange case, but have to believe it: reduce the
- * full qualified name to the unqualified host name */
- if ( !bHostsAreEqual )
- {
- sal_Char *pTmp;
-
- OSL_TRACE("_osl_getFullQualifiedDomainName: "
- "suspect FQDN: %s\n", pFullQualifiedName);
- pFullQualifiedName[ nLengthOfHostName ] = '\0';
- pTmp = (sal_Char*)realloc ( pFullQualifiedName,
- (nLengthOfHostName + 1) * sizeof( sal_Char ));
- if (pTmp)
- pFullQualifiedName = pTmp;
- }
- }
-
- /* always return a hostname looked up as carefully as possible
- * this string must be freed by the caller */
- return pFullQualifiedName;
-}
-
-/*****************************************************************************/
-/* _osl_isFullQualifiedDomainName */
-/*****************************************************************************/
-static sal_Bool _osl_isFullQualifiedDomainName (const sal_Char *pHostName)
-{
- /* a FQDN (aka 'hostname.domain.top_level_domain' )
- * is a name which contains a dot '.' in it ( would
- * match as well for 'hostname.' but is good enough
- * for now )*/
- return (sal_Bool)( strchr( pHostName, (int)'.' ) != NULL );
-}
-
-/*****************************************************************************/
-/* oslHostAddr */
-/*****************************************************************************/
-struct oslHostAddrImpl
-{
- sal_Char *pHostName;
- oslSocketAddr pSockAddr;
-};
-
-static oslHostAddr _osl_hostentToHostAddr (const struct hostent *he)
-{
- oslHostAddr pAddr= NULL;
- oslSocketAddr pSockAddr = 0;
-
-
- if ((he == NULL) || (he->h_name == NULL) || (he->h_addr_list[0] == NULL))
- return ((oslHostAddr)NULL);
-
- //YD 18/06/2006 win32 does this with unicode, see socket.cxx
- sal_Char *cn;
- cn= (sal_Char *)malloc(strlen (he->h_name) + 1);
- OSL_ASSERT(cn);
- if (cn == NULL)
- return ((oslHostAddr)NULL);
-
- strcpy(cn, he->h_name);
-
- pSockAddr = __osl_createSocketAddr();
- OSL_ASSERT(pSockAddr);
- if (pSockAddr == NULL)
- {
- free(cn);
- return ((oslHostAddr)NULL);
- }
-
- pSockAddr->m_sockaddr.sa_family= he->h_addrtype;
- if (pSockAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
- {
- struct sockaddr_in *sin= (struct sockaddr_in *)&(pSockAddr->m_sockaddr);
- memcpy (
- &(sin->sin_addr.s_addr),
- he->h_addr_list[0],
- he->h_length);
- }
- else
- {
- /* unknown address family */
- /* future extensions for new families might be implemented here */
-
- OSL_TRACE("_osl_hostentToHostAddr: unknown address family.\n");
- OSL_ASSERT(sal_False);
-
- __osl_destroySocketAddr( pSockAddr );
- free (cn);
- return ((oslHostAddr)NULL);
- }
-
- pAddr= (oslHostAddr) malloc(sizeof(struct oslHostAddrImpl));
- OSL_ASSERT(pAddr);
- if (pAddr == NULL)
- {
- __osl_destroySocketAddr( pSockAddr );
- free (cn);
- return ((oslHostAddr)NULL);
- }
-
- pAddr->pHostName= cn;
- pAddr->pSockAddr= pSockAddr;
-
- return pAddr;
-}
-
-/*****************************************************************************/
-/* osl_createHostAddr */
-/*****************************************************************************/
-oslHostAddr SAL_CALL osl_createHostAddr (
- rtl_uString *ustrHostname,
- const oslSocketAddr Addr)
-{
- oslHostAddr HostAddr;
- rtl_String* strHostname=0;
- sal_Char* pszHostName=0;
-
- if ( ustrHostname != 0 )
- {
- rtl_uString2String( &strHostname,
- rtl_uString_getStr(ustrHostname),
- rtl_uString_getLength(ustrHostname),
- RTL_TEXTENCODING_UTF8,
- OUSTRING_TO_OSTRING_CVTFLAGS );
- pszHostName = rtl_string_getStr(strHostname);
- }
-
- HostAddr = osl_psz_createHostAddr(pszHostName,Addr);
-
- if ( strHostname != 0 )
- {
- rtl_string_release(strHostname);
- }
-
-
- return HostAddr;
-}
-
-oslHostAddr SAL_CALL osl_psz_createHostAddr (
- const sal_Char *pszHostname,
- const oslSocketAddr pAddr)
-{
- oslHostAddr pHostAddr;
- sal_Char *cn;
-
- OSL_ASSERT(pszHostname && pAddr);
- if ((pszHostname == NULL) || (pAddr == NULL))
- return ((oslHostAddr)NULL);
-
- cn = (sal_Char *)malloc(strlen (pszHostname) + 1);
- OSL_ASSERT(cn);
- if (cn == NULL)
- return ((oslHostAddr)NULL);
-
- strcpy (cn, pszHostname);
-
- pHostAddr= (oslHostAddr) malloc(sizeof(struct oslHostAddrImpl));
- OSL_ASSERT(pHostAddr);
- if (pAddr == NULL)
- {
- free (cn);
- return ((oslHostAddr)NULL);
- }
-
- pHostAddr->pHostName= cn;
- pHostAddr->pSockAddr= osl_copySocketAddr( pAddr );
-
- return pHostAddr;
-}
-
-/*****************************************************************************/
-/* osl_createHostAddrByName */
-/*****************************************************************************/
-oslHostAddr SAL_CALL osl_createHostAddrByName(rtl_uString *ustrHostname)
-{
- oslHostAddr HostAddr;
- rtl_String* strHostname=0;
- sal_Char* pszHostName=0;
-
- if ( ustrHostname != 0 )
- {
- rtl_uString2String( &strHostname,
- rtl_uString_getStr(ustrHostname),
- rtl_uString_getLength(ustrHostname),
- RTL_TEXTENCODING_UTF8,
- OUSTRING_TO_OSTRING_CVTFLAGS );
- pszHostName=rtl_string_getStr(strHostname);
- }
-
- HostAddr = osl_psz_createHostAddrByName(pszHostName);
-
- if ( strHostname != 0 )
- {
- rtl_string_release(strHostname);
- }
-
- return HostAddr;
-}
-
-oslHostAddr SAL_CALL osl_psz_createHostAddrByName (const sal_Char *pszHostname)
-{
- struct hostent *he;
- oslHostAddr addr;
-
- static oslMutex mutex = NULL;
-
- if (mutex == NULL)
- mutex = osl_createMutex();
-
- osl_acquireMutex(mutex);
-
- he = gethostbyname((sal_Char *)pszHostname);
- addr = _osl_hostentToHostAddr (he);
-
- osl_releaseMutex(mutex);
-
- return addr;
-}
-
-/*****************************************************************************/
-/* osl_createHostAddrByAddr */
-/*****************************************************************************/
-oslHostAddr SAL_CALL osl_createHostAddrByAddr (const oslSocketAddr pAddr)
-{
- OSL_ASSERT(pAddr);
-
- if (pAddr == NULL)
- return ((oslHostAddr)NULL);
-
- if (pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
- {
- const struct sockaddr_in *sin= (const struct sockaddr_in *)&(pAddr->m_sockaddr);
- struct hostent *he;
-
- if (sin->sin_addr.s_addr == htonl(INADDR_ANY))
- return ((oslHostAddr)NULL);
-
- he= gethostbyaddr((sal_Char *)&(sin->sin_addr),
- sizeof (sin->sin_addr),
- sin->sin_family);
- return _osl_hostentToHostAddr (he);
- }
-
- return ((oslHostAddr)NULL);
-}
-
-/*****************************************************************************/
-/* osl_copyHostAddr */
-/*****************************************************************************/
-oslHostAddr SAL_CALL osl_copyHostAddr (const oslHostAddr pAddr)
-{
- OSL_ASSERT(pAddr);
-
- if (pAddr)
- return osl_psz_createHostAddr (pAddr->pHostName, pAddr->pSockAddr);
- else
- return ((oslHostAddr)NULL);
-}
-
-/*****************************************************************************/
-/* osl_getHostnameOfHostAddr */
-/*****************************************************************************/
-void SAL_CALL osl_getHostnameOfHostAddr (
- const oslHostAddr Addr,
- rtl_uString **ustrHostname)
-{
- const sal_Char* pHostname=0;
-
- pHostname = osl_psz_getHostnameOfHostAddr(Addr);
-
- rtl_uString_newFromAscii (ustrHostname, pHostname);
-
- return;
-}
-
-const sal_Char* SAL_CALL osl_psz_getHostnameOfHostAddr (const oslHostAddr pAddr)
-{
- OSL_ASSERT(pAddr);
-
- if (pAddr)
- return pAddr->pHostName;
- else
- return NULL;
-}
-
-/*****************************************************************************/
-/* osl_getSocketAddrOfHostAddr */
-/*****************************************************************************/
-oslSocketAddr SAL_CALL osl_getSocketAddrOfHostAddr (const oslHostAddr pAddr)
-{
- OSL_ASSERT(pAddr);
-
- if (pAddr)
- return ((oslSocketAddr)(pAddr->pSockAddr));
- else
- return NULL;
-}
-
-/*****************************************************************************/
-/* osl_destroyHostAddr */
-/*****************************************************************************/
-void SAL_CALL osl_destroyHostAddr (oslHostAddr pAddr)
-{
- if (pAddr)
- {
- if (pAddr->pHostName)
- free (pAddr->pHostName);
- if (pAddr->pSockAddr)
- osl_destroySocketAddr (pAddr->pSockAddr);
- free (pAddr);
- }
-}
-
-/*****************************************************************************/
-/* osl_getLocalHostname */
-/*****************************************************************************/
-oslSocketResult SAL_CALL osl_getLocalHostname(rtl_uString **ustrLocalHostname)
-{
- oslSocketResult Result;
- sal_Char pszHostname[1024];
-
- pszHostname[0] = '\0';
-
- Result = osl_psz_getLocalHostname(pszHostname,sizeof(pszHostname));
-
- rtl_uString_newFromAscii(ustrLocalHostname,pszHostname);
-
- return Result;
-}
-
-oslSocketResult SAL_CALL osl_psz_getLocalHostname (
- sal_Char *pBuffer, sal_uInt32 nBufLen)
-{
- static sal_Char LocalHostname[256] = "";
-
- if (strlen(LocalHostname) == 0)
- {
- const sal_Char *pStr;
-
-#ifdef SYSV
- struct utsname uts;
-
- if (uname(&uts) < 0)
- return osl_Socket_Error;
-
- if ((strlen(uts.nodename) + 1) > nBufLen)
- return osl_Socket_Error;
-
- strncpy(LocalHostname, uts.nodename, sizeof( LocalHostname ));
-#else /* BSD compatible */
-
- if (gethostname(LocalHostname, sizeof(LocalHostname)-1) != 0)
- return osl_Socket_Error;
- LocalHostname[sizeof(LocalHostname)-1] = 0;
-#endif /* SYSV */
-
- /* check if we have an FQDN */
- if (strchr(LocalHostname, '.') == NULL)
- {
- oslHostAddr Addr;
-
- /* no, determine it via dns */
- Addr = osl_psz_createHostAddrByName(LocalHostname);
-
- if (Addr && (pStr = osl_psz_getHostnameOfHostAddr(Addr)) != NULL)
- {
- strcpy(LocalHostname, pStr);
- }
- if (Addr)
- osl_destroyHostAddr(Addr);
- }
- }
-
- if (strlen(LocalHostname) > 0)
- {
- strncpy(pBuffer, LocalHostname, nBufLen);
- pBuffer[nBufLen - 1] = '\0';
-
- return osl_Socket_Ok;
- }
-
- return osl_Socket_Error;
-}
-
-/*****************************************************************************/
-/* osl_resolveHostname */
-/*****************************************************************************/
-oslSocketAddr SAL_CALL osl_resolveHostname(rtl_uString *ustrHostname)
-{
- oslSocketAddr Addr;
- rtl_String* strHostname=0;
- sal_Char* pszHostName=0;
-
- if ( ustrHostname != 0 )
- {
- rtl_uString2String( &strHostname,
- rtl_uString_getStr(ustrHostname),
- rtl_uString_getLength(ustrHostname),
- RTL_TEXTENCODING_UTF8,
- OUSTRING_TO_OSTRING_CVTFLAGS );
- pszHostName = rtl_string_getStr(strHostname);
- }
-
-
- Addr = osl_psz_resolveHostname(pszHostName);
-
- if ( strHostname != 0 )
- {
- rtl_string_release(strHostname);
- }
-
-
- return Addr;
-}
-
-
-oslSocketAddr SAL_CALL osl_psz_resolveHostname(const sal_Char* pszHostname)
-{
- struct oslHostAddrImpl *pAddr = (oslHostAddr)osl_psz_createHostAddrByName(pszHostname);
-
- if (pAddr)
- {
- oslSocketAddr SockAddr = osl_copySocketAddr(pAddr->pSockAddr);
-
- osl_destroyHostAddr(pAddr);
-
- return (SockAddr);
- }
-
- return ((oslSocketAddr)NULL);
-}
-
-/*****************************************************************************/
-/* osl_getServicePort */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_getServicePort(rtl_uString *ustrServicename, rtl_uString *ustrProtocol)
-{
- sal_Int32 nPort;
- rtl_String* strServicename=0;
- rtl_String* strProtocol=0;
- sal_Char* pszServiceName=0;
- sal_Char* pszProtocol=0;
-
- if ( ustrServicename != 0 )
- {
- rtl_uString2String( &strServicename,
- rtl_uString_getStr(ustrServicename),
- rtl_uString_getLength(ustrServicename),
- RTL_TEXTENCODING_UTF8,
- OUSTRING_TO_OSTRING_CVTFLAGS );
- pszServiceName = rtl_string_getStr(strServicename);
- }
-
- if ( ustrProtocol != 0 )
- {
- rtl_uString2String( &strProtocol,
- rtl_uString_getStr(ustrProtocol),
- rtl_uString_getLength(ustrProtocol),
- RTL_TEXTENCODING_UTF8,
- OUSTRING_TO_OSTRING_CVTFLAGS );
- pszProtocol = rtl_string_getStr(strProtocol);
- }
-
- nPort = osl_psz_getServicePort(pszServiceName,pszProtocol);
-
- if ( strServicename != 0 )
- {
- rtl_string_release(strServicename);
- }
-
- if ( strProtocol != 0 )
- {
- rtl_string_release(strProtocol);
- }
-
-
- return nPort;
-}
-
-
-sal_Int32 SAL_CALL osl_psz_getServicePort(const sal_Char* pszServicename,
- const sal_Char* pszProtocol)
-{
- struct servent* ps;
-
- ps= getservbyname(pszServicename, pszProtocol);
-
- if (ps != 0)
- return ntohs(ps->s_port);
-
- return OSL_INVALID_PORT;
-}
-
-/*****************************************************************************/
-/* osl_destroySocketAddr */
-/*****************************************************************************/
-void SAL_CALL osl_destroySocketAddr(oslSocketAddr pAddr)
-{
- __osl_destroySocketAddr( pAddr );
-}
-
-/*****************************************************************************/
-/* osl_getFamilyOfSocketAddr */
-/*****************************************************************************/
-oslAddrFamily SAL_CALL osl_getFamilyOfSocketAddr(oslSocketAddr pAddr)
-{
- OSL_ASSERT(pAddr);
-
- if (pAddr)
- return FAMILY_FROM_NATIVE(pAddr->m_sockaddr.sa_family);
- else
- return osl_Socket_FamilyInvalid;
-}
-
-/*****************************************************************************/
-/* osl_getInetPortOfSocketAddr */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_getInetPortOfSocketAddr(oslSocketAddr pAddr)
-{
- OSL_ASSERT(pAddr);
- if( pAddr )
- {
- struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
-
- if ( pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
- return ntohs(pSystemInetAddr->sin_port);
- }
- return OSL_INVALID_PORT;
-}
-
-/*****************************************************************************/
-/* osl_setInetPortOfSocketAddr */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_setInetPortOfSocketAddr(oslSocketAddr pAddr, sal_Int32 Port)
-{
- OSL_ASSERT(pAddr);
- if( pAddr )
- {
- struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
- if ( pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
- {
- pSystemInetAddr->sin_port= htons((short)Port);
- return sal_True;
- }
- }
-
- /* this is not a inet-addr => can't set port */
- return sal_False;
-}
-
-/*****************************************************************************/
-/* osl_getHostnameOfSocketAddr */
-/*****************************************************************************/
-oslSocketResult SAL_CALL osl_getHostnameOfSocketAddr(oslSocketAddr Addr, rtl_uString **ustrHostname)
-{
- oslSocketResult Result;
- sal_Char pszHostname[1024];
-
- pszHostname[0] = '\0';
-
- Result = osl_psz_getHostnameOfSocketAddr(Addr,pszHostname,sizeof(pszHostname));
-
- rtl_uString_newFromAscii(ustrHostname,pszHostname);
-
- return Result;
-}
-
-
-oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr(oslSocketAddr pAddr,
- sal_Char *pBuffer, sal_uInt32 BufferSize)
-{
- oslHostAddr pHostAddr= (oslHostAddr )osl_createHostAddrByAddr(pAddr);
-
- if (pHostAddr)
- {
- strncpy(pBuffer, pHostAddr->pHostName, BufferSize);
-
- pBuffer[BufferSize - 1] = '\0';
-
- osl_destroyHostAddr(pHostAddr);
-
- return osl_Socket_Ok;
- }
-
- return osl_Socket_Error;
-}
-
-/*****************************************************************************/
-/* osl_getDottedInetAddrOfSocketAddr */
-/*****************************************************************************/
-oslSocketResult SAL_CALL osl_getDottedInetAddrOfSocketAddr(oslSocketAddr Addr, rtl_uString **ustrDottedInetAddr)
-{
- oslSocketResult Result;
- sal_Char pszDottedInetAddr[1024];
-
- pszDottedInetAddr[0] = '\0';
-
- Result = osl_psz_getDottedInetAddrOfSocketAddr(Addr,pszDottedInetAddr,sizeof(pszDottedInetAddr));
-
- rtl_uString_newFromAscii(ustrDottedInetAddr,pszDottedInetAddr);
-
- return Result;
-
-}
-
-oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr(oslSocketAddr pAddr,
- sal_Char *pBuffer, sal_uInt32 BufferSize)
-{
- OSL_ASSERT(pAddr);
-
- if( pAddr )
- {
- struct sockaddr_in* pSystemInetAddr = ( struct sockaddr_in * ) &(pAddr->m_sockaddr);
-
- if (pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
- {
- strncpy(pBuffer, inet_ntoa(pSystemInetAddr->sin_addr), BufferSize);
- pBuffer[BufferSize - 1] = '\0';
-
- return osl_Socket_Ok;
- }
- }
-
- return osl_Socket_Error;
-}
-
-/*****************************************************************************/
-/* osl_createSocket */
-/*****************************************************************************/
-oslSocket SAL_CALL osl_createSocket(oslAddrFamily Family,
- oslSocketType Type,
- oslProtocol Protocol)
-{
- int Flags;
- oslSocket pSocket;
-
- /* alloc memory */
- pSocket= __osl_createSocketImpl(OSL_INVALID_SOCKET);
-
- /* create socket */
- pSocket->m_Socket= socket(FAMILY_TO_NATIVE(Family),
- TYPE_TO_NATIVE(Type),
- PROTOCOL_TO_NATIVE(Protocol));
-
- /* creation failed => free memory */
- if(pSocket->m_Socket == OSL_INVALID_SOCKET)
- {
- OSL_TRACE("osl_createSocket failed. Errno: %d; %s\n",
- errno,
- strerror(errno));
-
- __osl_destroySocketImpl((pSocket));
- pSocket= 0;
- }
- else
- {
- /* set close-on-exec flag */
- if ((Flags = fcntl(pSocket->m_Socket, F_GETFD, 0)) != -1)
- {
- Flags |= FD_CLOEXEC;
- if (fcntl(pSocket->m_Socket, F_SETFD, Flags) == -1)
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("osl_createSocket failed changing socket flags. Errno: %d; %s\n",
- errno,
- strerror(errno));
- }
- }
- else
- {
- pSocket->m_nLastError=errno;
- }
-
-
- pSocket->m_CloseCallback = NULL;
- pSocket->m_CallbackArg = NULL;
- }
-
- return pSocket;
-}
-
-void SAL_CALL osl_acquireSocket(oslSocket pSocket)
-{
- osl_incrementInterlockedCount( &(pSocket->m_nRefCount ) );
-}
-
-void SAL_CALL osl_releaseSocket( oslSocket pSocket )
-{
- if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) )
- {
-#if defined(LINUX)
- if ( pSocket->m_bIsAccepting == sal_True )
- {
- OSL_FAIL("osl_destroySocket : attempt to destroy socket while accepting\n");
- return;
- }
-#endif /* LINUX */
- osl_closeSocket( pSocket );
- __osl_destroySocketImpl( pSocket );
- }
-}
-
-
-
-/*****************************************************************************/
-/* osl_closeSocket */
-/*****************************************************************************/
-void SAL_CALL osl_closeSocket(oslSocket pSocket)
-{
- int nRet;
- int nFD;
-
- /* socket already invalid */
- if(pSocket==0)
- return;
-
- pSocket->m_nLastError=0;
- nFD = pSocket->m_Socket;
-
- pSocket->m_Socket = OSL_INVALID_SOCKET;
-
-#if defined(LINUX)
- pSocket->m_bIsInShutdown = sal_True;
-
- if ( pSocket->m_bIsAccepting == sal_True )
- {
- int nConnFD;
- struct sockaddr aSockAddr;
- socklen_t nSockLen = sizeof(aSockAddr);
-
- nRet = getsockname(nFD, &aSockAddr, &nSockLen);
-#if OSL_DEBUG_LEVEL > 1
- if ( nRet < 0 )
- {
- perror("getsockname");
- }
-#endif /* OSL_DEBUG_LEVEL */
-
- if ( aSockAddr.sa_family == AF_INET )
- {
- struct sockaddr_in* pSockAddrIn = (struct sockaddr_in*) &aSockAddr;
-
- if ( pSockAddrIn->sin_addr.s_addr == htonl(INADDR_ANY) )
- {
- pSockAddrIn->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- }
-
- nConnFD = socket(AF_INET, SOCK_STREAM, 0);
-#if OSL_DEBUG_LEVEL > 1
- if ( nConnFD < 0 )
- {
- perror("socket");
- }
-#endif /* OSL_DEBUG_LEVEL */
-
- nRet = connect(nConnFD, &aSockAddr, sizeof(aSockAddr));
-#if OSL_DEBUG_LEVEL > 1
- if ( nRet < 0 )
- {
- perror("connect");
- }
-#endif /* OSL_DEBUG_LEVEL */
- close(nConnFD);
- }
- }
-#endif /* LINUX */
-
- /* registrierten Callback ausfuehren */
- if (pSocket->m_CloseCallback != NULL)
- {
- pSocket->m_CloseCallback(pSocket->m_CallbackArg);
- }
-
- nRet=close(nFD);
- if ( nRet != 0 )
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("closeSocket close error '%s'\n",strerror(errno));
- }
-
- pSocket->m_Socket = OSL_INVALID_SOCKET;
-}
-
-/*****************************************************************************/
-/* osl_getLocalAddrOfSocket */
-/* Note that I rely on the fact that oslSocketAddr and struct sockaddr */
-/* are the same! I don't like it very much but see no other easy way to conceal */
-/* the struct sockaddr from the eyes of the user. */
-/*****************************************************************************/
-oslSocketAddr SAL_CALL osl_getLocalAddrOfSocket(oslSocket pSocket)
-{
-#if defined(LINUX) || defined(FREEBSD)
- socklen_t AddrLen;
-#else
- /* mfe: Solaris 'cc +w' means Addrlen should be signed! */
- /* it's really defined as 'int*' in /usr/include/sys/socket.h! */
- /* the man page says it expects a 'size_t' */
- int AddrLen;
-#endif
- struct sockaddr Addr;
- oslSocketAddr pAddr;
-
- if (pSocket == NULL) /* ENOTSOCK */
- return ((oslSocketAddr)NULL);
-
- AddrLen= sizeof(struct sockaddr);
-
- if (getsockname(pSocket->m_Socket, &Addr, PTR_SIZE_T(AddrLen)) == OSL_SOCKET_ERROR)
- return ((oslSocketAddr)NULL);
-
- pAddr = __osl_createSocketAddrFromSystem( &Addr );
- return pAddr;
-}
-
-/*****************************************************************************/
-/* osl_getPeerAddrOfSocket */
-/*****************************************************************************/
-oslSocketAddr SAL_CALL osl_getPeerAddrOfSocket(oslSocket pSocket)
-{
- sal_uInt32 AddrLen;
- struct sockaddr Addr;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return 0;
- }
-
- pSocket->m_nLastError=0;
- AddrLen= sizeof(struct sockaddr);
-
- if(getpeername(pSocket->m_Socket, &Addr, (int*)PTR_SIZE_T(AddrLen)) == OSL_SOCKET_ERROR)
- {
- pSocket->m_nLastError=errno;
- return 0;
- }
- return __osl_createSocketAddrFromSystem( &Addr );
-}
-
-/*****************************************************************************/
-/* osl_bindAddrToSocket */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_bindAddrToSocket(oslSocket pSocket,
- oslSocketAddr pAddr)
-{
- int nRet;
-
- OSL_ASSERT(pSocket && pAddr );
- if ( pSocket == 0 || pAddr == 0 )
- {
- return sal_False;
- }
-
- pSocket->m_nLastError=0;
-
- nRet = bind(pSocket->m_Socket, &(pAddr->m_sockaddr), sizeof(struct sockaddr));
-
- if ( nRet == OSL_SOCKET_ERROR)
- {
- pSocket->m_nLastError=errno;
- return sal_False;
- }
-
- return sal_True;
-}
-
-
-/*****************************************************************************/
-/* osl_listenOnSocket */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_listenOnSocket(oslSocket pSocket,
- sal_Int32 MaxPendingConnections)
-{
- int nRet;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return sal_False;
- }
-
- pSocket->m_nLastError=0;
-
- nRet = listen(pSocket->m_Socket,
- MaxPendingConnections == -1 ?
- SOMAXCONN :
- MaxPendingConnections);
- if ( nRet == OSL_SOCKET_ERROR)
- {
- pSocket->m_nLastError=errno;
- return sal_False;
- }
-
- return sal_True;
-}
-
-
-/*****************************************************************************/
-/* osl_connectSocketTo */
-/*****************************************************************************/
-oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket pSocket,
- oslSocketAddr pAddr,
- const TimeValue* pTimeout)
-{
- fd_set WriteSet;
- fd_set ExcptSet;
- int ReadyHandles;
- struct timeval tv;
- oslSocketResult Result= osl_Socket_Ok;
-
- OSL_PRECOND(pSocket, "osl_connectSocketTo(): need a valid socket!\n");
-
- if ( pSocket == 0 )
- {
- return osl_Socket_Error;
- }
-
- pSocket->m_nLastError=0;
-
- if (osl_isNonBlockingMode(pSocket))
- {
- if (connect(pSocket->m_Socket,
- &(pAddr->m_sockaddr),
- sizeof(struct sockaddr)) != OSL_SOCKET_ERROR)
- return osl_Socket_Ok;
- else
- if (errno == EWOULDBLOCK || errno == EINPROGRESS)
- {
- pSocket->m_nLastError=EINPROGRESS;
- return osl_Socket_InProgress;
- }
-
-
- pSocket->m_nLastError=errno;
- OSL_TRACE("can't connect : '%s'",strerror(errno));
- return osl_Socket_Error;
- }
-
- /* set socket temporarily to non-blocking */
- OSL_VERIFY(osl_enableNonBlockingMode(pSocket, sal_True));
-
- /* initiate connect */
- if(connect(pSocket->m_Socket,
- &(pAddr->m_sockaddr),
- sizeof(struct sockaddr)) != OSL_SOCKET_ERROR)
- {
- /* immediate connection */
- osl_enableNonBlockingMode(pSocket, sal_False);
-
- return osl_Socket_Ok;
- }
- else
- {
- /* really an error or just delayed? */
- if (errno != EINPROGRESS)
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE(
- "osl_connectSocketTo(): connect failed: errno: %d (%s)\n",
- errno, strerror(errno));
-
- osl_enableNonBlockingMode(pSocket, sal_False);
- return osl_Socket_Error;
- }
- }
-
-
- /* prepare select set for socket */
- FD_ZERO(&WriteSet);
- FD_ZERO(&ExcptSet);
- FD_SET(pSocket->m_Socket, &WriteSet);
- FD_SET(pSocket->m_Socket, &ExcptSet);
-
- /* prepare timeout */
- if (pTimeout)
- {
- /* divide milliseconds into seconds and microseconds */
- tv.tv_sec= pTimeout->Seconds;
- tv.tv_usec= pTimeout->Nanosec / 1000L;
- }
-
- /* select */
- ReadyHandles= select(pSocket->m_Socket+1,
- 0,
- PTR_FD_SET(WriteSet),
- PTR_FD_SET(ExcptSet),
- (pTimeout) ? &tv : 0);
-
- if (ReadyHandles > 0) /* connected */
- {
- if ( FD_ISSET(pSocket->m_Socket, &WriteSet ) )
- {
- int nErrorCode = 0;
-#ifdef SOLARIS
-/* mfe: Solaris 'cc +w' means 5th argument should be a 'int*'!
- it's really defined as 'int*' in /usr/include/sys/socket.h!
- the man page says it expects a 'size_t*'
-*/
- int nErrorSize = sizeof( nErrorCode );
-#else
- size_t nErrorSize = sizeof( nErrorCode );
-#endif
-
- int nSockOpt;
-
- nSockOpt = getsockopt ( pSocket->m_Socket, SOL_SOCKET, SO_ERROR,
-#ifdef SOLARIS
-/* mfe: Solaris 'cc +w' means 4th argument should be a 'char*'!
- it's really defined as 'char*' in /usr/include/sys/socket.h!
- the man page says it expects a 'void*'
-*/
- (char*)
-#endif
- &nErrorCode, (int*)&nErrorSize );
- if ( (nSockOpt == 0) && (nErrorCode == 0))
- Result = osl_Socket_Ok;
- else
- Result = osl_Socket_Error;
- }
- else
- {
- Result= osl_Socket_Error;
- }
- }
- else if (ReadyHandles < 0) /* error */
- {
- if (errno == EBADF) /* most probably interrupted by close() */
- {
- /* do not access pSockImpl because it is about to be or */
- /* already destroyed */
- return osl_Socket_Interrupted;
- }
- else
- {
- pSocket->m_nLastError=errno;
- Result= osl_Socket_Error;
- }
- }
- else /* timeout */
- {
- pSocket->m_nLastError=errno;
- Result= osl_Socket_TimedOut;
- }
-
- osl_enableNonBlockingMode(pSocket, sal_False);
-
- return Result;
-}
-
-
-/*****************************************************************************/
-/* osl_acceptConnectionOnSocket */
-/*****************************************************************************/
-oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
- oslSocketAddr* ppAddr)
-{
- struct sockaddr Addr;
- int Connection, Flags;
- sal_uInt32 AddrLen = sizeof(struct sockaddr);
- oslSocket pConnectionSockImpl;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return 0;
- }
-
- pSocket->m_nLastError=0;
-#if defined(LINUX)
- pSocket->m_bIsAccepting = sal_True;
-#endif /* LINUX */
-
- if( ppAddr && *ppAddr )
- {
- osl_destroySocketAddr( *ppAddr );
- *ppAddr = 0;
- }
-
- /* prevent Linux EINTR behaviour */
- do
- {
- Connection = accept(pSocket->m_Socket, &Addr, (int*)PTR_SIZE_T(AddrLen));
- } while (Connection == -1 && errno == EINTR);
-
-
- /* accept failed? */
- if( Connection == OSL_SOCKET_ERROR )
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("osl_acceptConnectionOnSocket : accept error '%s'\n",strerror(errno));
-
-#if defined(LINUX)
- pSocket->m_bIsAccepting = sal_False;
-#endif /* LINUX */
- return 0;
- }
-
- OSL_ASSERT(AddrLen == sizeof(struct sockaddr));
-
-
-#if defined(LINUX)
- if ( pSocket->m_bIsInShutdown == sal_True )
- {
- close(Connection);
- OSL_TRACE("osl_acceptConnectionOnSocket : close while accept\n");
- return 0;
- }
-#endif /* LINUX */
-
-
- if(ppAddr)
- {
- *ppAddr= __osl_createSocketAddrFromSystem(&Addr);
- }
-
- /* alloc memory */
- pConnectionSockImpl= __osl_createSocketImpl(OSL_INVALID_SOCKET);
-
- /* set close-on-exec flag */
- if ((Flags = fcntl(Connection, F_GETFD, 0)) != -1)
- {
- Flags |= FD_CLOEXEC;
- if (fcntl(Connection, F_SETFD, Flags) == -1)
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("osl_acceptConnectionOnSocket failed changing socket flags. Errno: %d (%s)\n",
- errno,
- strerror(errno));
- }
-
- }
-
- pConnectionSockImpl->m_Socket = Connection;
- pConnectionSockImpl->m_nLastError = 0;
- pConnectionSockImpl->m_CloseCallback = NULL;
- pConnectionSockImpl->m_CallbackArg = NULL;
-#if defined(LINUX)
- pConnectionSockImpl->m_bIsAccepting = sal_False;
-
- pSocket->m_bIsAccepting = sal_False;
-#endif /* LINUX */
- return pConnectionSockImpl;
-}
-
-/*****************************************************************************/
-/* osl_receiveSocket */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_receiveSocket(oslSocket pSocket,
- void* pBuffer,
- sal_uInt32 BytesToRead,
- oslSocketMsgFlag Flag)
-{
- int nRead;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- OSL_TRACE("osl_receiveSocket : Invalid socket");
- return -1;
- }
-
- pSocket->m_nLastError=0;
-
- do
- {
- nRead = recv(pSocket->m_Socket,
- (sal_Char*)pBuffer,
- BytesToRead,
- MSG_FLAG_TO_NATIVE(Flag));
- } while ( nRead < 0 && errno == EINTR );
-
- if ( nRead < 0 )
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,strerror(errno));
- }
- else if ( nRead == 0 )
- {
- OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,"EOL");
- }
-
- return nRead;
-}
-
-
-/*****************************************************************************/
-/* osl_receiveFromSocket */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_receiveFromSocket(oslSocket pSocket,
- oslSocketAddr pSenderAddr,
- void* pBuffer,
- sal_uInt32 BufferSize,
- oslSocketMsgFlag Flag)
-{
- int nRead;
- struct sockaddr *pSystemSockAddr = 0;
- int AddrLen = 0;
- if( pSenderAddr )
- {
- AddrLen = sizeof( struct sockaddr );
- pSystemSockAddr = &(pSenderAddr->m_sockaddr);
- }
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- OSL_TRACE("osl_receiveFromSocket : Invalid socket");
- return -1;
- }
-
- pSocket->m_nLastError=0;
-
- nRead = recvfrom(pSocket->m_Socket,
- (sal_Char*)pBuffer,
- BufferSize,
- MSG_FLAG_TO_NATIVE(Flag),
- pSystemSockAddr,
- PTR_SIZE_T(AddrLen));
-
- if ( nRead < 0 )
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("osl_receiveFromSocket failed : %i '%s'",nRead,strerror(errno));
- }
- else if ( nRead == 0 )
- {
- OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,"EOL");
- }
-
- return nRead;
-}
-
-
-/*****************************************************************************/
-/* osl_sendSocket */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_sendSocket(oslSocket pSocket,
- const void* pBuffer,
- sal_uInt32 BytesToSend,
- oslSocketMsgFlag Flag)
-{
- int nWritten;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- OSL_TRACE("osl_sendSocket : Invalid socket");
- return -1;
- }
-
- pSocket->m_nLastError=0;
-
- do
- {
- nWritten = send(pSocket->m_Socket,
- (sal_Char*)pBuffer,
- BytesToSend,
- MSG_FLAG_TO_NATIVE(Flag));
- } while ( nWritten < 0 && errno == EINTR );
-
-
- if ( nWritten < 0 )
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,strerror(errno));
- }
- else if ( nWritten == 0 )
- {
- OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,"EOL");
- }
-
- return nWritten;
-}
-
-/*****************************************************************************/
-/* osl_sendToSocket */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_sendToSocket(oslSocket pSocket,
- oslSocketAddr ReceiverAddr,
- const void* pBuffer,
- sal_uInt32 BytesToSend,
- oslSocketMsgFlag Flag)
-{
- int nWritten;
-
- struct sockaddr *pSystemSockAddr = 0;
- int AddrLen = 0;
- if( ReceiverAddr )
- {
- pSystemSockAddr = &(ReceiverAddr->m_sockaddr);
- AddrLen = sizeof( struct sockaddr );
- }
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- OSL_TRACE("osl_sendToSocket : Invalid socket");
- return -1;
- }
-
- pSocket->m_nLastError=0;
-
- /* ReceiverAddr might be 0 when used on a connected socket. */
- /* Then sendto should behave like send. */
-
- nWritten = sendto(pSocket->m_Socket,
- (sal_Char*)pBuffer,
- BytesToSend,
- MSG_FLAG_TO_NATIVE(Flag),
- pSystemSockAddr,
- AddrLen);
-
- if ( nWritten < 0 )
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,strerror(errno));
- }
- else if ( nWritten == 0 )
- {
- OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,"EOL");
- }
-
- return nWritten;
-}
-
-/*****************************************************************************/
-/* osl_readSocket */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_readSocket (
- oslSocket pSocket, void *pBuffer, sal_Int32 n )
-{
- sal_uInt8 * Ptr = (sal_uInt8 *)pBuffer;
- sal_uInt32 BytesRead= 0;
- sal_uInt32 BytesToRead= n;
-
- OSL_ASSERT( pSocket);
-
- /* loop until all desired bytes were read or an error occurred */
- while (BytesToRead > 0)
- {
- sal_Int32 RetVal;
- RetVal= osl_receiveSocket(pSocket,
- Ptr,
- BytesToRead,
- osl_Socket_MsgNormal);
-
- /* error occurred? */
- if(RetVal <= 0)
- {
- break;
- }
-
- BytesToRead -= RetVal;
- BytesRead += RetVal;
- Ptr += RetVal;
- }
-
- return BytesRead;
-}
-
-/*****************************************************************************/
-/* osl_writeSocket */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_writeSocket(
- oslSocket pSocket, const void *pBuffer, sal_Int32 n )
-{
- /* loop until all desired bytes were send or an error occurred */
- sal_uInt32 BytesSend= 0;
- sal_uInt32 BytesToSend= n;
- sal_uInt8 *Ptr = ( sal_uInt8 * )pBuffer;
-
- OSL_ASSERT( pSocket );
-
- while (BytesToSend > 0)
- {
- sal_Int32 RetVal;
-
- RetVal= osl_sendSocket( pSocket,Ptr,BytesToSend,osl_Socket_MsgNormal);
-
- /* error occurred? */
- if(RetVal <= 0)
- {
- break;
- }
-
- BytesToSend -= RetVal;
- BytesSend += RetVal;
- Ptr += RetVal;
-
- }
- return BytesSend;
-}
-
-/*****************************************************************************/
-/* __osl_socket_poll */
-/*****************************************************************************/
-
-#ifdef HAVE_POLL_H /* poll() */
-
-sal_Bool __osl_socket_poll (
- oslSocket pSocket,
- const TimeValue* pTimeout,
- short nEvent)
-{
- struct pollfd fds;
- int timeout;
- int result;
-
- OSL_ASSERT(pSocket);
- pSocket->m_nLastError = 0;
-
- fds.fd = pSocket->m_Socket;
- fds.events = nEvent;
- fds.revents = 0;
-
- timeout = -1;
- if (pTimeout)
- {
- /* Convert to [ms] */
- timeout = pTimeout->Seconds * 1000;
- timeout += pTimeout->Nanosec / (1000 * 1000);
- }
-
- result = poll (&fds, 1, timeout);
- if (result < 0)
- {
- pSocket->m_nLastError = errno;
- OSL_TRACE("__osl_socket_poll(): poll error: %d (%s)",
- errno, strerror(errno));
- return sal_False;
- }
- if (result == 0)
- {
- /* Timeout */
- return sal_False;
- }
-
- return ((fds.revents & nEvent) == nEvent);
-}
-
-#else /* select() */
-
-sal_Bool __osl_socket_poll (
- oslSocket pSocket,
- const TimeValue* pTimeout,
- short nEvent)
-{
- fd_set fds;
- struct timeval tv;
- int result;
-
- OSL_ASSERT(pSocket);
- pSocket->m_nLastError = 0;
-
- FD_ZERO(&fds);
- FD_SET(pSocket->m_Socket, &fds);
-
- if (pTimeout)
- {
- /* Convert to 'timeval' */
- tv.tv_sec = pTimeout->Seconds;
- tv.tv_usec = pTimeout->Nanosec / 1000;
- }
-
- result = select (
- pSocket->m_Socket + 1,
- (nEvent == POLLIN ) ? PTR_FD_SET(fds) : NULL,
- (nEvent == POLLOUT) ? PTR_FD_SET(fds) : NULL,
- (nEvent == POLLPRI) ? PTR_FD_SET(fds) : NULL,
- (pTimeout) ? &tv : NULL);
-
- if (result < 0)
- {
- pSocket->m_nLastError = errno;
- OSL_TRACE("__osl_socket_poll(): select error: %d (%s)",
- errno, strerror(errno));
- return sal_False;
- }
- if (result == 0)
- {
- /* Timeout */
- return sal_False;
- }
-
- return (FD_ISSET(pSocket->m_Socket, &fds) ? sal_True : sal_False);
-}
-
-#endif /* HAVE_POLL_H */
-
-/*****************************************************************************/
-/* osl_isReceiveReady */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_isReceiveReady (
- oslSocket pSocket, const TimeValue* pTimeout)
-{
- OSL_ASSERT(pSocket);
- if (pSocket == NULL)
- {
- /* ENOTSOCK */
- return sal_False;
- }
-
- return __osl_socket_poll (pSocket, pTimeout, POLLIN);
-}
-
-/*****************************************************************************/
-/* osl_isSendReady */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_isSendReady (
- oslSocket pSocket, const TimeValue* pTimeout)
-{
- OSL_ASSERT(pSocket);
- if (pSocket == NULL)
- {
- /* ENOTSOCK */
- return sal_False;
- }
-
- return __osl_socket_poll (pSocket, pTimeout, POLLOUT);
-}
-
-/*****************************************************************************/
-/* osl_isExceptionPending */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_isExceptionPending (
- oslSocket pSocket, const TimeValue* pTimeout)
-{
- OSL_ASSERT(pSocket);
- if (pSocket == NULL)
- {
- /* ENOTSOCK */
- return sal_False;
- }
-
- return __osl_socket_poll (pSocket, pTimeout, POLLPRI);
-}
-
-/*****************************************************************************/
-/* osl_shutdownSocket */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_shutdownSocket(oslSocket pSocket,
- oslSocketDirection Direction)
-{
- int nRet;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return sal_False;
- }
-
- pSocket->m_nLastError=0;
-
- nRet=shutdown(pSocket->m_Socket, DIRECTION_TO_NATIVE(Direction));
- if (nRet != 0 )
- {
- pSocket->m_nLastError=errno;
- OSL_TRACE("shutdown error '%s'\n",strerror(errno));
- }
- return (nRet==0);
-}
-
-
-/*****************************************************************************/
-/* osl_getSocketOption */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_getSocketOption(oslSocket pSocket,
- oslSocketOptionLevel Level,
- oslSocketOption Option,
- void* pBuffer,
- sal_uInt32 BufferLen)
-{
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return -1;
- }
-
- pSocket->m_nLastError=0;
-
- if(getsockopt(pSocket->m_Socket,
- OPTION_LEVEL_TO_NATIVE(Level),
- OPTION_TO_NATIVE(Option),
- (sal_Char*)pBuffer,
- (int*)PTR_SIZE_T(BufferLen)) == -1)
- {
- pSocket->m_nLastError=errno;
- return -1;
- }
-
- return BufferLen;
-}
-
-/*****************************************************************************/
-/* osl_setSocketOption */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_setSocketOption(oslSocket pSocket,
- oslSocketOptionLevel Level,
- oslSocketOption Option,
- void* pBuffer,
- sal_uInt32 BufferLen)
-{
- int nRet;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return sal_False;
- }
-
- pSocket->m_nLastError=0;
-
- nRet = setsockopt(pSocket->m_Socket,
- OPTION_LEVEL_TO_NATIVE(Level),
- OPTION_TO_NATIVE(Option),
- (sal_Char*)pBuffer,
- BufferLen);
-
- if ( nRet < 0 )
- {
- pSocket->m_nLastError=errno;
- return sal_False;
- }
-
- return sal_True;
-}
-
-/*****************************************************************************/
-/* osl_enableNonBlockingMode */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_enableNonBlockingMode(oslSocket pSocket,
- sal_Bool On)
-{
- int flags;
- int nRet;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return sal_False;
- }
-
- pSocket->m_nLastError=0;
-
- flags = fcntl(pSocket->m_Socket, F_GETFL, 0);
-
- if (On)
- flags |= O_NONBLOCK;
- else
- flags &= ~(O_NONBLOCK);
-
- nRet = fcntl(pSocket->m_Socket, F_SETFL, flags);
-
- if ( nRet < 0 )
- {
- pSocket->m_nLastError=errno;
- return sal_False;
- }
-
- return sal_True;
-}
-
-/*****************************************************************************/
-/* osl_isNonBlockingMode */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_isNonBlockingMode(oslSocket pSocket)
-{
- int flags;
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return sal_False;
- }
-
- pSocket->m_nLastError=0;
-
- flags = fcntl(pSocket->m_Socket, F_GETFL, 0);
-
- if (flags == -1 || !(flags & O_NONBLOCK))
- return sal_False;
- else
- return sal_True;
-}
-
-/*****************************************************************************/
-/* osl_getSocketType */
-/*****************************************************************************/
-oslSocketType SAL_CALL osl_getSocketType(oslSocket pSocket)
-{
- int Type=0;
- sal_uInt32 TypeSize= sizeof(Type);
-
- OSL_ASSERT(pSocket);
- if ( pSocket == 0 )
- {
- return osl_Socket_TypeInvalid;
- }
-
- pSocket->m_nLastError=0;
-
- if(getsockopt(pSocket->m_Socket,
- OPTION_LEVEL_TO_NATIVE(osl_Socket_LevelSocket),
- OPTION_TO_NATIVE(osl_Socket_OptionType),
- (sal_Char*)&Type,
- (int*)PTR_SIZE_T(TypeSize)) == -1)
- {
- /* error */
- pSocket->m_nLastError=errno;
- return osl_Socket_TypeInvalid;
- }
-
- return TYPE_FROM_NATIVE(Type);
-
-}
-
-/*****************************************************************************/
-/* osl_getLastSocketErrorDescription */
-/*****************************************************************************/
-void SAL_CALL osl_getLastSocketErrorDescription(oslSocket Socket, rtl_uString **ustrError)
-{
- sal_Char pszError[1024];
-
- pszError[0] = '\0';
-
- osl_psz_getLastSocketErrorDescription(Socket,pszError,sizeof(pszError));
-
- rtl_uString_newFromAscii(ustrError,pszError);
-
- return;
-}
-
-
-void SAL_CALL osl_psz_getLastSocketErrorDescription(oslSocket pSocket, sal_Char* pBuffer, sal_uInt32 BufferSize)
-{
- /* make shure pBuffer will be a zero-terminated string even when strncpy has to cut */
- pBuffer[BufferSize-1]= '\0';
-
- if ( pSocket == 0 )
- {
- strncpy(pBuffer, strerror(EINVAL), BufferSize-1);
- return;
- }
-
- strncpy(pBuffer, strerror(pSocket->m_nLastError), BufferSize-1);
- return;
-}
-
-/*****************************************************************************/
-/* osl_getLastSocketError */
-/*****************************************************************************/
-oslSocketError SAL_CALL osl_getLastSocketError(oslSocket pSocket)
-{
- if ( pSocket == 0 )
- {
- return ERROR_FROM_NATIVE(EINVAL);
- }
-
- return ERROR_FROM_NATIVE(pSocket->m_nLastError);
-}
-
-/*****************************************************************************/
-/* SocketSet */
-/*****************************************************************************/
-typedef struct _TSocketSetImpl
-{
- int m_MaxHandle; /* for select(), the largest descriptor in the set */
- fd_set m_Set; /* the set of descriptors */
-
-} TSocketSetImpl;
-
-/*****************************************************************************/
-/* osl_createSocketSet */
-/*****************************************************************************/
-oslSocketSet SAL_CALL osl_createSocketSet()
-{
- TSocketSetImpl* pSet;
-
- pSet= (TSocketSetImpl*)malloc(sizeof(TSocketSetImpl));
-
- OSL_ASSERT(pSet);
-
- if(pSet)
- {
- pSet->m_MaxHandle= 0;
- FD_ZERO(&pSet->m_Set);
- }
-
- return (oslSocketSet)pSet;
-}
-
-/*****************************************************************************/
-/* osl_destroySocketSet */
-/*****************************************************************************/
-void SAL_CALL osl_destroySocketSet(oslSocketSet Set)
-{
- if(Set)
- free(Set);
-}
-
-/*****************************************************************************/
-/* osl_clearSocketSet */
-/*****************************************************************************/
-void SAL_CALL osl_clearSocketSet(oslSocketSet Set)
-{
- TSocketSetImpl* pSet;
- OSL_ASSERT(Set);
- if ( Set == 0 )
- {
- return;
- }
-
- pSet= (TSocketSetImpl*)Set;
- pSet->m_MaxHandle= 0;
-
- FD_ZERO(&pSet->m_Set);
-}
-
-/*****************************************************************************/
-/* osl_addToSocketSet */
-/*****************************************************************************/
-void SAL_CALL osl_addToSocketSet(oslSocketSet Set, oslSocket pSocket)
-{
- TSocketSetImpl* pSet;
-
- OSL_ASSERT(Set);
- OSL_ASSERT(pSocket);
-
- if ( Set == 0 || pSocket == 0)
- {
- return;
- }
-
- pSet= (TSocketSetImpl*)Set;
-
- /* correct max handle */
- if(pSocket->m_Socket > pSet->m_MaxHandle)
- pSet->m_MaxHandle= pSocket->m_Socket;
- FD_SET(pSocket->m_Socket, &pSet->m_Set);
-
-}
-
-/*****************************************************************************/
-/* osl_removeFromSocketSet */
-/*****************************************************************************/
-void SAL_CALL osl_removeFromSocketSet(oslSocketSet Set, oslSocket pSocket)
-{
- TSocketSetImpl* pSet;
-
- OSL_ASSERT(Set);
- OSL_ASSERT(pSocket);
-
- if ( Set == 0 || pSocket == 0)
- {
- return;
- }
-
- pSet= (TSocketSetImpl*)Set;
-
- /* correct max handle */
- if(pSocket->m_Socket == pSet->m_MaxHandle)
- {
- /* not optimal, since the next used descriptor might be */
- /* much smaller than m_Socket-1, but it will do */
- pSet->m_MaxHandle--;
- if(pSet->m_MaxHandle < 0)
- {
- pSet->m_MaxHandle= 0; /* avoid underflow */
- }
- }
-
- FD_CLR(pSocket->m_Socket, &pSet->m_Set);
-}
-
-/*****************************************************************************/
-/* osl_isInSocketSet */
-/*****************************************************************************/
-sal_Bool SAL_CALL osl_isInSocketSet(oslSocketSet Set, oslSocket pSocket)
-{
- TSocketSetImpl* pSet;
-
- OSL_ASSERT(Set);
- OSL_ASSERT(pSocket);
- if ( Set == 0 || pSocket == 0 )
- {
- return sal_False;
- }
-
- pSet= (TSocketSetImpl*)Set;
-
- return (FD_ISSET(pSocket->m_Socket, &pSet->m_Set) != 0);
-}
-
-/*****************************************************************************/
-/* osl_demultiplexSocketEvents */
-/*****************************************************************************/
-sal_Int32 SAL_CALL osl_demultiplexSocketEvents(oslSocketSet IncomingSet,
- oslSocketSet OutgoingSet,
- oslSocketSet OutOfBandSet,
- const TimeValue* pTimeout)
-{
- int MaxHandle= 0;
- struct timeval tv;
- TSocketSetImpl* pInSet;
- TSocketSetImpl* pOutSet;
- TSocketSetImpl* pOOBSet;
-
- if (pTimeout)
- {
- /* non-blocking call */
- tv.tv_sec = pTimeout->Seconds;
- tv.tv_usec = pTimeout->Nanosec / 1000L;
- }
-
- /* map opaque data to impl-types */
- pInSet= (TSocketSetImpl*)IncomingSet;
- pOutSet= (TSocketSetImpl*)OutgoingSet;
- pOOBSet= (TSocketSetImpl*)OutOfBandSet;
-
- /* get max handle from all sets */
- if (pInSet)
- MaxHandle= pInSet->m_MaxHandle;
-
- if (pOutSet && (pOutSet->m_MaxHandle > MaxHandle))
- MaxHandle= pOutSet->m_MaxHandle;
-
- if (pOOBSet && (pOOBSet->m_MaxHandle > MaxHandle))
- MaxHandle= pOOBSet->m_MaxHandle;
-
- return select(MaxHandle+1,
- pInSet ? PTR_FD_SET(pInSet->m_Set) : 0,
- pOutSet ? PTR_FD_SET(pOutSet->m_Set) : 0,
- pOOBSet ? PTR_FD_SET(pOOBSet->m_Set) : 0,
- pTimeout ? &tv : 0);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */