listdevices.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /* $Id: listdevices.c,v 1.7 2015/10/08 16:15:47 nanard Exp $ */
  2. /* Project : miniupnp
  3. * Author : Thomas Bernard
  4. * Copyright (c) 2013-2015 Thomas Bernard
  5. * This software is subject to the conditions detailed in the
  6. * LICENCE file provided in this distribution. */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #ifdef _WIN32
  11. #include <winsock2.h>
  12. #endif /* _WIN32 */
  13. #include "miniupnpc.h"
  14. int main(int argc, char * * argv)
  15. {
  16. const char * searched_device = NULL;
  17. const char * * searched_devices = NULL;
  18. const char * multicastif = 0;
  19. const char * minissdpdpath = 0;
  20. int ipv6 = 0;
  21. unsigned char ttl = 2;
  22. int error = 0;
  23. struct UPNPDev * devlist = 0;
  24. struct UPNPDev * dev;
  25. int i;
  26. #ifdef _WIN32
  27. WSADATA wsaData;
  28. int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  29. if(nResult != NO_ERROR)
  30. {
  31. fprintf(stderr, "WSAStartup() failed.\n");
  32. return -1;
  33. }
  34. #endif
  35. for(i = 1; i < argc; i++) {
  36. if(strcmp(argv[i], "-6") == 0)
  37. ipv6 = 1;
  38. else if(strcmp(argv[i], "-d") == 0) {
  39. if(++i >= argc) {
  40. fprintf(stderr, "%s option needs one argument\n", "-d");
  41. return 1;
  42. }
  43. searched_device = argv[i];
  44. } else if(strcmp(argv[i], "-t") == 0) {
  45. if(++i >= argc) {
  46. fprintf(stderr, "%s option needs one argument\n", "-t");
  47. return 1;
  48. }
  49. ttl = (unsigned char)atoi(argv[i]);
  50. } else if(strcmp(argv[i], "-l") == 0) {
  51. if(++i >= argc) {
  52. fprintf(stderr, "-l option needs at least one argument\n");
  53. return 1;
  54. }
  55. searched_devices = (const char * *)(argv + i);
  56. break;
  57. } else if(strcmp(argv[i], "-m") == 0) {
  58. if(++i >= argc) {
  59. fprintf(stderr, "-m option needs one argument\n");
  60. return 1;
  61. }
  62. multicastif = argv[i];
  63. } else {
  64. printf("usage : %s [options] [-l <device1> <device2> ...]\n", argv[0]);
  65. printf("options :\n");
  66. printf(" -6 : use IPv6\n");
  67. printf(" -m address/ifname : network interface to use for multicast\n");
  68. printf(" -d <device string> : search only for this type of device\n");
  69. printf(" -l <device1> <device2> ... : search only for theses types of device\n");
  70. printf(" -t ttl : set multicast TTL. Default value is 2.\n");
  71. printf(" -h : this help\n");
  72. return 1;
  73. }
  74. }
  75. if(searched_device) {
  76. printf("searching UPnP device type %s\n", searched_device);
  77. devlist = upnpDiscoverDevice(searched_device,
  78. 2000, multicastif, minissdpdpath,
  79. 0/*localport*/, ipv6, ttl, &error);
  80. } else if(searched_devices) {
  81. printf("searching UPnP device types :\n");
  82. for(i = 0; searched_devices[i]; i++)
  83. printf("\t%s\n", searched_devices[i]);
  84. devlist = upnpDiscoverDevices(searched_devices,
  85. 2000, multicastif, minissdpdpath,
  86. 0/*localport*/, ipv6, ttl, &error, 1);
  87. } else {
  88. printf("searching all UPnP devices\n");
  89. devlist = upnpDiscoverAll(2000, multicastif, minissdpdpath,
  90. 0/*localport*/, ipv6, ttl, &error);
  91. }
  92. if(devlist) {
  93. for(dev = devlist, i = 1; dev != NULL; dev = dev->pNext, i++) {
  94. printf("%3d: %-48s\n", i, dev->st);
  95. printf(" %s\n", dev->descURL);
  96. printf(" %s\n", dev->usn);
  97. }
  98. freeUPNPDevlist(devlist);
  99. } else {
  100. printf("no device found.\n");
  101. }
  102. return 0;
  103. }