Diff for /embedaddon/miniupnpc/upnpc.c between versions 1.1.1.1 and 1.1.1.2

version 1.1.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(&timestarted));          printf("  Time started : %s", ctime(&timestarted));
        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':

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>