int main(int argc, char *argv[]) { if (argc < 2) usage(); if (strcmp(argv[1], "devlist") == 0) devlist(argc-1, &argv[1]); else if (strcmp(argv[1], "identify") == 0) identify(argc-1, &argv[1]); else if (strcmp(argv[1], "perftest") == 0) perftest(argc-1, &argv[1]); else if (strcmp(argv[1], "reset") == 0) reset_ctrlr(argc-1, &argv[1]); usage(); return (0); }
// called from ---UPnP--- thread // discovers the IGD static bool InitUPnP() { static bool s_inited = false; static bool s_error = false; // Don't init if already inited if (s_inited) return true; // Don't init if it failed before if (s_error) return false; s_urls = {}; s_data = {}; // Find all UPnP devices int upnperror = 0; std::unique_ptr<UPNPDev, decltype(&freeUPNPDevlist)> devlist(nullptr, freeUPNPDevlist); #if MINIUPNPC_API_VERSION >= 14 devlist.reset(upnpDiscover(2000, nullptr, nullptr, 0, 0, 2, &upnperror)); #else devlist.reset(upnpDiscover(2000, nullptr, nullptr, 0, 0, &upnperror)); #endif if (!devlist) { WARN_LOG(NETPLAY, "An error occurred trying to discover UPnP devices."); s_error = true; return false; } // Look for the IGD for (UPNPDev* dev = devlist.get(); dev; dev = dev->pNext) { if (!std::strstr(dev->st, "InternetGatewayDevice")) continue; int desc_xml_size = 0; std::unique_ptr<char, decltype(&std::free)> desc_xml(nullptr, std::free); int statusCode = 200; #if MINIUPNPC_API_VERSION >= 16 desc_xml.reset( static_cast<char*>(miniwget_getaddr(dev->descURL, &desc_xml_size, s_our_ip.data(), static_cast<int>(s_our_ip.size()), 0, &statusCode))); #else desc_xml.reset(static_cast<char*>(miniwget_getaddr( dev->descURL, &desc_xml_size, s_our_ip.data(), static_cast<int>(s_our_ip.size()), 0))); #endif if (desc_xml && statusCode == 200) { parserootdesc(desc_xml.get(), desc_xml_size, &s_data); GetUPNPUrls(&s_urls, &s_data, dev->descURL, 0); NOTICE_LOG(NETPLAY, "Got info from IGD at %s.", dev->descURL); break; } else { WARN_LOG(NETPLAY, "Error getting info from IGD at %s.", dev->descURL); } } s_inited = true; return true; }