|
|
|
@@ -488,274 +488,273 @@ RemovePinhole(struct UPNPUrls * urls,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* sample upnp client program */
|
|
|
|
|
int main(int argc, char ** argv) {
|
|
|
|
|
char command = 0;
|
|
|
|
|
char ** commandargv = 0;
|
|
|
|
|
int commandargc = 0;
|
|
|
|
|
struct UPNPDev * devlist = 0;
|
|
|
|
|
char lanaddr[64]; /* my ip address on the LAN */
|
|
|
|
|
int i;
|
|
|
|
|
const char * rootdescurl = 0;
|
|
|
|
|
const char * multicastif = 0;
|
|
|
|
|
const char * minissdpdpath = 0;
|
|
|
|
|
int localport = UPNP_LOCAL_PORT_ANY;
|
|
|
|
|
int retcode = 0;
|
|
|
|
|
int error = 0;
|
|
|
|
|
int ipv6 = 0;
|
|
|
|
|
unsigned char ttl = 2; /* defaulting to 2 */
|
|
|
|
|
const char * description = 0;
|
|
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
WSADATA wsaData;
|
|
|
|
|
int nResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
|
|
|
|
|
if (nResult != NO_ERROR) {
|
|
|
|
|
fprintf(stderr, "WSAStartup() failed.\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
printf("upnpc : miniupnpc library test client, version %s.\n", MINIUPNPC_VERSION_STRING);
|
|
|
|
|
printf(" (c) 2005-2015 Thomas Bernard.\n");
|
|
|
|
|
printf("Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/\n"
|
|
|
|
|
"for more information.\n");
|
|
|
|
|
/* command line processing */
|
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
|
|
|
if (0 == strcmp(argv[i], "--help") || 0 == strcmp(argv[i], "-h")) {
|
|
|
|
|
command = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (argv[i][0] == '-') {
|
|
|
|
|
if (argv[i][1] == 'u')
|
|
|
|
|
rootdescurl = argv[++i];
|
|
|
|
|
else if (argv[i][1] == 'm')
|
|
|
|
|
multicastif = argv[++i];
|
|
|
|
|
else if (argv[i][1] == 'z') {
|
|
|
|
|
char junk;
|
|
|
|
|
if (sscanf(argv[++i], "%d%c", &localport, &junk) != 1 ||
|
|
|
|
|
localport < 0 || localport>65535 ||
|
|
|
|
|
(localport > 1 && localport < 1024)) {
|
|
|
|
|
fprintf(stderr, "Invalid localport '%s'\n", argv[i]);
|
|
|
|
|
localport = UPNP_LOCAL_PORT_ANY;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (argv[i][1] == 'p')
|
|
|
|
|
minissdpdpath = argv[++i];
|
|
|
|
|
else if (argv[i][1] == '6')
|
|
|
|
|
ipv6 = 1;
|
|
|
|
|
else if (argv[i][1] == 'e')
|
|
|
|
|
description = argv[++i];
|
|
|
|
|
else if (argv[i][1] == 't')
|
|
|
|
|
ttl = (unsigned char) atoi(argv[++i]);
|
|
|
|
|
else {
|
|
|
|
|
command = argv[i][1];
|
|
|
|
|
i++;
|
|
|
|
|
commandargv = argv + i;
|
|
|
|
|
commandargc = argc - i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
fprintf(stderr, "option '%s' invalid\n", argv[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!command
|
|
|
|
|
|| (command == 'a' && commandargc < 4)
|
|
|
|
|
|| (command == 'd' && argc < 2)
|
|
|
|
|
|| (command == 'r' && argc < 2)
|
|
|
|
|
|| (command == 'A' && commandargc < 6)
|
|
|
|
|
|| (command == 'U' && commandargc < 2)
|
|
|
|
|
|| (command == 'D' && commandargc < 1)) {
|
|
|
|
|
fprintf(stderr, "Usage :\t%s [options] -a ip port external_port protocol [duration]\n\t\tAdd port redirection\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -d external_port protocol <remote host>\n\t\tDelete port redirection\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -s\n\t\tGet Connection status\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -l\n\t\tList redirections\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -L\n\t\tList redirections (using GetListOfPortMappings (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -n ip port external_port protocol [duration]\n\t\tAdd (any) port redirection allowing IGD to use alternative external_port (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -N external_port_start external_port_end protocol [manage]\n\t\tDelete range of port redirections (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -r port1 [external_port1] protocol1 [port2 [external_port2] protocol2] [...]\n\t\tAdd all redirections to the current host\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -A remote_ip remote_port internal_ip internal_port protocol lease_time\n\t\tAdd Pinhole (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -U uniqueID new_lease_time\n\t\tUpdate Pinhole (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -C uniqueID\n\t\tCheck if Pinhole is Working (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -K uniqueID\n\t\tGet Number of packets going through the rule (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -D uniqueID\n\t\tDelete Pinhole (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -S\n\t\tGet Firewall status (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
fprintf(stderr, " \t%s [options] -G remote_ip remote_port internal_ip internal_port protocol\n\t\tGet Outbound Pinhole Timeout (for IGD:2 only)\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, "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, " -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 v4 or v6) to use for sending SSDP multicast packets.\n");
|
|
|
|
|
fprintf(stderr, " -z localport : SSDP packets local (source) port (1024-65535).\n");
|
|
|
|
|
fprintf(stderr, " -p path : use this path for MiniSSDPd socket.\n");
|
|
|
|
|
fprintf(stderr, " -t ttl : set multicast TTL. Default value is 2.\n");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (rootdescurl
|
|
|
|
|
|| (devlist = upnpDiscover(2000, multicastif, minissdpdpath,
|
|
|
|
|
localport, ipv6, ttl, &error))) {
|
|
|
|
|
struct UPNPDev * device;
|
|
|
|
|
struct UPNPUrls urls;
|
|
|
|
|
struct IGDdatas data;
|
|
|
|
|
if (devlist) {
|
|
|
|
|
printf("List of UPNP devices found on the network :\n");
|
|
|
|
|
for (device = devlist; device; device = device->pNext) {
|
|
|
|
|
printf(" desc: %s\n st: %s\n\n",
|
|
|
|
|
device->descURL, device->st);
|
|
|
|
|
}
|
|
|
|
|
} else if (!rootdescurl) {
|
|
|
|
|
printf("upnpDiscover() error code=%d\n", error);
|
|
|
|
|
}
|
|
|
|
|
i = 1;
|
|
|
|
|
if ((rootdescurl && UPNP_GetIGDFromUrl(rootdescurl, &urls, &data, lanaddr, sizeof(lanaddr)))
|
|
|
|
|
|| (i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)))) {
|
|
|
|
|
switch (i) {
|
|
|
|
|
case 1:
|
|
|
|
|
printf("Found valid IGD : %s\n", urls.controlURL);
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
printf("Found a (not connected?) IGD : %s\n", urls.controlURL);
|
|
|
|
|
printf("Trying to continue anyway\n");
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
printf("UPnP device found. Is it an IGD ? : %s\n", urls.controlURL);
|
|
|
|
|
printf("Trying to continue anyway\n");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
printf("Found device (igd ?) : %s\n", urls.controlURL);
|
|
|
|
|
printf("Trying to continue anyway\n");
|
|
|
|
|
}
|
|
|
|
|
printf("Local LAN ip address : %s\n", lanaddr);
|
|
|
|
|
#if 0
|
|
|
|
|
printf("getting \"%s\"\n", urls.ipcondescURL);
|
|
|
|
|
descXML = miniwget(urls.ipcondescURL, &descXMLsize);
|
|
|
|
|
if (descXML) {
|
|
|
|
|
/*fwrite(descXML, 1, descXMLsize, stdout);*/
|
|
|
|
|
free(descXML); descXML = NULL;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
switch (command) {
|
|
|
|
|
case 'l':
|
|
|
|
|
DisplayInfos(&urls, &data);
|
|
|
|
|
ListRedirections(&urls, &data);
|
|
|
|
|
break;
|
|
|
|
|
case 'L':
|
|
|
|
|
NewListRedirections(&urls, &data);
|
|
|
|
|
break;
|
|
|
|
|
case 'a':
|
|
|
|
|
SetRedirectAndTest(&urls, &data,
|
|
|
|
|
commandargv[0], commandargv[1],
|
|
|
|
|
commandargv[2], commandargv[3],
|
|
|
|
|
(commandargc > 4) ? commandargv[4] : "0",
|
|
|
|
|
description, 0);
|
|
|
|
|
break;
|
|
|
|
|
case 'd':
|
|
|
|
|
RemoveRedirect(&urls, &data, commandargv[0], commandargv[1],
|
|
|
|
|
commandargc > 2 ? commandargv[2] : NULL);
|
|
|
|
|
break;
|
|
|
|
|
case 'n': /* aNy */
|
|
|
|
|
SetRedirectAndTest(&urls, &data,
|
|
|
|
|
commandargv[0], commandargv[1],
|
|
|
|
|
commandargv[2], commandargv[3],
|
|
|
|
|
(commandargc > 4) ? commandargv[4] : "0",
|
|
|
|
|
description, 1);
|
|
|
|
|
break;
|
|
|
|
|
case 'N':
|
|
|
|
|
if (commandargc < 3)
|
|
|
|
|
fprintf(stderr, "too few arguments\n");
|
|
|
|
|
|
|
|
|
|
RemoveRedirectRange(&urls, &data, commandargv[0], commandargv[1], commandargv[2],
|
|
|
|
|
commandargc > 3 ? commandargv[3] : NULL);
|
|
|
|
|
break;
|
|
|
|
|
case 's':
|
|
|
|
|
GetConnectionStatus(&urls, &data);
|
|
|
|
|
break;
|
|
|
|
|
case 'r':
|
|
|
|
|
i = 0;
|
|
|
|
|
while (i < commandargc) {
|
|
|
|
|
if (!is_int(commandargv[i])) {
|
|
|
|
|
/* 1st parameter not an integer : error */
|
|
|
|
|
fprintf(stderr, "command -r : %s is not an port number\n", commandargv[i]);
|
|
|
|
|
retcode = 1;
|
|
|
|
|
break;
|
|
|
|
|
} else if (is_int(commandargv[i + 1])) {
|
|
|
|
|
/* 2nd parameter is an integer : <port> <external_port> <protocol> */
|
|
|
|
|
SetRedirectAndTest(&urls, &data,
|
|
|
|
|
lanaddr, commandargv[i],
|
|
|
|
|
commandargv[i + 1], commandargv[i + 2], "0",
|
|
|
|
|
description, 0);
|
|
|
|
|
i += 3; /* 3 parameters parsed */
|
|
|
|
|
} else {
|
|
|
|
|
/* 2nd parameter not an integer : <port> <protocol> */
|
|
|
|
|
SetRedirectAndTest(&urls, &data,
|
|
|
|
|
lanaddr, commandargv[i],
|
|
|
|
|
commandargv[i], commandargv[i + 1], "0",
|
|
|
|
|
description, 0);
|
|
|
|
|
i += 2; /* 2 parameters parsed */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'A':
|
|
|
|
|
SetPinholeAndTest(&urls, &data,
|
|
|
|
|
commandargv[0], commandargv[1],
|
|
|
|
|
commandargv[2], commandargv[3],
|
|
|
|
|
commandargv[4], commandargv[5]);
|
|
|
|
|
break;
|
|
|
|
|
case 'U':
|
|
|
|
|
GetPinholeAndUpdate(&urls, &data,
|
|
|
|
|
commandargv[0], commandargv[1]);
|
|
|
|
|
break;
|
|
|
|
|
case 'C':
|
|
|
|
|
for (i = 0; i < commandargc; i++) {
|
|
|
|
|
CheckPinhole(&urls, &data, commandargv[i]);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'K':
|
|
|
|
|
for (i = 0; i < commandargc; i++) {
|
|
|
|
|
GetPinholePackets(&urls, &data, commandargv[i]);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'D':
|
|
|
|
|
for (i = 0; i < commandargc; i++) {
|
|
|
|
|
RemovePinhole(&urls, &data, commandargv[i]);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'S':
|
|
|
|
|
GetFirewallStatus(&urls, &data);
|
|
|
|
|
break;
|
|
|
|
|
case 'G':
|
|
|
|
|
GetPinholeOutboundTimeout(&urls, &data,
|
|
|
|
|
commandargv[0], commandargv[1],
|
|
|
|
|
commandargv[2], commandargv[3],
|
|
|
|
|
commandargv[4]);
|
|
|
|
|
break;
|
|
|
|
|
case 'P':
|
|
|
|
|
printf("Presentation URL found:\n");
|
|
|
|
|
printf(" %s\n", data.presentationurl);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
fprintf(stderr, "Unknown switch -%c\n", command);
|
|
|
|
|
retcode = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FreeUPNPUrls(&urls);
|
|
|
|
|
} else {
|
|
|
|
|
fprintf(stderr, "No valid UPNP Internet Gateway Device found.\n");
|
|
|
|
|
retcode = 1;
|
|
|
|
|
}
|
|
|
|
|
freeUPNPDevlist(devlist); devlist = 0;
|
|
|
|
|
} else {
|
|
|
|
|
fprintf(stderr, "No IGD UPnP Device found on the network !\n");
|
|
|
|
|
retcode = 1;
|
|
|
|
|
}
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
nResult = WSACleanup();
|
|
|
|
|
if (nResult != NO_ERROR) {
|
|
|
|
|
fprintf(stderr, "WSACleanup() failed.\n");
|
|
|
|
|
}
|
|
|
|
|
#endif /* _WIN32 */
|
|
|
|
|
return retcode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//int main(int argc, char ** argv) {
|
|
|
|
|
// char command = 0;
|
|
|
|
|
// char ** commandargv = 0;
|
|
|
|
|
// int commandargc = 0;
|
|
|
|
|
// struct UPNPDev * devlist = 0;
|
|
|
|
|
// char lanaddr[64]; /* my ip address on the LAN */
|
|
|
|
|
// int i;
|
|
|
|
|
// const char * rootdescurl = 0;
|
|
|
|
|
// const char * multicastif = 0;
|
|
|
|
|
// const char * minissdpdpath = 0;
|
|
|
|
|
// int localport = UPNP_LOCAL_PORT_ANY;
|
|
|
|
|
// int retcode = 0;
|
|
|
|
|
// int error = 0;
|
|
|
|
|
// int ipv6 = 0;
|
|
|
|
|
// unsigned char ttl = 2; /* defaulting to 2 */
|
|
|
|
|
// const char * description = 0;
|
|
|
|
|
//
|
|
|
|
|
//#ifdef _WIN32
|
|
|
|
|
// WSADATA wsaData;
|
|
|
|
|
// int nResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
|
|
|
|
|
// if (nResult != NO_ERROR) {
|
|
|
|
|
// fprintf(stderr, "WSAStartup() failed.\n");
|
|
|
|
|
// return -1;
|
|
|
|
|
// }
|
|
|
|
|
//#endif
|
|
|
|
|
// printf("upnpc : miniupnpc library test client, version %s.\n", MINIUPNPC_VERSION_STRING);
|
|
|
|
|
// printf(" (c) 2005-2015 Thomas Bernard.\n");
|
|
|
|
|
// printf("Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/\n"
|
|
|
|
|
// "for more information.\n");
|
|
|
|
|
// /* command line processing */
|
|
|
|
|
// for (i = 1; i < argc; i++) {
|
|
|
|
|
// if (0 == strcmp(argv[i], "--help") || 0 == strcmp(argv[i], "-h")) {
|
|
|
|
|
// command = 0;
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// if (argv[i][0] == '-') {
|
|
|
|
|
// if (argv[i][1] == 'u')
|
|
|
|
|
// rootdescurl = argv[++i];
|
|
|
|
|
// else if (argv[i][1] == 'm')
|
|
|
|
|
// multicastif = argv[++i];
|
|
|
|
|
// else if (argv[i][1] == 'z') {
|
|
|
|
|
// char junk;
|
|
|
|
|
// if (sscanf(argv[++i], "%d%c", &localport, &junk) != 1 ||
|
|
|
|
|
// localport < 0 || localport>65535 ||
|
|
|
|
|
// (localport > 1 && localport < 1024)) {
|
|
|
|
|
// fprintf(stderr, "Invalid localport '%s'\n", argv[i]);
|
|
|
|
|
// localport = UPNP_LOCAL_PORT_ANY;
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// } else if (argv[i][1] == 'p')
|
|
|
|
|
// minissdpdpath = argv[++i];
|
|
|
|
|
// else if (argv[i][1] == '6')
|
|
|
|
|
// ipv6 = 1;
|
|
|
|
|
// else if (argv[i][1] == 'e')
|
|
|
|
|
// description = argv[++i];
|
|
|
|
|
// else if (argv[i][1] == 't')
|
|
|
|
|
// ttl = (unsigned char) atoi(argv[++i]);
|
|
|
|
|
// else {
|
|
|
|
|
// command = argv[i][1];
|
|
|
|
|
// i++;
|
|
|
|
|
// commandargv = argv + i;
|
|
|
|
|
// commandargc = argc - i;
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// } else {
|
|
|
|
|
// fprintf(stderr, "option '%s' invalid\n", argv[i]);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// if (!command
|
|
|
|
|
// || (command == 'a' && commandargc < 4)
|
|
|
|
|
// || (command == 'd' && argc < 2)
|
|
|
|
|
// || (command == 'r' && argc < 2)
|
|
|
|
|
// || (command == 'A' && commandargc < 6)
|
|
|
|
|
// || (command == 'U' && commandargc < 2)
|
|
|
|
|
// || (command == 'D' && commandargc < 1)) {
|
|
|
|
|
// fprintf(stderr, "Usage :\t%s [options] -a ip port external_port protocol [duration]\n\t\tAdd port redirection\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -d external_port protocol <remote host>\n\t\tDelete port redirection\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -s\n\t\tGet Connection status\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -l\n\t\tList redirections\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -L\n\t\tList redirections (using GetListOfPortMappings (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -n ip port external_port protocol [duration]\n\t\tAdd (any) port redirection allowing IGD to use alternative external_port (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -N external_port_start external_port_end protocol [manage]\n\t\tDelete range of port redirections (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -r port1 [external_port1] protocol1 [port2 [external_port2] protocol2] [...]\n\t\tAdd all redirections to the current host\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -A remote_ip remote_port internal_ip internal_port protocol lease_time\n\t\tAdd Pinhole (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -U uniqueID new_lease_time\n\t\tUpdate Pinhole (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -C uniqueID\n\t\tCheck if Pinhole is Working (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -K uniqueID\n\t\tGet Number of packets going through the rule (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -D uniqueID\n\t\tDelete Pinhole (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -S\n\t\tGet Firewall status (for IGD:2 only)\n", argv[0]);
|
|
|
|
|
// fprintf(stderr, " \t%s [options] -G remote_ip remote_port internal_ip internal_port protocol\n\t\tGet Outbound Pinhole Timeout (for IGD:2 only)\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, "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, " -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 v4 or v6) to use for sending SSDP multicast packets.\n");
|
|
|
|
|
// fprintf(stderr, " -z localport : SSDP packets local (source) port (1024-65535).\n");
|
|
|
|
|
// fprintf(stderr, " -p path : use this path for MiniSSDPd socket.\n");
|
|
|
|
|
// fprintf(stderr, " -t ttl : set multicast TTL. Default value is 2.\n");
|
|
|
|
|
// return 1;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// if (rootdescurl
|
|
|
|
|
// || (devlist = upnpDiscover(2000, multicastif, minissdpdpath,
|
|
|
|
|
// localport, ipv6, ttl, &error))) {
|
|
|
|
|
// struct UPNPDev * device;
|
|
|
|
|
// struct UPNPUrls urls;
|
|
|
|
|
// struct IGDdatas data;
|
|
|
|
|
// if (devlist) {
|
|
|
|
|
// printf("List of UPNP devices found on the network :\n");
|
|
|
|
|
// for (device = devlist; device; device = device->pNext) {
|
|
|
|
|
// printf(" desc: %s\n st: %s\n\n",
|
|
|
|
|
// device->descURL, device->st);
|
|
|
|
|
// }
|
|
|
|
|
// } else if (!rootdescurl) {
|
|
|
|
|
// printf("upnpDiscover() error code=%d\n", error);
|
|
|
|
|
// }
|
|
|
|
|
// i = 1;
|
|
|
|
|
// if ((rootdescurl && UPNP_GetIGDFromUrl(rootdescurl, &urls, &data, lanaddr, sizeof(lanaddr)))
|
|
|
|
|
// || (i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)))) {
|
|
|
|
|
// switch (i) {
|
|
|
|
|
// case 1:
|
|
|
|
|
// printf("Found valid IGD : %s\n", urls.controlURL);
|
|
|
|
|
// break;
|
|
|
|
|
// case 2:
|
|
|
|
|
// printf("Found a (not connected?) IGD : %s\n", urls.controlURL);
|
|
|
|
|
// printf("Trying to continue anyway\n");
|
|
|
|
|
// break;
|
|
|
|
|
// case 3:
|
|
|
|
|
// printf("UPnP device found. Is it an IGD ? : %s\n", urls.controlURL);
|
|
|
|
|
// printf("Trying to continue anyway\n");
|
|
|
|
|
// break;
|
|
|
|
|
// default:
|
|
|
|
|
// printf("Found device (igd ?) : %s\n", urls.controlURL);
|
|
|
|
|
// printf("Trying to continue anyway\n");
|
|
|
|
|
// }
|
|
|
|
|
// printf("Local LAN ip address : %s\n", lanaddr);
|
|
|
|
|
//#if 0
|
|
|
|
|
// printf("getting \"%s\"\n", urls.ipcondescURL);
|
|
|
|
|
// descXML = miniwget(urls.ipcondescURL, &descXMLsize);
|
|
|
|
|
// if (descXML) {
|
|
|
|
|
// /*fwrite(descXML, 1, descXMLsize, stdout);*/
|
|
|
|
|
// free(descXML); descXML = NULL;
|
|
|
|
|
// }
|
|
|
|
|
//#endif
|
|
|
|
|
//
|
|
|
|
|
// switch (command) {
|
|
|
|
|
// case 'l':
|
|
|
|
|
// DisplayInfos(&urls, &data);
|
|
|
|
|
// ListRedirections(&urls, &data);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'L':
|
|
|
|
|
// NewListRedirections(&urls, &data);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'a':
|
|
|
|
|
// SetRedirectAndTest(&urls, &data,
|
|
|
|
|
// commandargv[0], commandargv[1],
|
|
|
|
|
// commandargv[2], commandargv[3],
|
|
|
|
|
// (commandargc > 4) ? commandargv[4] : "0",
|
|
|
|
|
// description, 0);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'd':
|
|
|
|
|
// RemoveRedirect(&urls, &data, commandargv[0], commandargv[1],
|
|
|
|
|
// commandargc > 2 ? commandargv[2] : NULL);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'n': /* aNy */
|
|
|
|
|
// SetRedirectAndTest(&urls, &data,
|
|
|
|
|
// commandargv[0], commandargv[1],
|
|
|
|
|
// commandargv[2], commandargv[3],
|
|
|
|
|
// (commandargc > 4) ? commandargv[4] : "0",
|
|
|
|
|
// description, 1);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'N':
|
|
|
|
|
// if (commandargc < 3)
|
|
|
|
|
// fprintf(stderr, "too few arguments\n");
|
|
|
|
|
//
|
|
|
|
|
// RemoveRedirectRange(&urls, &data, commandargv[0], commandargv[1], commandargv[2],
|
|
|
|
|
// commandargc > 3 ? commandargv[3] : NULL);
|
|
|
|
|
// break;
|
|
|
|
|
// case 's':
|
|
|
|
|
// GetConnectionStatus(&urls, &data);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'r':
|
|
|
|
|
// i = 0;
|
|
|
|
|
// while (i < commandargc) {
|
|
|
|
|
// if (!is_int(commandargv[i])) {
|
|
|
|
|
// /* 1st parameter not an integer : error */
|
|
|
|
|
// fprintf(stderr, "command -r : %s is not an port number\n", commandargv[i]);
|
|
|
|
|
// retcode = 1;
|
|
|
|
|
// break;
|
|
|
|
|
// } else if (is_int(commandargv[i + 1])) {
|
|
|
|
|
// /* 2nd parameter is an integer : <port> <external_port> <protocol> */
|
|
|
|
|
// SetRedirectAndTest(&urls, &data,
|
|
|
|
|
// lanaddr, commandargv[i],
|
|
|
|
|
// commandargv[i + 1], commandargv[i + 2], "0",
|
|
|
|
|
// description, 0);
|
|
|
|
|
// i += 3; /* 3 parameters parsed */
|
|
|
|
|
// } else {
|
|
|
|
|
// /* 2nd parameter not an integer : <port> <protocol> */
|
|
|
|
|
// SetRedirectAndTest(&urls, &data,
|
|
|
|
|
// lanaddr, commandargv[i],
|
|
|
|
|
// commandargv[i], commandargv[i + 1], "0",
|
|
|
|
|
// description, 0);
|
|
|
|
|
// i += 2; /* 2 parameters parsed */
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// break;
|
|
|
|
|
// case 'A':
|
|
|
|
|
// SetPinholeAndTest(&urls, &data,
|
|
|
|
|
// commandargv[0], commandargv[1],
|
|
|
|
|
// commandargv[2], commandargv[3],
|
|
|
|
|
// commandargv[4], commandargv[5]);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'U':
|
|
|
|
|
// GetPinholeAndUpdate(&urls, &data,
|
|
|
|
|
// commandargv[0], commandargv[1]);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'C':
|
|
|
|
|
// for (i = 0; i < commandargc; i++) {
|
|
|
|
|
// CheckPinhole(&urls, &data, commandargv[i]);
|
|
|
|
|
// }
|
|
|
|
|
// break;
|
|
|
|
|
// case 'K':
|
|
|
|
|
// for (i = 0; i < commandargc; i++) {
|
|
|
|
|
// GetPinholePackets(&urls, &data, commandargv[i]);
|
|
|
|
|
// }
|
|
|
|
|
// break;
|
|
|
|
|
// case 'D':
|
|
|
|
|
// for (i = 0; i < commandargc; i++) {
|
|
|
|
|
// RemovePinhole(&urls, &data, commandargv[i]);
|
|
|
|
|
// }
|
|
|
|
|
// break;
|
|
|
|
|
// case 'S':
|
|
|
|
|
// GetFirewallStatus(&urls, &data);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'G':
|
|
|
|
|
// GetPinholeOutboundTimeout(&urls, &data,
|
|
|
|
|
// commandargv[0], commandargv[1],
|
|
|
|
|
// commandargv[2], commandargv[3],
|
|
|
|
|
// commandargv[4]);
|
|
|
|
|
// break;
|
|
|
|
|
// case 'P':
|
|
|
|
|
// printf("Presentation URL found:\n");
|
|
|
|
|
// printf(" %s\n", data.presentationurl);
|
|
|
|
|
// break;
|
|
|
|
|
// default:
|
|
|
|
|
// fprintf(stderr, "Unknown switch -%c\n", command);
|
|
|
|
|
// retcode = 1;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// FreeUPNPUrls(&urls);
|
|
|
|
|
// } else {
|
|
|
|
|
// fprintf(stderr, "No valid UPNP Internet Gateway Device found.\n");
|
|
|
|
|
// retcode = 1;
|
|
|
|
|
// }
|
|
|
|
|
// freeUPNPDevlist(devlist); devlist = 0;
|
|
|
|
|
// } else {
|
|
|
|
|
// fprintf(stderr, "No IGD UPnP Device found on the network !\n");
|
|
|
|
|
// retcode = 1;
|
|
|
|
|
// }
|
|
|
|
|
//#ifdef _WIN32
|
|
|
|
|
// nResult = WSACleanup();
|
|
|
|
|
// if (nResult != NO_ERROR) {
|
|
|
|
|
// fprintf(stderr, "WSACleanup() failed.\n");
|
|
|
|
|
// }
|
|
|
|
|
//#endif /* _WIN32 */
|
|
|
|
|
// return retcode;
|
|
|
|
|
//}
|
|
|
|
|