Annotation of embedaddon/miniupnpc/upnpc.c, revision 1.1.1.1
1.1 misho 1: /* $Id: upnpc.c,v 1.88 2011/06/17 23:31:01 nanard Exp $ */
2: /* Project : miniupnp
3: * Author : Thomas Bernard
4: * Copyright (c) 2005-2011 Thomas Bernard
5: * This software is subject to the conditions detailed in the
6: * LICENCE file provided in this distribution. */
7:
8: #include <stdio.h>
9: #include <stdlib.h>
10: #include <string.h>
11: #include <time.h>
12: #ifdef WIN32
13: #include <winsock2.h>
14: #define snprintf _snprintf
15: #endif
16: #include "miniwget.h"
17: #include "miniupnpc.h"
18: #include "upnpcommands.h"
19: #include "upnperrors.h"
20:
21: /* protofix() checks if protocol is "UDP" or "TCP"
22: * returns NULL if not */
23: const char * protofix(const char * proto)
24: {
25: static const char proto_tcp[4] = { 'T', 'C', 'P', 0};
26: static const char proto_udp[4] = { 'U', 'D', 'P', 0};
27: int i, b;
28: for(i=0, b=1; i<4; i++)
29: b = b && ( (proto[i] == proto_tcp[i])
30: || (proto[i] == (proto_tcp[i] | 32)) );
31: if(b)
32: return proto_tcp;
33: for(i=0, b=1; i<4; i++)
34: b = b && ( (proto[i] == proto_udp[i])
35: || (proto[i] == (proto_udp[i] | 32)) );
36: if(b)
37: return proto_udp;
38: return 0;
39: }
40:
41: static void DisplayInfos(struct UPNPUrls * urls,
42: struct IGDdatas * data)
43: {
44: char externalIPAddress[40];
45: char connectionType[64];
46: char status[64];
47: char lastconnerr[64];
48: unsigned int uptime;
49: unsigned int brUp, brDown;
50: time_t timenow, timestarted;
51: int r;
52: UPNP_GetConnectionTypeInfo(urls->controlURL,
53: data->first.servicetype,
54: connectionType);
55: if(connectionType[0])
56: printf("Connection Type : %s\n", connectionType);
57: else
58: printf("GetConnectionTypeInfo failed.\n");
59: UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype,
60: status, &uptime, lastconnerr);
61: printf("Status : %s, uptime=%us, LastConnectionError : %s\n",
62: status, uptime, lastconnerr);
63: timenow = time(NULL);
64: timestarted = timenow - uptime;
65: printf(" Time started : %s", ctime(×tarted));
66: UPNP_GetLinkLayerMaxBitRates(urls->controlURL_CIF, data->CIF.servicetype,
67: &brDown, &brUp);
68: printf("MaxBitRateDown : %u bps", brDown);
69: if(brDown >= 1000000) {
70: printf(" (%u.%u Mbps)", brDown / 1000000, (brDown / 100000) % 10);
71: } else if(brDown >= 1000) {
72: printf(" (%u Kbps)", brDown / 1000);
73: }
74: printf(" MaxBitRateUp %u bps", brUp);
75: if(brUp >= 1000000) {
76: printf(" (%u.%u Mbps)", brUp / 1000000, (brUp / 100000) % 10);
77: } else if(brUp >= 1000) {
78: printf(" (%u Kbps)", brUp / 1000);
79: }
80: printf("\n");
81: r = UPNP_GetExternalIPAddress(urls->controlURL,
82: data->first.servicetype,
83: externalIPAddress);
84: if(r != UPNPCOMMAND_SUCCESS)
85: printf("GetExternalIPAddress() returned %d\n", r);
86: if(externalIPAddress[0])
87: printf("ExternalIPAddress = %s\n", externalIPAddress);
88: else
89: printf("GetExternalIPAddress failed.\n");
90: }
91:
92: static void GetConnectionStatus(struct UPNPUrls * urls,
93: struct IGDdatas * data)
94: {
95: unsigned int bytessent, bytesreceived, packetsreceived, packetssent;
96: DisplayInfos(urls, data);
97: bytessent = UPNP_GetTotalBytesSent(urls->controlURL_CIF, data->CIF.servicetype);
98: bytesreceived = UPNP_GetTotalBytesReceived(urls->controlURL_CIF, data->CIF.servicetype);
99: packetssent = UPNP_GetTotalPacketsSent(urls->controlURL_CIF, data->CIF.servicetype);
100: packetsreceived = UPNP_GetTotalPacketsReceived(urls->controlURL_CIF, data->CIF.servicetype);
101: printf("Bytes: Sent: %8u\tRecv: %8u\n", bytessent, bytesreceived);
102: printf("Packets: Sent: %8u\tRecv: %8u\n", packetssent, packetsreceived);
103: }
104:
105: static void ListRedirections(struct UPNPUrls * urls,
106: struct IGDdatas * data)
107: {
108: int r;
109: int i = 0;
110: char index[6];
111: char intClient[40];
112: char intPort[6];
113: char extPort[6];
114: char protocol[4];
115: char desc[80];
116: char enabled[6];
117: char rHost[64];
118: char duration[16];
119: /*unsigned int num=0;
120: UPNP_GetPortMappingNumberOfEntries(urls->controlURL, data->servicetype, &num);
121: printf("PortMappingNumberOfEntries : %u\n", num);*/
122: do {
123: snprintf(index, 6, "%d", i);
124: rHost[0] = '\0'; enabled[0] = '\0';
125: duration[0] = '\0'; desc[0] = '\0';
126: extPort[0] = '\0'; intPort[0] = '\0'; intClient[0] = '\0';
127: r = UPNP_GetGenericPortMappingEntry(urls->controlURL,
128: data->first.servicetype,
129: index,
130: extPort, intClient, intPort,
131: protocol, desc, enabled,
132: rHost, duration);
133: if(r==0)
134: /*
135: printf("%02d - %s %s->%s:%s\tenabled=%s leaseDuration=%s\n"
136: " desc='%s' rHost='%s'\n",
137: i, protocol, extPort, intClient, intPort,
138: enabled, duration,
139: desc, rHost);
140: */
141: printf("%2d %s %5s->%s:%-5s '%s' '%s' %s\n",
142: i, protocol, extPort, intClient, intPort,
143: desc, rHost, duration);
144: else
145: printf("GetGenericPortMappingEntry() returned %d (%s)\n",
146: r, strupnperror(r));
147: i++;
148: } while(r==0);
149: }
150:
151: static void NewListRedirections(struct UPNPUrls * urls,
152: struct IGDdatas * data)
153: {
154: int r;
155: int i = 0;
156: struct PortMappingParserData pdata;
157: struct PortMapping * pm;
158:
159: memset(&pdata, 0, sizeof(struct PortMappingParserData));
160: r = UPNP_GetListOfPortMappings(urls->controlURL,
161: data->first.servicetype,
162: "0",
163: "65535",
164: "TCP",
165: "1000",
166: &pdata);
167: if(r == UPNPCOMMAND_SUCCESS)
168: {
169: for(pm = pdata.head.lh_first; pm != NULL; pm = pm->entries.le_next)
170: {
171: printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n",
172: i, pm->protocol, pm->externalPort, pm->internalClient,
173: pm->internalPort,
174: pm->description, pm->remoteHost,
175: (unsigned)pm->leaseTime);
176: i++;
177: }
178: FreePortListing(&pdata);
179: }
180: else
181: {
182: printf("GetListOfPortMappings() returned %d (%s)\n",
183: r, strupnperror(r));
184: }
185: r = UPNP_GetListOfPortMappings(urls->controlURL,
186: data->first.servicetype,
187: "0",
188: "65535",
189: "UDP",
190: "1000",
191: &pdata);
192: if(r == UPNPCOMMAND_SUCCESS)
193: {
194: for(pm = pdata.head.lh_first; pm != NULL; pm = pm->entries.le_next)
195: {
196: printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n",
197: i, pm->protocol, pm->externalPort, pm->internalClient,
198: pm->internalPort,
199: pm->description, pm->remoteHost,
200: (unsigned)pm->leaseTime);
201: i++;
202: }
203: FreePortListing(&pdata);
204: }
205: else
206: {
207: printf("GetListOfPortMappings() returned %d (%s)\n",
208: r, strupnperror(r));
209: }
210: }
211:
212: /* Test function
213: * 1 - get connection type
214: * 2 - get extenal ip address
215: * 3 - Add port mapping
216: * 4 - get this port mapping from the IGD */
217: static void SetRedirectAndTest(struct UPNPUrls * urls,
218: struct IGDdatas * data,
219: const char * iaddr,
220: const char * iport,
221: const char * eport,
222: const char * proto,
223: const char * leaseDuration)
224: {
225: char externalIPAddress[40];
226: char intClient[40];
227: char intPort[6];
228: char duration[16];
229: int r;
230:
231: if(!iaddr || !iport || !eport || !proto)
232: {
233: fprintf(stderr, "Wrong arguments\n");
234: return;
235: }
236: proto = protofix(proto);
237: if(!proto)
238: {
239: fprintf(stderr, "invalid protocol\n");
240: return;
241: }
242:
243: UPNP_GetExternalIPAddress(urls->controlURL,
244: data->first.servicetype,
245: externalIPAddress);
246: if(externalIPAddress[0])
247: printf("ExternalIPAddress = %s\n", externalIPAddress);
248: else
249: printf("GetExternalIPAddress failed.\n");
250:
251: r = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype,
252: eport, iport, iaddr, 0, proto, 0, leaseDuration);
253: if(r!=UPNPCOMMAND_SUCCESS)
254: printf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",
255: eport, iport, iaddr, r, strupnperror(r));
256:
257: r = UPNP_GetSpecificPortMappingEntry(urls->controlURL,
258: data->first.servicetype,
259: eport, proto,
260: intClient, intPort, NULL/*desc*/,
261: NULL/*enabled*/, duration);
262: if(r!=UPNPCOMMAND_SUCCESS)
263: printf("GetSpecificPortMappingEntry() failed with code %d (%s)\n",
264: r, strupnperror(r));
265:
266: if(intClient[0]) {
267: printf("InternalIP:Port = %s:%s\n", intClient, intPort);
268: printf("external %s:%s %s is redirected to internal %s:%s (duration=%s)\n",
269: externalIPAddress, eport, proto, intClient, intPort, duration);
270: }
271: }
272:
273: static void
274: RemoveRedirect(struct UPNPUrls * urls,
275: struct IGDdatas * data,
276: const char * eport,
277: const char * proto)
278: {
279: int r;
280: if(!proto || !eport)
281: {
282: fprintf(stderr, "invalid arguments\n");
283: return;
284: }
285: proto = protofix(proto);
286: if(!proto)
287: {
288: fprintf(stderr, "protocol invalid\n");
289: return;
290: }
291: r = UPNP_DeletePortMapping(urls->controlURL, data->first.servicetype, eport, proto, 0);
292: printf("UPNP_DeletePortMapping() returned : %d\n", r);
293: }
294:
295: /* IGD:2, functions for service WANIPv6FirewallControl:1 */
296: static void GetFirewallStatus(struct UPNPUrls * urls, struct IGDdatas * data)
297: {
298: unsigned int bytessent, bytesreceived, packetsreceived, packetssent;
299: int firewallEnabled = 0, inboundPinholeAllowed = 0;
300:
301: UPNP_GetFirewallStatus(urls->controlURL_6FC, data->IPv6FC.servicetype, &firewallEnabled, &inboundPinholeAllowed);
302: printf("FirewallEnabled: %d & Inbound Pinhole Allowed: %d\n", firewallEnabled, inboundPinholeAllowed);
303: printf("GetFirewallStatus:\n Firewall Enabled: %s\n Inbound Pinhole Allowed: %s\n", (firewallEnabled)? "Yes":"No", (inboundPinholeAllowed)? "Yes":"No");
304:
305: bytessent = UPNP_GetTotalBytesSent(urls->controlURL_CIF, data->CIF.servicetype);
306: bytesreceived = UPNP_GetTotalBytesReceived(urls->controlURL_CIF, data->CIF.servicetype);
307: packetssent = UPNP_GetTotalPacketsSent(urls->controlURL_CIF, data->CIF.servicetype);
308: packetsreceived = UPNP_GetTotalPacketsReceived(urls->controlURL_CIF, data->CIF.servicetype);
309: printf("Bytes: Sent: %8u\tRecv: %8u\n", bytessent, bytesreceived);
310: printf("Packets: Sent: %8u\tRecv: %8u\n", packetssent, packetsreceived);
311: }
312:
313: /* Test function
314: * 1 - Add pinhole
315: * 2 - Check if pinhole is working from the IGD side */
316: static void SetPinholeAndTest(struct UPNPUrls * urls, struct IGDdatas * data,
317: const char * remoteaddr, const char * eport,
318: const char * intaddr, const char * iport,
319: const char * proto, const char * lease_time)
320: {
321: char uniqueID[8];
322: //int isWorking = 0;
323: int r;
324:
325: if(!intaddr || !remoteaddr || !iport || !eport || !proto || !lease_time)
326: {
327: fprintf(stderr, "Wrong arguments\n");
328: return;
329: }
330: /*proto = protofix(proto);
331: if(!proto)
332: {
333: fprintf(stderr, "invalid protocol\n");
334: return;
335: }*/
336: r = UPNP_AddPinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, remoteaddr, eport, intaddr, iport, proto, lease_time, uniqueID);
337: if(r!=UPNPCOMMAND_SUCCESS)
338: printf("AddPinhole([%s]:%s -> [%s]:%s) failed with code %d (%s)\n",
339: intaddr, iport, remoteaddr, eport, r, strupnperror(r));
340: else
341: {
342: printf("AddPinhole: ([%s]:%s -> [%s]:%s) / Pinhole ID = %s\n", intaddr, iport, remoteaddr, eport, uniqueID);
343: /*r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->servicetype_6FC, uniqueID, &isWorking);
344: if(r!=UPNPCOMMAND_SUCCESS)
345: printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r));
346: printf("CheckPinholeWorking: Pinhole ID = %s / IsWorking = %s\n", uniqueID, (isWorking)? "Yes":"No");*/
347: }
348: }
349:
350: /* Test function
351: * 1 - Check if pinhole is working from the IGD side
352: * 2 - Update pinhole */
353: static void GetPinholeAndUpdate(struct UPNPUrls * urls, struct IGDdatas * data,
354: const char * uniqueID, const char * lease_time)
355: {
356: int isWorking = 0;
357: int r;
358:
359: if(!uniqueID || !lease_time)
360: {
361: fprintf(stderr, "Wrong arguments\n");
362: return;
363: }
364: r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID, &isWorking);
365: printf("CheckPinholeWorking: Pinhole ID = %s / IsWorking = %s\n", uniqueID, (isWorking)? "Yes":"No");
366: if(r!=UPNPCOMMAND_SUCCESS)
367: printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r));
368: if(isWorking || r==709)
369: {
370: r = UPNP_UpdatePinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID, lease_time);
371: printf("UpdatePinhole: Pinhole ID = %s with Lease Time: %s\n", uniqueID, lease_time);
372: if(r!=UPNPCOMMAND_SUCCESS)
373: printf("UpdatePinhole: ID (%s) failed with code %d (%s)\n", uniqueID, r, strupnperror(r));
374: }
375: }
376:
377: /* Test function
378: * Get pinhole timeout
379: */
380: static void GetPinholeOutboundTimeout(struct UPNPUrls * urls, struct IGDdatas * data,
381: const char * remoteaddr, const char * eport,
382: const char * intaddr, const char * iport,
383: const char * proto)
384: {
385: int timeout = 0;
386: int r;
387:
388: if(!intaddr || !remoteaddr || !iport || !eport || !proto)
389: {
390: fprintf(stderr, "Wrong arguments\n");
391: return;
392: }
393:
394: r = UPNP_GetOutboundPinholeTimeout(urls->controlURL_6FC, data->IPv6FC.servicetype, remoteaddr, eport, intaddr, iport, proto, &timeout);
395: if(r!=UPNPCOMMAND_SUCCESS)
396: printf("GetOutboundPinholeTimeout([%s]:%s -> [%s]:%s) failed with code %d (%s)\n",
397: intaddr, iport, remoteaddr, eport, r, strupnperror(r));
398: else
399: printf("GetOutboundPinholeTimeout: ([%s]:%s -> [%s]:%s) / Timeout = %d\n", intaddr, iport, remoteaddr, eport, timeout);
400: }
401:
402: static void
403: GetPinholePackets(struct UPNPUrls * urls,
404: struct IGDdatas * data, const char * uniqueID)
405: {
406: int r, pinholePackets = 0;
407: if(!uniqueID)
408: {
409: fprintf(stderr, "invalid arguments\n");
410: return;
411: }
412: r = UPNP_GetPinholePackets(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID, &pinholePackets);
413: if(r!=UPNPCOMMAND_SUCCESS)
414: printf("GetPinholePackets() failed with code %d (%s)\n", r, strupnperror(r));
415: else
416: printf("GetPinholePackets: Pinhole ID = %s / PinholePackets = %d\n", uniqueID, pinholePackets);
417: }
418:
419: static void
420: CheckPinhole(struct UPNPUrls * urls,
421: struct IGDdatas * data, const char * uniqueID)
422: {
423: int r, isWorking = 0;
424: if(!uniqueID)
425: {
426: fprintf(stderr, "invalid arguments\n");
427: return;
428: }
429: r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID, &isWorking);
430: if(r!=UPNPCOMMAND_SUCCESS)
431: printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r));
432: else
433: printf("CheckPinholeWorking: Pinhole ID = %s / IsWorking = %s\n", uniqueID, (isWorking)? "Yes":"No");
434: }
435:
436: static void
437: RemovePinhole(struct UPNPUrls * urls,
438: struct IGDdatas * data, const char * uniqueID)
439: {
440: int r;
441: if(!uniqueID)
442: {
443: fprintf(stderr, "invalid arguments\n");
444: return;
445: }
446: r = UPNP_DeletePinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID);
447: printf("UPNP_DeletePinhole() returned : %d\n", r);
448: }
449:
450:
451: /* sample upnp client program */
452: int main(int argc, char ** argv)
453: {
454: char command = 0;
455: char ** commandargv = 0;
456: int commandargc = 0;
457: struct UPNPDev * devlist = 0;
458: char lanaddr[64]; /* my ip address on the LAN */
459: int i;
460: const char * rootdescurl = 0;
461: const char * multicastif = 0;
462: const char * minissdpdpath = 0;
463: int retcode = 0;
464: int error = 0;
465: int ipv6 = 0;
466:
467: #ifdef WIN32
468: WSADATA wsaData;
469: int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
470: if(nResult != NO_ERROR)
471: {
472: fprintf(stderr, "WSAStartup() failed.\n");
473: return -1;
474: }
475: #endif
476: printf("upnpc : miniupnpc library test client. (c) 2006-2011 Thomas Bernard\n");
477: printf("Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/\n"
478: "for more information.\n");
479: /* command line processing */
480: for(i=1; i<argc; i++)
481: {
482: if(argv[i][0] == '-')
483: {
484: if(argv[i][1] == 'u')
485: rootdescurl = argv[++i];
486: else if(argv[i][1] == 'm')
487: multicastif = argv[++i];
488: else if(argv[i][1] == 'p')
489: minissdpdpath = argv[++i];
490: else if(argv[i][1] == '6')
491: ipv6 = 1;
492: else
493: {
494: command = argv[i][1];
495: i++;
496: commandargv = argv + i;
497: commandargc = argc - i;
498: break;
499: }
500: }
501: else
502: {
503: fprintf(stderr, "option '%s' invalid\n", argv[i]);
504: }
505: }
506:
507: if(!command || (command == 'a' && commandargc<4)
508: || (command == 'd' && argc<2)
509: || (command == 'r' && argc<2)
510: || (command == 'A' && commandargc<6)
511: || (command == 'U' && commandargc<2)
512: || (command == 'D' && commandargc<1))
513: {
514: fprintf(stderr, "Usage :\t%s [options] -a ip port external_port protocol [duration]\n\t\tAdd port redirection\n", argv[0]);
515: fprintf(stderr, " \t%s [options] -d external_port protocol [port2 protocol2] [...]\n\t\tDelete port redirection\n", argv[0]);
516: fprintf(stderr, " \t%s [options] -s\n\t\tGet Connection status\n", argv[0]);
517: fprintf(stderr, " \t%s [options] -l\n\t\tList redirections\n", argv[0]);
518: fprintf(stderr, " \t%s [options] -L\n\t\tList redirections (using GetListOfPortMappings, IGD v2)\n", argv[0]);
519: fprintf(stderr, " \t%s [options] -r port1 protocol1 [port2 protocol2] [...]\n\t\tAdd all redirections to the current host\n", argv[0]);
520: 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]);
521: fprintf(stderr, " \t%s [options] -U uniqueID new_lease_time\n\t\tUpdate Pinhole (for IGD:2 only)\n", argv[0]);
522: fprintf(stderr, " \t%s [options] -C uniqueID\n\t\tCheck if Pinhole is Working (for IGD:2 only)\n", argv[0]);
523: fprintf(stderr, " \t%s [options] -K uniqueID\n\t\tGet Number of packets going through the rule (for IGD:2 only)\n", argv[0]);
524: fprintf(stderr, " \t%s [options] -D uniqueID\n\t\tDelete Pinhole (for IGD:2 only)\n", argv[0]);
525: fprintf(stderr, " \t%s [options] -S\n\t\tGet Firewall status (for IGD:2 only)\n", argv[0]);
526: 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]);
527: fprintf(stderr, " \t%s [options] -P\n\t\tGet Presentation url\n", argv[0]);
528: fprintf(stderr, "\nprotocol is UDP or TCP\n");
529: fprintf(stderr, "Options:\n");
530: fprintf(stderr, " -6 : use ip v6 instead of ip v4.\n");
531: fprintf(stderr, " -u url : bypass discovery process by providing the XML root description url.\n");
532: fprintf(stderr, " -m address/interface : provide ip address (ip v4) or interface name (ip v6) to use for sending SSDP multicast packets.\n");
533: fprintf(stderr, " -p path : use this path for MiniSSDPd socket.\n");
534: return 1;
535: }
536:
537: if( rootdescurl
538: || (devlist = upnpDiscover(2000, multicastif, minissdpdpath,
539: 0/*sameport*/, ipv6, &error)))
540: {
541: struct UPNPDev * device;
542: struct UPNPUrls urls;
543: struct IGDdatas data;
544: if(devlist)
545: {
546: printf("List of UPNP devices found on the network :\n");
547: for(device = devlist; device; device = device->pNext)
548: {
549: printf(" desc: %s\n st: %s\n\n",
550: device->descURL, device->st);
551: }
552: }
553: else
554: {
555: printf("upnpDiscover() error code=%d\n", error);
556: }
557: i = 1;
558: if( (rootdescurl && UPNP_GetIGDFromUrl(rootdescurl, &urls, &data, lanaddr, sizeof(lanaddr)))
559: || (i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr))))
560: {
561: switch(i) {
562: case 1:
563: printf("Found valid IGD : %s\n", urls.controlURL);
564: break;
565: case 2:
566: printf("Found a (not connected?) IGD : %s\n", urls.controlURL);
567: printf("Trying to continue anyway\n");
568: break;
569: case 3:
570: printf("UPnP device found. Is it an IGD ? : %s\n", urls.controlURL);
571: printf("Trying to continue anyway\n");
572: break;
573: default:
574: printf("Found device (igd ?) : %s\n", urls.controlURL);
575: printf("Trying to continue anyway\n");
576: }
577: printf("Local LAN ip address : %s\n", lanaddr);
578: #if 0
579: printf("getting \"%s\"\n", urls.ipcondescURL);
580: descXML = miniwget(urls.ipcondescURL, &descXMLsize);
581: if(descXML)
582: {
583: /*fwrite(descXML, 1, descXMLsize, stdout);*/
584: free(descXML); descXML = NULL;
585: }
586: #endif
587:
588: switch(command)
589: {
590: case 'l':
591: DisplayInfos(&urls, &data);
592: ListRedirections(&urls, &data);
593: break;
594: case 'L':
595: NewListRedirections(&urls, &data);
596: break;
597: case 'a':
598: SetRedirectAndTest(&urls, &data,
599: commandargv[0], commandargv[1],
600: commandargv[2], commandargv[3],
601: (commandargc > 4)?commandargv[4]:"0");
602: break;
603: case 'd':
604: for(i=0; i<commandargc; i+=2)
605: {
606: RemoveRedirect(&urls, &data, commandargv[i], commandargv[i+1]);
607: }
608: break;
609: case 's':
610: GetConnectionStatus(&urls, &data);
611: break;
612: case 'r':
613: for(i=0; i<commandargc; i+=2)
614: {
615: /*printf("port %s protocol %s\n", argv[i], argv[i+1]);*/
616: SetRedirectAndTest(&urls, &data,
617: lanaddr, commandargv[i],
618: commandargv[i], commandargv[i+1], "0");
619: }
620: break;
621: case 'A':
622: SetPinholeAndTest(&urls, &data,
623: commandargv[0], commandargv[1],
624: commandargv[2], commandargv[3],
625: commandargv[4], commandargv[5]);
626: break;
627: case 'U':
628: GetPinholeAndUpdate(&urls, &data,
629: commandargv[0], commandargv[1]);
630: break;
631: case 'C':
632: for(i=0; i<commandargc; i++)
633: {
634: CheckPinhole(&urls, &data, commandargv[i]);
635: }
636: break;
637: case 'K':
638: for(i=0; i<commandargc; i++)
639: {
640: GetPinholePackets(&urls, &data, commandargv[i]);
641: }
642: break;
643: case 'D':
644: for(i=0; i<commandargc; i++)
645: {
646: RemovePinhole(&urls, &data, commandargv[i]);
647: }
648: break;
649: case 'S':
650: GetFirewallStatus(&urls, &data);
651: break;
652: case 'G':
653: GetPinholeOutboundTimeout(&urls, &data,
654: commandargv[0], commandargv[1],
655: commandargv[2], commandargv[3],
656: commandargv[4]);
657: break;
658: case 'P':
659: printf("Presentation URL found:\n");
660: printf(" %s\n", data.presentationurl);
661: break;
662: default:
663: fprintf(stderr, "Unknown switch -%c\n", command);
664: retcode = 1;
665: }
666:
667: FreeUPNPUrls(&urls);
668: }
669: else
670: {
671: fprintf(stderr, "No valid UPNP Internet Gateway Device found.\n");
672: retcode = 1;
673: }
674: freeUPNPDevlist(devlist); devlist = 0;
675: }
676: else
677: {
678: fprintf(stderr, "No IGD UPnP Device found on the network !\n");
679: retcode = 1;
680: }
681: return retcode;
682: }
683:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>