Annotation of embedaddon/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>