]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - win/inspircd_win32wrapper.cpp
Tie module version display to servers/auspex priv.
[user/henk/code/inspircd.git] / win / inspircd_win32wrapper.cpp
index 37da9c0b37da4fd196e740a8d942eb4988410012..03d89a7aa5a8f0b932d7cf77e61dadf009f027a7 100644 (file)
@@ -91,71 +91,6 @@ int inet_pton(int af, const char *src, void *dst)
        return rv;
 }
 
-char * strtok_r(char *_String, const char *_Control, char **_Context)
-{
-       unsigned char *str;
-       const unsigned char *ctl = (const unsigned char*)_Control;
-       unsigned char map[32];
-
-       if (_Context == 0 || !_Control)
-               return 0;
-
-       if (!(_String != NULL || *_Context != NULL))
-               return 0;
-
-       memset(map, 0, 32);
-
-       do {
-               map[*ctl >> 3] |= (1 << (*ctl & 7));
-       } while (*ctl++);
-
-       /* If string is NULL, set str to the saved
-       * pointer (i.e., continue breaking tokens out of the string
-       * from the last strtok call) */
-       if (_String != NULL)
-       {
-               str = (unsigned char*)_String;
-       }
-       else
-       {
-               str = (unsigned char*)*_Context;
-       }
-
-       /* Find beginning of token (skip over leading delimiters). Note that
-       * there is no token iff this loop sets str to point to the terminal
-       * null (*str == 0) */
-       while ((map[*str >> 3] & (1 << (*str & 7))) && *str != 0)
-       {
-               str++;
-       }
-
-       _String = (char*)str;
-
-       /* Find the end of the token. If it is not the end of the string,
-       * put a null there. */
-       for ( ; *str != 0 ; str++ )
-       {
-               if (map[*str >> 3] & (1 << (*str & 7)))
-               {
-                       *str++ = 0;
-                       break;
-               }
-       }
-
-       /* Update context */
-       *_Context = (char*)str;
-
-       /* Determine if a token has been found. */
-       if (_String == (char*)str)
-       {
-               return NULL;
-       }
-       else
-       {
-               return _String;
-       }
-}
-
 void setcolor(int color_code)
 {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_code);
@@ -646,149 +581,142 @@ int gettimeofday(struct timeval * tv, void * tz)
        DWORD mstime = timeGetTime();
        tv->tv_sec   = time(NULL);
        tv->tv_usec  = (mstime - (tv->tv_sec * 1000)) * 1000;
-    return 0;  
+       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;
-
-    hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
-    if (FAILED(hres))
-    {
-        return false;
-    }
-
-    hres =  CoInitializeSecurity(
-        NULL, 
-        -1,                          // COM authentication
-        NULL,                        // Authentication services
-        NULL,                        // Reserved
-        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
-        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
-        NULL,                        // Authentication info
-        EOAC_NONE,                   // Additional capabilities 
-        NULL                         // Reserved
-        );
-
-                      
-    if (FAILED(hres))
-    {
-        CoUninitialize();
-        return false;
-    }
+       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;
+       }
     
-    pLoc = NULL;
-    hres = CoCreateInstance(
-        CLSID_WbemLocator,             
-        0, 
-        CLSCTX_INPROC_SERVER, 
-        IID_IWbemLocator, (LPVOID *) &pLoc);
+       /* 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;
-
-    hres = pLoc->ConnectServer(
-         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
-         NULL,                    // User name. NULL = current user
-         NULL,                    // User password. NULL = current
-         0,                       // Locale. NULL indicates current
-         NULL,                    // Security flags.
-         0,                       // Authority (e.g. Kerberos)
-         0,                       // Context object 
-         &pSvc                    // pointer to IWbemServices proxy
-         );
+       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);
     
-    if (FAILED(hres))
-    {
-        pLoc->Release();     
-        CoUninitialize();
-        return false;
-    }
-
-    hres = CoSetProxyBlanket(
-       pSvc,                        // Indicates the proxy to set
-       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
-       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
-       NULL,                        // Server principal name 
-       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
-       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
-       NULL,                        // client identity
-       EOAC_NONE                    // proxy capabilities 
-    );
-
-    if (FAILED(hres))
-    {
-        pSvc->Release();
-        pLoc->Release();     
-        CoUninitialize();
-       return false;
-    }
+       /* That didn't work, maybe no kittens found to kill? */
+       if (FAILED(hres))
+       {
+               pLoc->Release();
+               CoUninitialize();
+               return false;
+       }
+
+       /* Don't even ASK what this does. I'm still not too sure myself. */
+       hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL,
+               RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
 
