diff --git a/miniupnpc/Changelog.txt b/miniupnpc/Changelog.txt index 08471f5..3e982e1 100644 --- a/miniupnpc/Changelog.txt +++ b/miniupnpc/Changelog.txt @@ -1,6 +1,9 @@ -$Id: Changelog.txt,v 1.166 2012/04/09 12:49:26 nanard Exp $ +$Id: Changelog.txt,v 1.167 2012/04/20 14:13:10 nanard Exp $ miniUPnP client Changelog. +2012/04/20: + Allow to specify protocol with TCP or UDP for -A option + 2012/04/09: Only try to fetch XML description once in UPNP_GetValidIGD() Added -ansi flag to compilation, and fixed C++ comments to ANSI C comments. diff --git a/miniupnpc/upnpc.c b/miniupnpc/upnpc.c index 5feecd9..231dd39 100644 --- a/miniupnpc/upnpc.c +++ b/miniupnpc/upnpc.c @@ -1,4 +1,4 @@ -/* $Id: upnpc.c,v 1.93 2012/04/09 12:49:26 nanard Exp $ */ +/* $Id: upnpc.c,v 1.94 2012/04/20 14:13:10 nanard Exp $ */ /* Project : miniupnp * Author : Thomas Bernard * Copyright (c) 2005-2012 Thomas Bernard @@ -12,6 +12,9 @@ #ifdef _WIN32 #include #define snprintf _snprintf +#else +/* for IPPROTO_TCP / IPPROTO_UDP */ +#include #endif #include "miniwget.h" #include "miniupnpc.h" @@ -323,25 +326,39 @@ static void SetPinholeAndTest(struct UPNPUrls * urls, struct IGDdatas * data, char uniqueID[8]; /*int isWorking = 0;*/ int r; + char proto_tmp[8]; if(!intaddr || !remoteaddr || !iport || !eport || !proto || !lease_time) { fprintf(stderr, "Wrong arguments\n"); return; } - /*proto = protofix(proto); - if(!proto) + if(atoi(proto) == 0) { - fprintf(stderr, "invalid protocol\n"); - return; - }*/ + if(strcmp("TCP", protofix(proto)) == 0) + { + snprintf(proto_tmp, sizeof(proto_tmp), "%d", IPPROTO_TCP); + proto = proto_tmp; + } + else if(strcmp("UDP", protofix(proto)) == 0) + { + snprintf(proto_tmp, sizeof(proto_tmp), "%d", IPPROTO_UDP); + proto = proto_tmp; + } + else + { + fprintf(stderr, "invalid protocol\n"); + return; + } + } r = UPNP_AddPinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, remoteaddr, eport, intaddr, iport, proto, lease_time, uniqueID); if(r!=UPNPCOMMAND_SUCCESS) printf("AddPinhole([%s]:%s -> [%s]:%s) failed with code %d (%s)\n", - intaddr, iport, remoteaddr, eport, r, strupnperror(r)); + remoteaddr, eport, intaddr, iport, r, strupnperror(r)); else { - printf("AddPinhole: ([%s]:%s -> [%s]:%s) / Pinhole ID = %s\n", intaddr, iport, remoteaddr, eport, uniqueID); + printf("AddPinhole: ([%s]:%s -> [%s]:%s) / Pinhole ID = %s\n", + remoteaddr, eport, intaddr, iport, uniqueID); /*r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->servicetype_6FC, uniqueID, &isWorking); if(r!=UPNPCOMMAND_SUCCESS) printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r));