Annotation of embedaddon/miniupnpd/miniupnpc/src/receivedata.c, revision 1.1.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>