-    return true;
+       if (FAILED(hres))
+       {
+               pSvc->Release();
+               pLoc->Release();     
+               CoUninitialize();
+               return false;
+       }
+       return true;
 }
 
 void donewmi()
 {
-    pSvc->Release();
-    pLoc->Release();
-    CoUninitialize();
+       pSvc->Release();
+       pLoc->Release();
+       CoUninitialize();
 }
 
+/* Return the CPU usage in percent of this process */
 int getcpu()
 {
-    HRESULT hres;
-
-    IEnumWbemClassObject* pEnumerator = NULL;
-    hres = pSvc->ExecQuery(
-        bstr_t("WQL"), 
-        bstr_t("Select PercentProcessorTime,IDProcess from Win32_PerfFormattedData_PerfProc_Process"),
-        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
-        NULL,
-        &pEnumerator);
+       HRESULT hres;
+
+       /* Use WQL, similar to SQL, to construct a query that lists the cpu usage and pid of all processes */
+       IEnumWbemClassObject* pEnumerator = NULL;
+       hres = pSvc->ExecQuery(bstr_t("WQL"),
+               bstr_t("Select PercentProcessorTime,IDProcess from Win32_PerfFormattedData_PerfProc_Process"),
+               WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
     
-    if (FAILED(hres))
-       return 0;
+       /* Query didn't work */
+       if (FAILED(hres))
+               return -1;
 
-    IWbemClassObject *pclsObj = NULL;
-    ULONG uReturn = 0;
-    int slotpos = 0;
+       IWbemClassObject *pclsObj = NULL;
+       ULONG uReturn = 0;
    
-    while (pEnumerator)
-    {
-        VARIANT vtProp;
-        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
-            &pclsObj, &uReturn);
-
-        if (uReturn == 0)
-            break;
-
-       /* Enumerate processes */
-        hr = pclsObj->Get(L"IDProcess", 0, &vtProp, 0, 0);
-       if (!FAILED(hr))
+       /* Iterate the query results */
+       while (pEnumerator)
        {
-               if (vtProp.uintVal == GetCurrentProcessId())
+               VARIANT vtProp;
+               /* Next item */
+               HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
+
+               /* No more items left */
+               if (uReturn == 0)
+                       break;
+
+               /* Find process ID */
+               hr = pclsObj->Get(L"IDProcess", 0, &vtProp, 0, 0);
+               if (!FAILED(hr))
                {
-                       VariantClear(&vtProp);
-                       /* Get CPU percentage for this process */
-                       hr = pclsObj->Get(L"PercentProcessorTime", 0, &vtProp, 0, 0);
-                       if (!FAILED(hr))
+                       /* Matches our process ID? */
+                       if (vtProp.uintVal == GetCurrentProcessId())
                        {
                                VariantClear(&vtProp);
-                               int cpu = 0;
-                               std::wstringstream out(vtProp.bstrVal);
-                               out >> cpu;
-                               return cpu;
+                               /* Get CPU percentage for this process */
+                               hr = pclsObj->Get(L"PercentProcessorTime", 0, &vtProp, 0, 0);
+                               if (!FAILED(hr))
+                               {
+                                       /* Deal with wide string ickyness. Who in their right
+                                        * mind puts a number in a bstrVal wide string item?!
+                                        */
+                                       VariantClear(&vtProp);
+                                       int cpu = 0;
+                                       std::wstringstream out(vtProp.bstrVal);
+                                       out >> cpu;
+                                       pEnumerator->Release();
+                                       pclsObj->Release();
+                                       return cpu;
+                               }
                        }
                }
        }
-    }
-    pEnumerator->Release();
-    pclsObj->Release();
-    return 0;
+       pEnumerator->Release();
+       pclsObj->Release();
+       return -1;
+}
+
+void usleep(unsigned long usecs)
+{
+       if (usecs > 0UL)
+       {
+               unsigned long millis = ((usecs + 999UL) / 1000UL);
+               SleepEx(millis, false);
+       }
 }