155682Smarkm/* 2233294Sstas * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska H��gskolan 355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden). 455682Smarkm * All rights reserved. 5233294Sstas * 655682Smarkm * Redistribution and use in source and binary forms, with or without 755682Smarkm * modification, are permitted provided that the following conditions 855682Smarkm * are met: 9233294Sstas * 1055682Smarkm * 1. Redistributions of source code must retain the above copyright 1155682Smarkm * notice, this list of conditions and the following disclaimer. 12233294Sstas * 1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1455682Smarkm * notice, this list of conditions and the following disclaimer in the 1555682Smarkm * documentation and/or other materials provided with the distribution. 16233294Sstas * 1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors 1855682Smarkm * may be used to endorse or promote products derived from this software 1955682Smarkm * without specific prior written permission. 20233294Sstas * 2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2455682Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3155682Smarkm * SUCH DAMAGE. 3255682Smarkm */ 3355682Smarkm 3455682Smarkm#include <config.h> 3555682Smarkm 36178825Sdfr#include "roken.h" 3755682Smarkm 3855682Smarkm/* 3955682Smarkm * Like read but never return partial data. 4055682Smarkm */ 4155682Smarkm 42233294Sstas#ifndef _WIN32 43233294Sstas 44233294SstasROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL 45233294Sstasnet_read (rk_socket_t fd, void *buf, size_t nbytes) 4655682Smarkm{ 4755682Smarkm char *cbuf = (char *)buf; 4855682Smarkm ssize_t count; 4955682Smarkm size_t rem = nbytes; 5055682Smarkm 5155682Smarkm while (rem > 0) { 5255682Smarkm count = read (fd, cbuf, rem); 5355682Smarkm if (count < 0) { 5455682Smarkm if (errno == EINTR) 5555682Smarkm continue; 5655682Smarkm else 5755682Smarkm return count; 5855682Smarkm } else if (count == 0) { 5955682Smarkm return count; 6055682Smarkm } 6155682Smarkm cbuf += count; 6255682Smarkm rem -= count; 6355682Smarkm } 6455682Smarkm return nbytes; 6555682Smarkm} 66233294Sstas 67233294Sstas#else 68233294Sstas 69233294SstasROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL 70233294Sstasnet_read(rk_socket_t sock, void *buf, size_t nbytes) 71233294Sstas{ 72233294Sstas char *cbuf = (char *)buf; 73233294Sstas ssize_t count; 74233294Sstas size_t rem = nbytes; 75233294Sstas 76233294Sstas#ifdef SOCKET_IS_NOT_AN_FD 77233294Sstas int use_read = 0; 78233294Sstas#endif 79233294Sstas 80233294Sstas while (rem > 0) { 81233294Sstas#ifdef SOCKET_IS_NOT_AN_FD 82233294Sstas if (use_read) 83233294Sstas count = _read (sock, cbuf, rem); 84233294Sstas else 85233294Sstas count = recv (sock, cbuf, rem, 0); 86233294Sstas 87233294Sstas if (use_read == 0 && 88233294Sstas rk_IS_SOCKET_ERROR(count) && 89233294Sstas (rk_SOCK_ERRNO == WSANOTINITIALISED || 90233294Sstas rk_SOCK_ERRNO == WSAENOTSOCK)) { 91233294Sstas use_read = 1; 92233294Sstas 93233294Sstas count = _read (sock, cbuf, rem); 94233294Sstas } 95233294Sstas#else 96233294Sstas count = recv (sock, cbuf, rem, 0); 97233294Sstas#endif 98233294Sstas if (count < 0) { 99233294Sstas 100233294Sstas /* With WinSock, the error EINTR (WSAEINTR), is used to 101233294Sstas indicate that a blocking call was cancelled using 102233294Sstas WSACancelBlockingCall(). */ 103233294Sstas 104233294Sstas#ifndef HAVE_WINSOCK 105233294Sstas if (rk_SOCK_ERRNO == EINTR) 106233294Sstas continue; 107233294Sstas#endif 108233294Sstas return count; 109233294Sstas } else if (count == 0) { 110233294Sstas return count; 111233294Sstas } 112233294Sstas cbuf += count; 113233294Sstas rem -= count; 114233294Sstas } 115233294Sstas return nbytes; 116233294Sstas} 117233294Sstas 118233294Sstas#endif 119