+void FindDNS(std::string& server)
+{
+ if (!server.empty())
+ return;
+
+ ServerInstance->Logs->Log("CONFIG",DEFAULT,"WARNING: <dns:server> not defined, attempting to find working server in the registry...");
+ std::string nameserver = FindNameServerWin();
+
+ /* If empty use default to 127.0.0.1 */
+ if (nameserver.empty())
+ {
+ ServerInstance->Logs->Log("CONFIG",DEFAULT,"No viable nameserver found in registry! Defaulting to nameserver '127.0.0.1'!");
+ server = "127.0.0.1";
+ return;
+ }
+
+ /* Windows stacks multiple nameservers in one registry key, seperated by commas.
+ * Spotted by Cataclysm.
+ */
+ if (nameserver.find(',') != std::string::npos)
+ nameserver = nameserver.substr(0, nameserver.find(','));
+
+ /* Just to be FUCKING AKWARD, windows fister... err i mean vista...
+ * seperates the nameservers with spaces instead.
+ */
+ if (nameserver.find(' ') != std::string::npos)
+ nameserver = nameserver.substr(0, nameserver.find(' '));
+
+ server = nameserver;
+ ServerInstance->Logs->Log("CONFIG",DEFAULT,"<dns:server> set to '%s' as first active resolver in registry.", nameserver.c_str());
+}
+
+int gettimeofday(struct timeval * tv, void * tz)
+{
+ if(tv == NULL)
+ return -1;
+
+ DWORD mstime = timeGetTime();
+ tv->tv_sec = time(NULL);
+ tv->tv_usec = (mstime - (tv->tv_sec * 1000)) * 1000;
+ return 0;
+}
+
+/* Initialise WMI. Microsoft have the silliest ideas about easy ways to
+ * obtain the CPU percentage of a running process!
+ * The whole API for this uses evil DCOM and is entirely unicode, giving
+ * all results and accepting queries as wide strings.
+ */
+bool initwmi()
+{
+ HRESULT hres;
+
+ /* Initialise COM. This can kill babies. */
+ hres = CoInitializeEx(0, COINIT_MULTITHREADED);
+ if (FAILED(hres))
+ return false;
+
+ /* COM security. This stuff kills kittens */
+ hres = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
+ RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
+
+ if (FAILED(hres))
+ {
+ CoUninitialize();
+ return false;
+ }
+
+ /* Instance to COM object */
+ pLoc = NULL;
+ hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
+
+ if (FAILED(hres))
+ {
+ CoUninitialize();
+ return false;
+ }
+
+ pSvc = NULL;
+
+ /* Connect to DCOM server */
+ hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
+
+ /* That didn't work, maybe no kittens found to kill? */
+ if (FAILED(hres))
+ {
+ pLoc->Release();
+ CoUninitialize();
+ return false;
+ }