miniupnpc: use SOCKET type instead of int for copilation under Win64

see #289
This commit is contained in:
Thomas Bernard 2018-04-06 12:21:36 +02:00
parent 82ec7bc3df
commit 284db0bb49
13 changed files with 111 additions and 59 deletions

View File

@ -1,6 +1,9 @@
$Id: Changelog.txt,v 1.229 2017/12/12 11:26:25 nanard Exp $
miniUPnP client Changelog.
2018/04/06:
Use SOCKET type instead of int (for Win64 compilation)
2018/02/22:
Disable usage of MiniSSDPd when using -m option

View File

@ -1,7 +1,8 @@
/* $Id: connecthostport.c,v 1.15 2015/10/09 16:26:19 nanard Exp $ */
/* Project : miniupnp
/* vim: tabstop=4 shiftwidth=4 noexpandtab
* Project : miniupnp
* Author : Thomas Bernard
* Copyright (c) 2010-2017 Thomas Bernard
* Copyright (c) 2010-2018 Thomas Bernard
* This software is subject to the conditions detailed in the
* LICENCE file provided in this distribution. */
@ -60,10 +61,11 @@
/* connecthostport()
* return a socket connected (TCP) to the host and port
* or -1 in case of error */
int connecthostport(const char * host, unsigned short port,
unsigned int scope_id)
SOCKET connecthostport(const char * host, unsigned short port,
unsigned int scope_id)
{
int s, n;
SOCKET s;
int n;
#ifdef USE_GETHOSTBYNAME
struct sockaddr_in dest;
struct hostent *hp;
@ -82,15 +84,15 @@ int connecthostport(const char * host, unsigned short port,
if(hp == NULL)
{
herror(host);
return -1;
return INVALID_SOCKET;
}
memcpy(&dest.sin_addr, hp->h_addr, sizeof(dest.sin_addr));
memset(dest.sin_zero, 0, sizeof(dest.sin_zero));
s = socket(PF_INET, SOCK_STREAM, 0);
if(s < 0)
if(ISINVALID(s))
{
PRINT_SOCKET_ERROR("socket");
return -1;
return INVALID_SOCKET;
}
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
/* setting a 3 seconds timeout for the connect() call */
@ -129,7 +131,7 @@ int connecthostport(const char * host, unsigned short port,
if(getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) {
PRINT_SOCKET_ERROR("getsockopt");
closesocket(s);
return -1;
return INVALID_SOCKET;
}
if(err != 0) {
errno = err;
@ -141,7 +143,7 @@ int connecthostport(const char * host, unsigned short port,
{
PRINT_SOCKET_ERROR("connect");
closesocket(s);
return -1;
return INVALID_SOCKET;
}
#else /* #ifdef USE_GETHOSTBYNAME */
/* use getaddrinfo() instead of gethostbyname() */
@ -179,13 +181,13 @@ int connecthostport(const char * host, unsigned short port,
#else
fprintf(stderr, "getaddrinfo() error : %s\n", gai_strerror(n));
#endif
return -1;
return INVALID_SOCKET;
}
s = -1;
for(p = ai; p; p = p->ai_next)
{
s = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if(s < 0)
if(ISINVALID(s))
continue;
if(p->ai_addr->sa_family == AF_INET6 && scope_id > 0) {
struct sockaddr_in6 * addr6 = (struct sockaddr_in6 *)p->ai_addr;
@ -227,7 +229,7 @@ int connecthostport(const char * host, unsigned short port,
PRINT_SOCKET_ERROR("getsockopt");
closesocket(s);
freeaddrinfo(ai);
return -1;
return INVALID_SOCKET;
}
if(err != 0) {
errno = err;
@ -246,15 +248,15 @@ int connecthostport(const char * host, unsigned short port,
}
}
freeaddrinfo(ai);
if(s < 0)
if(ISINVALID(s))
{
PRINT_SOCKET_ERROR("socket");
return -1;
return INVALID_SOCKET;
}
if(n < 0)
{
PRINT_SOCKET_ERROR("connect");
return -1;
return INVALID_SOCKET;
}
#endif /* #ifdef USE_GETHOSTBYNAME */
return s;

View File

@ -2,17 +2,19 @@
/* Project: miniupnp
* http://miniupnp.free.fr/
* Author: Thomas Bernard
* Copyright (c) 2010-2012 Thomas Bernard
* Copyright (c) 2010-2018 Thomas Bernard
* This software is subjects to the conditions detailed
* in the LICENCE file provided within this distribution */
#ifndef CONNECTHOSTPORT_H_INCLUDED
#define CONNECTHOSTPORT_H_INCLUDED
#include "miniupnpc_socketdef.h"
/* connecthostport()
* return a socket connected (TCP) to the host and port
* or -1 in case of error */
int connecthostport(const char * host, unsigned short port,
unsigned int scope_id);
* or INVALID_SOCKET in case of error */
SOCKET connecthostport(const char * host, unsigned short port,
unsigned int scope_id);
#endif

View File

@ -34,7 +34,7 @@
/* httpWrite sends the headers and the body to the socket
* and returns the number of bytes sent */
static int
httpWrite(int fd, const char * body, int bodysize,
httpWrite(SOCKET fd, const char * body, int bodysize,
const char * headers, int headerssize)
{
int n = 0;
@ -71,7 +71,7 @@ httpWrite(int fd, const char * body, int bodysize,
}
/* self explanatory */
int soapPostSubmit(int fd,
int soapPostSubmit(SOCKET fd,
const char * url,
const char * host,
unsigned short port,

View File

@ -1,14 +1,16 @@
/* $Id: minisoap.h,v 1.4 2010/04/12 20:39:41 nanard Exp $ */
/* Project : miniupnp
* Author : Thomas Bernard
* Copyright (c) 2005 Thomas Bernard
* Copyright (c) 2005-2018 Thomas Bernard
* This software is subject to the conditions detailed in the
* LICENCE file provided in this distribution. */
#ifndef MINISOAP_H_INCLUDED
#define MINISOAP_H_INCLUDED
#include "miniupnpc_socketdef.h"
/*int httpWrite(int, const char *, int, const char *);*/
int soapPostSubmit(int, const char *, const char *, unsigned short,
int soapPostSubmit(SOCKET, const char *, const char *, unsigned short,
const char *, const char *, const char *);
#endif

View File

@ -3,7 +3,7 @@
* Project : miniupnp
* Web : http://miniupnp.free.fr/
* Author : Thomas BERNARD
* copyright (c) 2005-2017 Thomas Bernard
* copyright (c) 2005-2018 Thomas Bernard
* This software is subjet to the conditions detailed in the
* provided LICENCE file. */
/*#include <syslog.h>*/
@ -20,7 +20,6 @@
#include <ws2tcpip.h>
#include <io.h>
#include <iphlpapi.h>
#include <winsock.h>
#define snprintf _snprintf
#if !defined(_MSC_VER)
#include <stdint.h>
@ -61,11 +60,7 @@ struct sockaddr_un {
#define closesocket close
#endif
#ifdef _WIN32
#define PRINT_SOCKET_ERROR(x) fprintf(stderr, "Socket error: %s, %d\n", x, WSAGetLastError());
#else
#define PRINT_SOCKET_ERROR(x) perror(x)
#endif
#include "miniupnpc_socketdef.h"
#if !defined(__DragonFly__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__sun) && !defined(__GNU__) && !defined(__FreeBSD_kernel__)
#define HAS_IP_MREQN
@ -488,7 +483,7 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
"\r\n";
int deviceIndex;
char bufr[1536]; /* reception and emission buffer */
int sudp;
SOCKET sudp;
int n;
struct sockaddr_storage sockudp_r;
unsigned int mx;
@ -516,7 +511,7 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
#else
sudp = socket(ipv6 ? PF_INET6 : PF_INET, SOCK_DGRAM, 0);
#endif
if(sudp < 0)
if(ISINVALID(sudp))
{
if(error)
*error = MINISSDPC_SOCKET_ERROR;

View File

@ -56,6 +56,7 @@
#include "miniupnpc.h"
#include "minissdpc.h"
#include "miniwget.h"
#include "miniwget_private.h"
#include "minisoap.h"
#include "minixml.h"
#include "upnpcommands.h"
@ -114,9 +115,10 @@ MINIUPNP_LIBSPEC void parserootdesc(const char * buffer, int bufsize, struct IGD
* return values :
* pointer - OK
* NULL - error */
char * simpleUPnPcommand2(int s, const char * url, const char * service,
const char * action, struct UPNParg * args,
int * bufsize, const char * httpversion)
static char *
simpleUPnPcommand2(SOCKET s, const char * url, const char * service,
const char * action, struct UPNParg * args,
int * bufsize, const char * httpversion)
{
char hostname[MAXHOSTNAMELEN+1];
unsigned short port = 0;
@ -213,9 +215,9 @@ char * simpleUPnPcommand2(int s, const char * url, const char * service,
return NULL;
}
if(!parseURL(url, hostname, &port, &path, NULL)) return NULL;
if(s < 0) {
if(ISINVALID(s)) {
s = connecthostport(hostname, port, 0);
if(s < 0) {
if(ISINVALID(s)) {
/* failed to connect */
return NULL;
}
@ -250,22 +252,23 @@ char * simpleUPnPcommand2(int s, const char * url, const char * service,
* return values :
* pointer - OK
* NULL - error */
char * simpleUPnPcommand(int s, const char * url, const char * service,
const char * action, struct UPNParg * args,
int * bufsize)
char *
simpleUPnPcommand(int s, const char * url, const char * service,
const char * action, struct UPNParg * args,
int * bufsize)
{
char * buf;
#if 1
buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.1");
buf = simpleUPnPcommand2((SOCKET)s, url, service, action, args, bufsize, "1.1");
#else
buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.0");
buf = simpleUPnPcommand2((SOCKET)s, url, service, action, args, bufsize, "1.0");
if (!buf || *bufsize == 0)
{
#if DEBUG
printf("Error or no result from SOAP request; retrying with HTTP/1.1\n");
#endif
buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.1");
buf = simpleUPnPcommand2((SOCKET)s, url, service, action, args, bufsize, "1.1");
}
#endif
return buf;

View File

@ -0,0 +1,37 @@
/* $Id: miniupnpc_socketdef.h,v 1.1 2018/03/13 23:44:10 nanard Exp $ */
/* Miniupnp project : http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/
* Author : Thomas Bernard
* Copyright (c) 2018 Thomas Bernard
* This software is subject to the conditions detailed in the
* LICENCE file provided within this distribution */
#ifndef MINIUPNPC_SOCKETDEF_H_INCLUDED
#define MINIUPNPC_SOCKETDEF_H_INCLUDED
#ifdef _MSC_VER
#define ISINVALID(s) (INVALID_SOCKET==(s))
#else
#ifndef SOCKET
#define SOCKET int
#endif
#ifndef SSIZE_T
#define SSIZE_T ssize_t
#endif
#ifndef INVALID_SOCKET
#define INVALID_SOCKET (-1)
#endif
#ifndef ISINVALID
#define ISINVALID(s) ((s)<0)
#endif
#endif
#ifdef _WIN32
#define PRINT_SOCKET_ERROR(x) fprintf(stderr, "Socket error: %s, %d\n", x, WSAGetLastError());
#else
#define PRINT_SOCKET_ERROR(x) perror(x)
#endif
#endif /* MINIUPNPC_SOCKETDEF_H_INCLUDED */

View File

@ -65,7 +65,7 @@
* to the length parameter.
*/
void *
getHTTPResponse(int s, int * size, int * status_code)
getHTTPResponse(SOCKET s, int * size, int * status_code)
{
char buf[2048];
int n;
@ -371,7 +371,7 @@ miniwget3(const char * host,
int * status_code)
{
char buf[2048];
int s;
SOCKET s;
int n;
int len;
int sent;
@ -379,7 +379,7 @@ miniwget3(const char * host,
*size = 0;
s = connecthostport(host, port, scope_id);
if(s < 0)
if(ISINVALID(s))
return NULL;
/* get address for caller ! */

View File

@ -14,8 +14,6 @@
extern "C" {
#endif
MINIUPNP_LIBSPEC void * getHTTPResponse(int s, int * size, int * status_code);
MINIUPNP_LIBSPEC void * miniwget(const char *, int *, unsigned int, int *);
MINIUPNP_LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int, int *);
@ -27,4 +25,3 @@ int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *);
#endif
#endif

View File

@ -0,0 +1,15 @@
/* $Id: miniwget_private.h,v 1.1 2018/04/06 10:17:58 nanard Exp $ */
/* Project : miniupnp
* Author : Thomas Bernard
* Copyright (c) 2018 Thomas Bernard
* This software is subject to the conditions detailed in the
* LICENCE file provided in this distribution.
* */
#ifndef MINIWGET_INTERNAL_H_INCLUDED
#define MINIWGET_INTERNAL_H_INCLUDED
#include "miniupnpc_socketdef.h"
void * getHTTPResponse(SOCKET s, int * size, int * status_code);
#endif

View File

@ -27,16 +27,10 @@
#define MINIUPNPC_IGNORE_EINTR
#endif /* _WIN32 */
#ifdef _WIN32
#define PRINT_SOCKET_ERROR(x) fprintf(stderr, "Socket error: %s, %d\n", x, WSAGetLastError());
#else
#define PRINT_SOCKET_ERROR(x) perror(x)
#endif
#include "receivedata.h"
int
receivedata(int socket,
receivedata(SOCKET socket,
char * data, int length,
int timeout, unsigned int * scope_id)
{

View File

@ -2,16 +2,18 @@
/* Project: miniupnp
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* Author: Thomas Bernard
* Copyright (c) 2011-2012 Thomas Bernard
* Copyright (c) 2011-2018 Thomas Bernard
* This software is subjects to the conditions detailed
* in the LICENCE file provided within this distribution */
#ifndef RECEIVEDATA_H_INCLUDED
#define RECEIVEDATA_H_INCLUDED
#include "miniupnpc_socketdef.h"
/* Reads data from the specified socket.
* Returns the number of bytes read if successful, zero if no bytes were
* read or if we timed out. Returns negative if there was an error. */
int receivedata(int socket,
int receivedata(SOCKET socket,
char * data, int length,
int timeout, unsigned int * scope_id);