Annotation of embedaddon/miniupnpc/src/receivedata.c, revision 1.1
1.1 ! misho 1: /* $Id: receivedata.c,v 1.10 2021/03/02 23:33:07 nanard Exp $ */
! 2: /* Project : miniupnp
! 3: * Website : http://miniupnp.free.fr/
! 4: * Author : Thomas Bernard
! 5: * Copyright (c) 2011-2021 Thomas Bernard
! 6: * This software is subject to the conditions detailed in the
! 7: * LICENCE file provided in this distribution. */
! 8:
! 9: #include <stdio.h>
! 10: #include <string.h>
! 11: #ifdef _WIN32
! 12: #include <winsock2.h>
! 13: #include <ws2tcpip.h>
! 14: #else /* _WIN32 */
! 15: #include <unistd.h>
! 16: #if defined(__amigaos__) && !defined(__amigaos4__)
! 17: #define socklen_t int
! 18: #else /* #if defined(__amigaos__) && !defined(__amigaos4__) */
! 19: #include <sys/select.h>
! 20: #endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */
! 21: #include <sys/socket.h>
! 22: #include <netinet/in.h>
! 23: #if !defined(__amigaos__) && !defined(__amigaos4__)
! 24: #include <poll.h>
! 25: #endif /* !defined(__amigaos__) && !defined(__amigaos4__) */
! 26: #include <errno.h>
! 27: #define MINIUPNPC_IGNORE_EINTR
! 28: #endif /* _WIN32 */
! 29:
! 30: #include "receivedata.h"
! 31:
! 32: int
! 33: receivedata(SOCKET socket,
! 34: char * data, int length,
! 35: int timeout, unsigned int * scope_id)
! 36: {
! 37: #ifdef MINIUPNPC_GET_SRC_ADDR
! 38: struct sockaddr_storage src_addr;
! 39: socklen_t src_addr_len = sizeof(src_addr);
! 40: #endif /* MINIUPNPC_GET_SRC_ADDR */
! 41: int n;
! 42: #if !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__)
! 43: /* using poll */
! 44: struct pollfd fds[1]; /* for the poll */
! 45: #ifdef MINIUPNPC_IGNORE_EINTR
! 46: do {
! 47: #endif /* MINIUPNPC_IGNORE_EINTR */
! 48: fds[0].fd = socket;
! 49: fds[0].events = POLLIN;
! 50: n = poll(fds, 1, timeout);
! 51: #ifdef MINIUPNPC_IGNORE_EINTR
! 52: } while(n < 0 && errno == EINTR);
! 53: #endif /* MINIUPNPC_IGNORE_EINTR */
! 54: if(n < 0) {
! 55: PRINT_SOCKET_ERROR("poll");
! 56: return -1;
! 57: } else if(n == 0) {
! 58: /* timeout */
! 59: return 0;
! 60: }
! 61: #else /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */
! 62: /* using select under _WIN32 and amigaos */
! 63: fd_set socketSet;
! 64: TIMEVAL timeval;
! 65: FD_ZERO(&socketSet);
! 66: FD_SET(socket, &socketSet);
! 67: timeval.tv_sec = timeout / 1000;
! 68: timeval.tv_usec = (timeout % 1000) * 1000;
! 69: n = select(FD_SETSIZE, &socketSet, NULL, NULL, &timeval);
! 70: if(n < 0) {
! 71: PRINT_SOCKET_ERROR("select");
! 72: return -1;
! 73: } else if(n == 0) {
! 74: return 0;
! 75: }
! 76: #endif /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */
! 77: #ifdef MINIUPNPC_GET_SRC_ADDR
! 78: memset(&src_addr, 0, sizeof(src_addr));
! 79: n = recvfrom(socket, data, length, 0,
! 80: (struct sockaddr *)&src_addr, &src_addr_len);
! 81: #else /* MINIUPNPC_GET_SRC_ADDR */
! 82: n = recv(socket, data, length, 0);
! 83: #endif /* MINIUPNPC_GET_SRC_ADDR */
! 84: if(n<0) {
! 85: PRINT_SOCKET_ERROR("recv");
! 86: }
! 87: #ifdef MINIUPNPC_GET_SRC_ADDR
! 88: if (src_addr.ss_family == AF_INET6) {
! 89: const struct sockaddr_in6 * src_addr6 = (struct sockaddr_in6 *)&src_addr;
! 90: #ifdef DEBUG
! 91: printf("scope_id=%u\n", src_addr6->sin6_scope_id);
! 92: #endif /* DEBUG */
! 93: if(scope_id)
! 94: *scope_id = src_addr6->sin6_scope_id;
! 95: } else {
! 96: if(scope_id)
! 97: *scope_id = 0;
! 98: }
! 99: #else /* MINIUPNPC_GET_SRC_ADDR */
! 100: if(scope_id)
! 101: *scope_id = 0;
! 102: #endif /* MINIUPNPC_GET_SRC_ADDR */
! 103: return n;
! 104: }
! 105:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>