7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * IPRT - Network Sockets.
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * Copyright (C) 2006-2013 Oracle Corporation
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * available from http://www.virtualbox.org. This file is free software;
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * you can redistribute it and/or modify it under the terms of the GNU
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * General Public License (GPL) as published by the Free Software
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * The contents of this file may alternatively be used under the terms
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * of the Common Development and Distribution License Version 1.0
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * VirtualBox OSE distribution, in which case the provisions of the
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * CDDL are applicable instead of those of the GPL.
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * You may elect to license modified versions of this file under the
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync * terms and conditions of either the GPL or the CDDL or both.
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync/*******************************************************************************
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync* Header Files *
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync*******************************************************************************/
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync#else /* !RT_OS_WINDOWS */
7a0d67332f33bc21290d63bc7c8150b0cf0a4b21vboxsync#endif /* !RT_OS_WINDOWS */
#ifndef MSG_NOSIGNAL
#ifndef SHUT_RDWR
# ifdef SD_BOTH
#ifndef SHUT_WR
# ifdef SD_SEND
#ifndef SHUT_RD
# ifdef SD_RECEIVE
#ifdef RT_OS_WINDOWS
#ifdef RT_OS_WINDOWS
#ifdef IPRT_WITH_TCPIP_V6
#ifdef RT_OS_WINDOWS
#ifdef RT_OS_WINDOWS
WSASetLastError(0);
errno = 0;
#ifdef RT_OS_WINDOWS
switch (h_errno)
case HOST_NOT_FOUND:
return VERR_NET_HOST_NOT_FOUND;
case NO_DATA:
return VERR_NET_ADDRESS_NOT_AVAILABLE;
case NO_RECOVERY:
return VERR_IO_GEN_FAILURE;
case TRY_AGAIN:
return VERR_TRY_AGAIN;
return VERR_UNRESOLVED_ERROR;
#ifdef IPRT_WITH_TCPIP_V6
return VINF_SUCCESS;
static int rtSocketAddrFromNetAddr(PCRTNETADDR pAddr, RTSOCKADDRUNION *pDst, size_t cbDst, int *pcbAddr)
if (pcbAddr)
#ifdef IPRT_WITH_TCPIP_V6
if (pcbAddr)
return VINF_SUCCESS;
#ifdef RT_OS_WINDOWS
return rtSocketError();
return rtSocketError();
if (fBlocking)
return rtSocketError();
return VINF_SUCCESS;
return VINF_SUCCESS;
if (!pThis)
return VERR_NO_MEMORY;
#ifdef RT_OS_WINDOWS
return VINF_SUCCESS;
#ifndef RT_OS_WINDOWS
return rtSocketError();
#ifdef RT_OS_WINDOWS
return rc;
if (fDestroy)
#ifdef RT_OS_WINDOWS
#ifdef RT_OS_WINDOWS
#ifdef RT_OS_WINDOWS
return rc;
return VINF_SUCCESS;
return rc;
#ifdef RT_OS_WINDOWS
if (!SetHandleInformation((HANDLE)pThis->hNative, HANDLE_FLAG_INHERIT, fInheritable ? HANDLE_FLAG_INHERIT : 0))
return rc;
psz++;
#ifdef RT_OS_WINDOWS
return VERR_NOT_SUPPORTED;
return VINF_SUCCESS;
if (!pHostEnt)
return rc;
Log3(("gethostbyname: %s -> %#x (%RTnaipv4)\n", pszAddress, pAddr->uAddr.IPv4.u, pAddr->uAddr.IPv4));
return VINF_SUCCESS;
RTDECL(int) RTSocketQueryAddressStr(const char *pszHost, char *pszResult, size_t *pcbResult, PRTNETADDRTYPE penmAddrType)
#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS) /** @todo dynamically resolve the APIs not present in NT4! */
return VERR_NOT_SUPPORTED;
int rc;
return VERR_NET_ADDRESS_NOT_AVAILABLE;
if (penmAddrType)
switch (*penmAddrType)
case RTNETADDRTYPE_INVALID:
case RTNETADDRTYPE_IPV4:
case RTNETADDRTYPE_IPV6:
# ifdef RT_OS_WINDOWS
return VERR_NOT_SUPPORTED;
if (rc != 0)
return VERR_NET_ADDRESS_NOT_AVAILABLE;
if (!pgrResults)
return VERR_NET_ADDRESS_NOT_AVAILABLE;
if (!pgrResult)
return VERR_NET_ADDRESS_NOT_AVAILABLE;
cchIpAddress = 0;
return rc;
return rc;
#ifdef RTSOCKET_MAX_READ
if (cbBytesRead <= 0)
if (!pcbRead)
*pcbRead = 0;
if (pcbRead)
return rc;
RTDECL(int) RTSocketReadFrom(RTSOCKET hSocket, void *pvBuffer, size_t cbBuffer, size_t *pcbRead, PRTNETADDR pSrcAddr)
return rc;
#ifdef RTSOCKET_MAX_READ
ssize_t cbBytesRead = recvfrom(pThis->hNative, (char *)pvBuffer + cbRead, cbNow, MSG_NOSIGNAL, &u.Addr, &cbAddr);
if (cbBytesRead <= 0)
*pcbRead = 0;
if (pSrcAddr)
return rc;
return rc;
#ifdef RTSOCKET_MAX_WRITE
else if (cbWritten < 0)
if (!cbBuffer)
#ifdef RTSOCKET_MAX_WRITE
if (cbWritten >= 0)
AssertMsg(cbBuffer >= (size_t)cbWritten, ("Wrote more than we requested!!! cbWritten=%zu cbBuffer=%zu rtSocketError()=%d\n",
cbWritten = 0;
return rc;
RTDECL(int) RTSocketWriteTo(RTSOCKET hSocket, const void *pvBuffer, size_t cbBuffer, PCRTNETADDR pAddr)
return rc;
#ifdef RT_OS_WINDOWS
if (pAddr)
return rc;
cbSA = sizeof(u);
#ifdef RT_OS_WINDOWS
else if (cbWritten < 0)
return rc;
return rc;
#ifdef RT_OS_WINDOWS
if (paMsg)
if (!hrc)
if (paMsg)
return rc;
return rc;
return rc;
#ifdef RTSOCKET_MAX_READ
#ifdef RT_OS_WINDOWS
if (cbRead >= 0)
if (cbRead >= 0)
*pcbRead = 0;
return rc;
RTDECL(int) RTSocketWriteNB(RTSOCKET hSocket, const void *pvBuffer, size_t cbBuffer, size_t *pcbWritten)
return rc;
#ifdef RTSOCKET_MAX_WRITE
#ifdef RT_OS_WINDOWS
if (cbWritten >= 0)
if (cbWritten >= 0)
*pcbWritten = 0;
return rc;
return rc;
#ifdef RT_OS_WINDOWS
if (paMsg)
if (!hrc)
if (paMsg)
return rc;
return rc;
if (rc > 0)
else if (rc == 0)
return rc;
*pfEvents = 0;
if (rc > 0)
else if (rc == 0)
return rc;
else if (fRead)
return rc;
#ifdef RT_OS_WINDOWS
RT_ZERO(u);
return rc;
#ifdef RT_OS_WINDOWS
RT_ZERO(u);
return rc;
return rc;
return rc;
return rc;
#ifdef RT_OS_WINDOWS
#ifdef RT_OS_WINDOWS
return rc;
? NULL
: &TvTimeout);
if (rcSock > 0)
if (rcSock == 0)
if (iSockError == 0)
#ifdef RT_OS_WINDOWS
else if (rcSock == 0)
return rc;
return rc;
#ifdef RT_OS_WINDOWS
return rc;
return VINF_SUCCESS;
#ifdef RT_OS_WINDOWS
if (rc2 != 0)
return rc;
return VINF_SUCCESS;
return rc;
# ifdef RT_OS_WINDOWS
if (rc > 0)
return fRetEvents;
uint32_t rtSocketPollStart(RTSOCKET hSocket, RTPOLLSET hPollSet, uint32_t fEvents, bool fFinalEntry, bool fNoWait)
# ifdef RT_OS_WINDOWS
if ( !fRetEvents
&& !fNoWait)
if ( fFinalEntry
# ifdef RT_OS_WINDOWS
return fRetEvents;
uint32_t rtSocketPollDone(RTSOCKET hSocket, uint32_t fEvents, bool fFinalEntry, bool fHarvestEvents)
# ifdef RT_OS_WINDOWS
if ( !fHarvestEvents
&& fRetEvents)
fRetEvents = 0;
# ifdef RT_OS_WINDOWS
return fRetEvents;