/* upnpDiscoverDevice() Discover a specific device */ MINIUPNP_LIBSPEC struct UPNPDev * upnpDiscoverDevice(const char * device, int delay, const char * multicastif, const char * minissdpdsock, int localport, int ipv6, unsigned char ttl, int * error) { const char * const deviceList[] = { device, 0 }; return upnpDiscoverDevices(deviceList, delay, multicastif, minissdpdsock, localport, ipv6, ttl, error, 0); }
/* upnpDiscoverDevice() Discover a specific device */ MINIUPNP_LIBSPEC struct UPNPDev * upnpDiscoverDevice(const char * device, int delay, const char * multicastif, const char * minissdpdsock, int sameport, int ipv6, int * error) { const char * const deviceList[] = { device, 0 }; return upnpDiscoverDevices(deviceList, delay, multicastif, minissdpdsock, sameport, ipv6, error); }
/* upnpDiscoverAll() Discover all UPnP devices */ MINIUPNP_LIBSPEC struct UPNPDev * upnpDiscoverAll(int delay, const char * multicastif, const char * minissdpdsock, int localport, int ipv6, unsigned char ttl, int * error) { static const char * const deviceList[] = { /*"upnp:rootdevice",*/ "ssdp:all", 0 }; return upnpDiscoverDevices(deviceList, delay, multicastif, minissdpdsock, localport, ipv6, ttl, error, 0); }
/* upnpDiscover() Discover IGD device */ MINIUPNP_LIBSPEC struct UPNPDev * upnpDiscover(int delay, const char * multicastif, const char * minissdpdsock, int localport, int ipv6, unsigned char ttl, int * error) { static const char * const deviceList[] = { #if 0 "urn:schemas-upnp-org:device:InternetGatewayDevice:2", "urn:schemas-upnp-org:service:WANIPConnection:2", #endif "urn:schemas-upnp-org:device:InternetGatewayDevice:1", "urn:schemas-upnp-org:service:WANIPConnection:1", "urn:schemas-upnp-org:service:WANPPPConnection:1", "upnp:rootdevice", /*"ssdp:all",*/ 0 }; return upnpDiscoverDevices(deviceList, delay, multicastif, minissdpdsock, localport, ipv6, ttl, error, 0); }
int main(int argc, char * * argv) { const char * searched_device = NULL; const char * * searched_devices = NULL; const char * multicastif = 0; const char * minissdpdpath = 0; int ipv6 = 0; int error = 0; struct UPNPDev * devlist = 0; struct UPNPDev * dev; int i; #ifdef _WIN32 WSADATA wsaData; int nResult = WSAStartup(MAKEWORD(2,2), &wsaData); if(nResult != NO_ERROR) { fprintf(stderr, "WSAStartup() failed.\n"); return -1; } #endif for(i = 1; i < argc; i++) { if(strcmp(argv[i], "-6") == 0) ipv6 = 1; else if(strcmp(argv[i], "-d") == 0) { if(++i >= argc) { fprintf(stderr, "-d option needs one argument\n"); return 1; } searched_device = argv[i]; } else if(strcmp(argv[i], "-l") == 0) { if(++i >= argc) { fprintf(stderr, "-l option needs at least one argument\n"); return 1; } searched_devices = (const char * *)(argv + i); break; } else if(strcmp(argv[i], "-m") == 0) { if(++i >= argc) { fprintf(stderr, "-m option needs one argument\n"); return 1; } multicastif = argv[i]; } else { printf("usage : %s [options] [-l <device1> <device2> ...]\n", argv[0]); printf("options :\n"); printf(" -6 : use IPv6\n"); printf(" -m address/ifname : network interface to use for multicast\n"); printf(" -d <device string> : search only for this type of device\n"); printf(" -l <device1> <device2> ... : search only for theses types of device\n"); printf(" -h : this help\n"); return 1; } } if(searched_device) { printf("searching UPnP device type %s\n", searched_device); devlist = upnpDiscoverDevice(searched_device, 2000, multicastif, minissdpdpath, 0/*sameport*/, ipv6, &error); } else if(searched_devices) { printf("searching UPnP device types :\n"); for(i = 0; searched_devices[i]; i++) printf("\t%s\n", searched_devices[i]); devlist = upnpDiscoverDevices(searched_devices, 2000, multicastif, minissdpdpath, 0/*sameport*/, ipv6, &error, 1); } else { printf("searching all UPnP devices\n"); devlist = upnpDiscoverAll(2000, multicastif, minissdpdpath, 0/*sameport*/, ipv6, &error); } if(devlist) { for(dev = devlist; dev != NULL; dev = dev->pNext) { printf("%-48s\t%s\n", dev->st, dev->descURL); } freeUPNPDevlist(devlist); } else { printf("no device found.\n"); } return 0; }