Annotation of embedaddon/miniupnpc/receivedata.c, revision 1.1
1.1 ! misho 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:
! 35: int
! 36: receivedata(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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>