version 1.1, 2012/02/21 23:16:22
|
version 1.1.1.2, 2013/07/22 00:36:10
|
Line 1
|
Line 1
|
/* $Id$ */ |
/* $Id$ */ |
/* Project : miniupnp |
/* Project : miniupnp |
* Author : Thomas Bernard |
* Author : Thomas Bernard |
* Copyright (c) 2005-2011 Thomas Bernard | * Copyright (c) 2005-2013 Thomas Bernard |
* This software is subject to the conditions detailed in the |
* This software is subject to the conditions detailed in the |
* LICENCE file provided in this distribution. */ |
* LICENCE file provided in this distribution. */ |
|
|
Line 9
|
Line 9
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <time.h> |
#include <time.h> |
#ifdef WIN32 | #ifdef _WIN32 |
#include <winsock2.h> |
#include <winsock2.h> |
#define snprintf _snprintf |
#define snprintf _snprintf |
|
#else |
|
/* for IPPROTO_TCP / IPPROTO_UDP */ |
|
#include <netinet/in.h> |
#endif |
#endif |
#include "miniwget.h" |
#include "miniwget.h" |
#include "miniupnpc.h" |
#include "miniupnpc.h" |
#include "upnpcommands.h" |
#include "upnpcommands.h" |
#include "upnperrors.h" |
#include "upnperrors.h" |
|
|
/* protofix() checks if protocol is "UDP" or "TCP" | /* protofix() checks if protocol is "UDP" or "TCP" |
* returns NULL if not */ |
* returns NULL if not */ |
const char * protofix(const char * proto) |
const char * protofix(const char * proto) |
{ |
{ |
Line 26 const char * protofix(const char * proto)
|
Line 29 const char * protofix(const char * proto)
|
static const char proto_udp[4] = { 'U', 'D', 'P', 0}; |
static const char proto_udp[4] = { 'U', 'D', 'P', 0}; |
int i, b; |
int i, b; |
for(i=0, b=1; i<4; i++) |
for(i=0, b=1; i<4; i++) |
b = b && ( (proto[i] == proto_tcp[i]) | b = b && ( (proto[i] == proto_tcp[i]) |
|| (proto[i] == (proto_tcp[i] | 32)) ); |
|| (proto[i] == (proto_tcp[i] | 32)) ); |
if(b) |
if(b) |
return proto_tcp; |
return proto_tcp; |
Line 49 static void DisplayInfos(struct UPNPUrls * urls,
|
Line 52 static void DisplayInfos(struct UPNPUrls * urls,
|
unsigned int brUp, brDown; |
unsigned int brUp, brDown; |
time_t timenow, timestarted; |
time_t timenow, timestarted; |
int r; |
int r; |
UPNP_GetConnectionTypeInfo(urls->controlURL, | if(UPNP_GetConnectionTypeInfo(urls->controlURL, |
data->first.servicetype, | data->first.servicetype, |
connectionType); | connectionType) != UPNPCOMMAND_SUCCESS) |
if(connectionType[0]) | printf("GetConnectionTypeInfo failed.\n"); |
| else |
printf("Connection Type : %s\n", connectionType); |
printf("Connection Type : %s\n", connectionType); |
|
if(UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype, |
|
status, &uptime, lastconnerr) != UPNPCOMMAND_SUCCESS) |
|
printf("GetStatusInfo failed.\n"); |
else |
else |
printf("GetConnectionTypeInfo failed.\n"); | printf("Status : %s, uptime=%us, LastConnectionError : %s\n", |
UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype, | status, uptime, lastconnerr); |
status, &uptime, lastconnerr); | |
printf("Status : %s, uptime=%us, LastConnectionError : %s\n", | |
status, uptime, lastconnerr); | |
timenow = time(NULL); |
timenow = time(NULL); |
timestarted = timenow - uptime; |
timestarted = timenow - uptime; |
printf(" Time started : %s", ctime(×tarted)); |
printf(" Time started : %s", ctime(×tarted)); |
UPNP_GetLinkLayerMaxBitRates(urls->controlURL_CIF, data->CIF.servicetype, | if(UPNP_GetLinkLayerMaxBitRates(urls->controlURL_CIF, data->CIF.servicetype, |
&brDown, &brUp); | &brDown, &brUp) != UPNPCOMMAND_SUCCESS) { |
printf("MaxBitRateDown : %u bps", brDown); | printf("GetLinkLayerMaxBitRates failed.\n"); |
if(brDown >= 1000000) { | } else { |
printf(" (%u.%u Mbps)", brDown / 1000000, (brDown / 100000) % 10); | printf("MaxBitRateDown : %u bps", brDown); |
} else if(brDown >= 1000) { | if(brDown >= 1000000) { |
printf(" (%u Kbps)", brDown / 1000); | printf(" (%u.%u Mbps)", brDown / 1000000, (brDown / 100000) % 10); |
| } else if(brDown >= 1000) { |
| printf(" (%u Kbps)", brDown / 1000); |
| } |
| printf(" MaxBitRateUp %u bps", brUp); |
| if(brUp >= 1000000) { |
| printf(" (%u.%u Mbps)", brUp / 1000000, (brUp / 100000) % 10); |
| } else if(brUp >= 1000) { |
| printf(" (%u Kbps)", brUp / 1000); |
| } |
| printf("\n"); |
} |
} |
printf(" MaxBitRateUp %u bps", brUp); |
|
if(brUp >= 1000000) { |
|
printf(" (%u.%u Mbps)", brUp / 1000000, (brUp / 100000) % 10); |
|
} else if(brUp >= 1000) { |
|
printf(" (%u Kbps)", brUp / 1000); |
|
} |
|
printf("\n"); |
|
r = UPNP_GetExternalIPAddress(urls->controlURL, |
r = UPNP_GetExternalIPAddress(urls->controlURL, |
data->first.servicetype, |
data->first.servicetype, |
externalIPAddress); |
externalIPAddress); |
if(r != UPNPCOMMAND_SUCCESS) | if(r != UPNPCOMMAND_SUCCESS) { |
printf("GetExternalIPAddress() returned %d\n", r); | printf("GetExternalIPAddress failed. (errorcode=%d)\n", r); |
if(externalIPAddress[0]) | } else { |
printf("ExternalIPAddress = %s\n", externalIPAddress); |
printf("ExternalIPAddress = %s\n", externalIPAddress); |
else | } |
printf("GetExternalIPAddress failed.\n"); | |
} |
} |
|
|
static void GetConnectionStatus(struct UPNPUrls * urls, |
static void GetConnectionStatus(struct UPNPUrls * urls, |
Line 119 static void ListRedirections(struct UPNPUrls * urls,
|
Line 125 static void ListRedirections(struct UPNPUrls * urls,
|
/*unsigned int num=0; |
/*unsigned int num=0; |
UPNP_GetPortMappingNumberOfEntries(urls->controlURL, data->servicetype, &num); |
UPNP_GetPortMappingNumberOfEntries(urls->controlURL, data->servicetype, &num); |
printf("PortMappingNumberOfEntries : %u\n", num);*/ |
printf("PortMappingNumberOfEntries : %u\n", num);*/ |
|
printf(" i protocol exPort->inAddr:inPort description remoteHost leaseTime\n"); |
do { |
do { |
snprintf(index, 6, "%d", i); |
snprintf(index, 6, "%d", i); |
rHost[0] = '\0'; enabled[0] = '\0'; |
rHost[0] = '\0'; enabled[0] = '\0'; |
Line 166 static void NewListRedirections(struct UPNPUrls * urls
|
Line 173 static void NewListRedirections(struct UPNPUrls * urls
|
&pdata); |
&pdata); |
if(r == UPNPCOMMAND_SUCCESS) |
if(r == UPNPCOMMAND_SUCCESS) |
{ |
{ |
|
printf(" i protocol exPort->inAddr:inPort description remoteHost leaseTime\n"); |
for(pm = pdata.head.lh_first; pm != NULL; pm = pm->entries.le_next) |
for(pm = pdata.head.lh_first; pm != NULL; pm = pm->entries.le_next) |
{ |
{ |
printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n", |
printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n", |
Line 209 static void NewListRedirections(struct UPNPUrls * urls
|
Line 217 static void NewListRedirections(struct UPNPUrls * urls
|
} |
} |
} |
} |
|
|
/* Test function | /* Test function |
* 1 - get connection type |
* 1 - get connection type |
* 2 - get extenal ip address |
* 2 - get extenal ip address |
* 3 - Add port mapping |
* 3 - Add port mapping |
Line 220 static void SetRedirectAndTest(struct UPNPUrls * urls,
|
Line 228 static void SetRedirectAndTest(struct UPNPUrls * urls,
|
const char * iport, |
const char * iport, |
const char * eport, |
const char * eport, |
const char * proto, |
const char * proto, |
const char * leaseDuration) | const char * leaseDuration, |
| const char * description) |
{ |
{ |
char externalIPAddress[40]; |
char externalIPAddress[40]; |
char intClient[40]; |
char intClient[40]; |
Line 239 static void SetRedirectAndTest(struct UPNPUrls * urls,
|
Line 248 static void SetRedirectAndTest(struct UPNPUrls * urls,
|
fprintf(stderr, "invalid protocol\n"); |
fprintf(stderr, "invalid protocol\n"); |
return; |
return; |
} |
} |
| |
UPNP_GetExternalIPAddress(urls->controlURL, |
UPNP_GetExternalIPAddress(urls->controlURL, |
data->first.servicetype, |
data->first.servicetype, |
externalIPAddress); |
externalIPAddress); |
Line 247 static void SetRedirectAndTest(struct UPNPUrls * urls,
|
Line 256 static void SetRedirectAndTest(struct UPNPUrls * urls,
|
printf("ExternalIPAddress = %s\n", externalIPAddress); |
printf("ExternalIPAddress = %s\n", externalIPAddress); |
else |
else |
printf("GetExternalIPAddress failed.\n"); |
printf("GetExternalIPAddress failed.\n"); |
| |
r = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype, |
r = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype, |
eport, iport, iaddr, 0, proto, 0, leaseDuration); | eport, iport, iaddr, description, |
| proto, 0, leaseDuration); |
if(r!=UPNPCOMMAND_SUCCESS) |
if(r!=UPNPCOMMAND_SUCCESS) |
printf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", |
printf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", |
eport, iport, iaddr, r, strupnperror(r)); |
eport, iport, iaddr, r, strupnperror(r)); |
Line 262 static void SetRedirectAndTest(struct UPNPUrls * urls,
|
Line 272 static void SetRedirectAndTest(struct UPNPUrls * urls,
|
if(r!=UPNPCOMMAND_SUCCESS) |
if(r!=UPNPCOMMAND_SUCCESS) |
printf("GetSpecificPortMappingEntry() failed with code %d (%s)\n", |
printf("GetSpecificPortMappingEntry() failed with code %d (%s)\n", |
r, strupnperror(r)); |
r, strupnperror(r)); |
| |
if(intClient[0]) { |
if(intClient[0]) { |
printf("InternalIP:Port = %s:%s\n", intClient, intPort); |
printf("InternalIP:Port = %s:%s\n", intClient, intPort); |
printf("external %s:%s %s is redirected to internal %s:%s (duration=%s)\n", |
printf("external %s:%s %s is redirected to internal %s:%s (duration=%s)\n", |
Line 301 static void GetFirewallStatus(struct UPNPUrls * urls,
|
Line 311 static void GetFirewallStatus(struct UPNPUrls * urls,
|
UPNP_GetFirewallStatus(urls->controlURL_6FC, data->IPv6FC.servicetype, &firewallEnabled, &inboundPinholeAllowed); |
UPNP_GetFirewallStatus(urls->controlURL_6FC, data->IPv6FC.servicetype, &firewallEnabled, &inboundPinholeAllowed); |
printf("FirewallEnabled: %d & Inbound Pinhole Allowed: %d\n", firewallEnabled, inboundPinholeAllowed); |
printf("FirewallEnabled: %d & Inbound Pinhole Allowed: %d\n", firewallEnabled, inboundPinholeAllowed); |
printf("GetFirewallStatus:\n Firewall Enabled: %s\n Inbound Pinhole Allowed: %s\n", (firewallEnabled)? "Yes":"No", (inboundPinholeAllowed)? "Yes":"No"); |
printf("GetFirewallStatus:\n Firewall Enabled: %s\n Inbound Pinhole Allowed: %s\n", (firewallEnabled)? "Yes":"No", (inboundPinholeAllowed)? "Yes":"No"); |
| |
bytessent = UPNP_GetTotalBytesSent(urls->controlURL_CIF, data->CIF.servicetype); |
bytessent = UPNP_GetTotalBytesSent(urls->controlURL_CIF, data->CIF.servicetype); |
bytesreceived = UPNP_GetTotalBytesReceived(urls->controlURL_CIF, data->CIF.servicetype); |
bytesreceived = UPNP_GetTotalBytesReceived(urls->controlURL_CIF, data->CIF.servicetype); |
packetssent = UPNP_GetTotalPacketsSent(urls->controlURL_CIF, data->CIF.servicetype); |
packetssent = UPNP_GetTotalPacketsSent(urls->controlURL_CIF, data->CIF.servicetype); |
Line 310 static void GetFirewallStatus(struct UPNPUrls * urls,
|
Line 320 static void GetFirewallStatus(struct UPNPUrls * urls,
|
printf("Packets: Sent: %8u\tRecv: %8u\n", packetssent, packetsreceived); |
printf("Packets: Sent: %8u\tRecv: %8u\n", packetssent, packetsreceived); |
} |
} |
|
|
/* Test function | /* Test function |
* 1 - Add pinhole |
* 1 - Add pinhole |
* 2 - Check if pinhole is working from the IGD side */ |
* 2 - Check if pinhole is working from the IGD side */ |
static void SetPinholeAndTest(struct UPNPUrls * urls, struct IGDdatas * data, |
static void SetPinholeAndTest(struct UPNPUrls * urls, struct IGDdatas * data, |
Line 319 static void SetPinholeAndTest(struct UPNPUrls * urls,
|
Line 329 static void SetPinholeAndTest(struct UPNPUrls * urls,
|
const char * proto, const char * lease_time) |
const char * proto, const char * lease_time) |
{ |
{ |
char uniqueID[8]; |
char uniqueID[8]; |
//int isWorking = 0; | /*int isWorking = 0;*/ |
int r; |
int r; |
|
char proto_tmp[8]; |
|
|
if(!intaddr || !remoteaddr || !iport || !eport || !proto || !lease_time) |
if(!intaddr || !remoteaddr || !iport || !eport || !proto || !lease_time) |
{ |
{ |
fprintf(stderr, "Wrong arguments\n"); |
fprintf(stderr, "Wrong arguments\n"); |
return; |
return; |
} |
} |
/*proto = protofix(proto); | if(atoi(proto) == 0) |
if(!proto) | |
{ |
{ |
fprintf(stderr, "invalid protocol\n"); | const char * protocol; |
return; | protocol = protofix(proto); |
}*/ | if(protocol && (strcmp("TCP", protocol) == 0)) |
| { |
| snprintf(proto_tmp, sizeof(proto_tmp), "%d", IPPROTO_TCP); |
| proto = proto_tmp; |
| } |
| else if(protocol && (strcmp("UDP", protocol) == 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); |
r = UPNP_AddPinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, remoteaddr, eport, intaddr, iport, proto, lease_time, uniqueID); |
if(r!=UPNPCOMMAND_SUCCESS) |
if(r!=UPNPCOMMAND_SUCCESS) |
printf("AddPinhole([%s]:%s -> [%s]:%s) failed with code %d (%s)\n", |
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 |
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); |
/*r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->servicetype_6FC, uniqueID, &isWorking); |
if(r!=UPNPCOMMAND_SUCCESS) |
if(r!=UPNPCOMMAND_SUCCESS) |
printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r)); |
printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r)); |
Line 374 static void GetPinholeAndUpdate(struct UPNPUrls * urls
|
Line 400 static void GetPinholeAndUpdate(struct UPNPUrls * urls
|
} |
} |
} |
} |
|
|
/* Test function | /* Test function |
* Get pinhole timeout |
* Get pinhole timeout |
*/ |
*/ |
static void GetPinholeOutboundTimeout(struct UPNPUrls * urls, struct IGDdatas * data, |
static void GetPinholeOutboundTimeout(struct UPNPUrls * urls, struct IGDdatas * data, |
Line 463 int main(int argc, char ** argv)
|
Line 489 int main(int argc, char ** argv)
|
int retcode = 0; |
int retcode = 0; |
int error = 0; |
int error = 0; |
int ipv6 = 0; |
int ipv6 = 0; |
|
const char * description = 0; |
|
|
#ifdef WIN32 | #ifdef _WIN32 |
WSADATA wsaData; |
WSADATA wsaData; |
int nResult = WSAStartup(MAKEWORD(2,2), &wsaData); |
int nResult = WSAStartup(MAKEWORD(2,2), &wsaData); |
if(nResult != NO_ERROR) |
if(nResult != NO_ERROR) |
Line 473 int main(int argc, char ** argv)
|
Line 500 int main(int argc, char ** argv)
|
return -1; |
return -1; |
} |
} |
#endif |
#endif |
printf("upnpc : miniupnpc library test client. (c) 2006-2011 Thomas Bernard\n"); | printf("upnpc : miniupnpc library test client. (c) 2005-2013 Thomas Bernard\n"); |
printf("Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/\n" |
printf("Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/\n" |
"for more information.\n"); |
"for more information.\n"); |
/* command line processing */ |
/* command line processing */ |
Line 489 int main(int argc, char ** argv)
|
Line 516 int main(int argc, char ** argv)
|
minissdpdpath = argv[++i]; |
minissdpdpath = argv[++i]; |
else if(argv[i][1] == '6') |
else if(argv[i][1] == '6') |
ipv6 = 1; |
ipv6 = 1; |
|
else if(argv[i][1] == 'e') |
|
description = argv[++i]; |
else |
else |
{ |
{ |
command = argv[i][1]; |
command = argv[i][1]; |
Line 527 int main(int argc, char ** argv)
|
Line 556 int main(int argc, char ** argv)
|
fprintf(stderr, " \t%s [options] -P\n\t\tGet Presentation url\n", argv[0]); |
fprintf(stderr, " \t%s [options] -P\n\t\tGet Presentation url\n", argv[0]); |
fprintf(stderr, "\nprotocol is UDP or TCP\n"); |
fprintf(stderr, "\nprotocol is UDP or TCP\n"); |
fprintf(stderr, "Options:\n"); |
fprintf(stderr, "Options:\n"); |
|
fprintf(stderr, " -e description : set description for port mapping.\n"); |
fprintf(stderr, " -6 : use ip v6 instead of ip v4.\n"); |
fprintf(stderr, " -6 : use ip v6 instead of ip v4.\n"); |
fprintf(stderr, " -u url : bypass discovery process by providing the XML root description url.\n"); |
fprintf(stderr, " -u url : bypass discovery process by providing the XML root description url.\n"); |
fprintf(stderr, " -m address/interface : provide ip address (ip v4) or interface name (ip v6) to use for sending SSDP multicast packets.\n"); | fprintf(stderr, " -m address/interface : provide ip address (ip v4) or interface name (ip v4 or v6) to use for sending SSDP multicast packets.\n"); |
fprintf(stderr, " -p path : use this path for MiniSSDPd socket.\n"); |
fprintf(stderr, " -p path : use this path for MiniSSDPd socket.\n"); |
return 1; |
return 1; |
} |
} |
Line 598 int main(int argc, char ** argv)
|
Line 628 int main(int argc, char ** argv)
|
SetRedirectAndTest(&urls, &data, |
SetRedirectAndTest(&urls, &data, |
commandargv[0], commandargv[1], |
commandargv[0], commandargv[1], |
commandargv[2], commandargv[3], |
commandargv[2], commandargv[3], |
(commandargc > 4)?commandargv[4]:"0"); | (commandargc > 4)?commandargv[4]:"0", |
| description); |
break; |
break; |
case 'd': |
case 'd': |
for(i=0; i<commandargc; i+=2) |
for(i=0; i<commandargc; i+=2) |
Line 615 int main(int argc, char ** argv)
|
Line 646 int main(int argc, char ** argv)
|
/*printf("port %s protocol %s\n", argv[i], argv[i+1]);*/ |
/*printf("port %s protocol %s\n", argv[i], argv[i+1]);*/ |
SetRedirectAndTest(&urls, &data, |
SetRedirectAndTest(&urls, &data, |
lanaddr, commandargv[i], |
lanaddr, commandargv[i], |
commandargv[i], commandargv[i+1], "0"); | commandargv[i], commandargv[i+1], "0", |
| description); |
} |
} |
break; |
break; |
case 'A': |
case 'A': |