File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / miniupnpd / miniupnpc / src / receivedata.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Sep 27 11:25:11 2023 UTC (18 months, 1 week ago) by misho
Branches: miniupnpd, MAIN
CVS tags: v2_3_3p0, HEAD
Version 2.3.3p0

    1: /* $Id: receivedata.c,v 1.1.1.1 2023/09/27 11:25:11 misho 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>