/thirdparty/libportfwd/third-party/miniupnpc-1.6/receivedata.c
C | 81 lines | 66 code | 6 blank | 9 comment | 15 complexity | 2ef587faa05f988c674b2a5708030ea9 MD5 | raw file
1/* $Id: receivedata.c,v 1.1 2011/04/11 08:21:47 nanard Exp $ */ 2/* Project : miniupnp 3 * Author : Thomas Bernard 4 * Copyright (c) 2011 Thomas Bernard 5 * This software is subject to the conditions detailed in the 6 * LICENCE file provided in this distribution. */ 7 8#include <stdio.h> 9#ifdef WIN32 10#include <winsock2.h> 11#include <ws2tcpip.h> 12#else 13#include <unistd.h> 14#if defined(__amigaos__) && !defined(__amigaos4__) 15#define socklen_t int 16#else /* #if defined(__amigaos__) && !defined(__amigaos4__) */ 17#include <sys/select.h> 18#endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */ 19#include <sys/socket.h> 20#if !defined(__amigaos__) && !defined(__amigaos4__) 21#include <poll.h> 22#endif 23#include <errno.h> 24#define MINIUPNPC_IGNORE_EINTR 25#endif 26 27#ifdef WIN32 28#define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError()); 29#else 30#define PRINT_SOCKET_ERROR(x) perror(x) 31#endif 32 33#include "receivedata.h" 34 35int 36receivedata(int socket, char * data, int length, int timeout) 37{ 38 int n; 39#if !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) 40 /* using poll */ 41 struct pollfd fds[1]; /* for the poll */ 42#ifdef MINIUPNPC_IGNORE_EINTR 43 do { 44#endif 45 fds[0].fd = socket; 46 fds[0].events = POLLIN; 47 n = poll(fds, 1, timeout); 48#ifdef MINIUPNPC_IGNORE_EINTR 49 } while(n < 0 && errno == EINTR); 50#endif 51 if(n < 0) { 52 PRINT_SOCKET_ERROR("poll"); 53 return -1; 54 } else if(n == 0) { 55 /* timeout */ 56 return 0; 57 } 58#else /* !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */ 59 /* using select under WIN32 and amigaos */ 60 fd_set socketSet; 61 TIMEVAL timeval; 62 FD_ZERO(&socketSet); 63 FD_SET(socket, &socketSet); 64 timeval.tv_sec = timeout / 1000; 65 timeval.tv_usec = (timeout % 1000) * 1000; 66 n = select(FD_SETSIZE, &socketSet, NULL, NULL, &timeval); 67 if(n < 0) { 68 PRINT_SOCKET_ERROR("select"); 69 return -1; 70 } else if(n == 0) { 71 return 0; 72 } 73#endif 74 n = recv(socket, data, length, 0); 75 if(n<0) { 76 PRINT_SOCKET_ERROR("recv"); 77 } 78 return n; 79} 80 81