_dbus_get_install_root assumes that dbus-daemon is in a bin/ subdirectory. That's...
authorFrank Osterfeld <frank@kdab.net>
Wed, 29 Apr 2009 16:03:32 +0000 (18:03 +0200)
committerRalf Habacker <ralf.habacker@freenet.de>
Mon, 30 Nov 2009 12:43:20 +0000 (13:43 +0100)
dbus/dbus-sysdeps-win.c

index f7d4856..d42d837 100644 (file)
@@ -3242,26 +3242,33 @@ _dbus_get_is_errno_eagain_or_ewouldblock (void)
  * @returns #FALSE on failure
  */
 dbus_bool_t 
-_dbus_get_install_root(char *s, int len)
-{
-  char *p = NULL;
-  int ret = GetModuleFileName(NULL,s,len);
-  if ( ret == 0 
-    || ret == len && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
-    {
-      *s = '\0';
-      return FALSE;
-    }
-  else if ((p = strstr(s,"\\bin\\")))
-    {
-      *(p+1)= '\0';
-      return TRUE;
+_dbus_get_install_root(char *prefix, int len)
+{
+    //To find the prefix, we cut the filename and also \bin\ if present
+    char* p = 0;
+    int i;
+    DWORD pathLength;
+    int lastSlash;
+    SetLastError( 0 );
+    pathLength = GetModuleFileName(NULL, prefix, len);
+    if ( pathLength == 0 || GetLastError() != 0 ) {
+        *prefix = '\0';
+        return FALSE;
     }
-  else
-    {
-      *s = '\0';
-      return FALSE;
+    lastSlash = -1;
+    for (i = 0; i < pathLength; ++i)
+        if (prefix[i] == '\\')
+            lastSlash = i;
+    if (lastSlash == -1) {
+        *prefix = '\0';
+        return FALSE;
     }
+    //cut off binary name
+    prefix[lastSlash+1] = 0;
+    //cut possible "\\bin"
+    if (lastSlash > 3 && strncmp(prefix + lastSlash - 4, "\\bin", 4) == 0)
+        prefix[lastSlash-3] = 0;
+    return TRUE;
 }
 
 /**