Files
evolution/win32/patches/dbus.patch
Milan Crha 1dc1cf0b81 Miscellaneous Win32 related changes
* use e_util_win32_initialize() in main() to avoid code duplication
 * e-spinner - correct image path build under win32
 * export WIN32_SERVICELIBEXECDIR when building eds, which relies on it now
 * update D-Bus patch and session-local.conf creation, thus D-Bus
   can actually autostart services
2014-09-05 19:13:56 +02:00

220 lines
6.4 KiB
Diff

diff -upr -x .deps -x .libs -x '*.la' -x '*.lo' dbus-1.8.0.old/dbus/Makefile.am dbus-1.8.0/dbus/Makefile.am
--- dbus-1.8.0.old/dbus/Makefile.am 2014-09-05 16:09:18 +0000
+++ dbus-1.8.0/dbus/Makefile.am 2014-09-05 16:09:40 +0000
@@ -304,8 +304,8 @@ if DBUS_WIN
# this code is used, we don't actually need libstdc++.
noinst_LTLIBRARIES += libdbus-init-win.la
libdbus_init_win_la_SOURCES = dbus-init-win.cpp
-libdbus_1_la_LIBADD += libdbus-init-win.la
-libdbus_internal_la_LIBADD += libdbus-init-win.la
+libdbus_1_la_LIBADD += libdbus-init-win.la -lole32
+libdbus_internal_la_LIBADD += libdbus-init-win.la -lole32
endif
noinst_PROGRAMS =
diff -upr -x .deps -x .libs -x '*.la' -x '*.lo' dbus-1.8.0.old/dbus/dbus-sysdeps-util-win.c dbus-1.8.0/dbus/dbus-sysdeps-util-win.c
--- dbus-1.8.0.old/dbus/dbus-sysdeps-util-win.c 2014-09-05 16:09:18 +0000
+++ dbus-1.8.0/dbus/dbus-sysdeps-util-win.c 2014-09-05 16:09:28 +0000
@@ -1555,13 +1555,12 @@ _dbus_replace_install_prefix (const char
if ((!_dbus_get_install_root(runtime_prefix, len) ||
strncmp (configure_time_path, DBUS_PREFIX "/",
strlen (DBUS_PREFIX) + 1))) {
- strcat (retval, configure_time_path);
- return retval;
+ strcpy (retval, configure_time_path);
+ } else {
+ strcpy (retval, runtime_prefix);
+ strcat (retval, configure_time_path + strlen (DBUS_PREFIX) + 1);
}
- strcpy (retval, runtime_prefix);
- strcat (retval, configure_time_path + strlen (DBUS_PREFIX) + 1);
-
/* Somehow, in some situations, backslashes get collapsed in the string.
* Since windows C library accepts both forward and backslashes as
* path separators, convert all backslashes to forward slashes.
diff -upr -x .deps -x .libs -x '*.la' -x '*.lo' dbus-1.8.0.old/dbus/dbus-sysdeps-win.c dbus-1.8.0/dbus/dbus-sysdeps-win.c
--- dbus-1.8.0.old/dbus/dbus-sysdeps-win.c 2014-09-05 16:09:18 +0000
+++ dbus-1.8.0/dbus/dbus-sysdeps-win.c 2014-09-05 16:09:40 +0000
@@ -55,6 +55,7 @@
#include <ws2tcpip.h>
#include <wincrypt.h>
#include <iphlpapi.h>
+#include <shlobj.h>
/* Declarations missing in mingw's and windows sdk 7.0 headers */
extern BOOL WINAPI ConvertStringSidToSidA (LPCSTR StringSid, PSID *Sid);
@@ -3379,6 +3380,139 @@ _dbus_lookup_session_address (dbus_bool_
return TRUE;
}
+static char *
+get_special_folder (int csidl)
+{
+ char path[MAX_PATH+1];
+ HRESULT hr;
+ LPITEMIDLIST pidl = NULL;
+ BOOL b;
+ char *retval = NULL;
+
+ hr = SHGetSpecialFolderLocation (NULL, csidl, &pidl);
+ if (hr == S_OK)
+ {
+ b = SHGetPathFromIDListA (pidl, path);
+ if (b)
+ retval = strdup (path);
+ CoTaskMemFree (pidl);
+ }
+ return retval;
+}
+
+static char *
+get_windows_directory_root (void)
+{
+ char windowsdir[MAX_PATH];
+
+ if (GetWindowsDirectory (windowsdir, MAX_PATH))
+ {
+ /* Usually X:\Windows, but in terminal server environments
+ * might be an UNC path, AFAIK.
+ */
+ int len;
+
+ if (!*windowsdir)
+ return strdup("C:\\");
+
+ len = strlen(windowsdir);
+ if (len < MAX_PATH - 1 && windowsdir[len - 1] != '\\' && windowsdir[len - 1] != '/') {
+ char sep[2] = {0, 0}, *p;
+
+ for (p = windowsdir; *p && !*sep; p++) {
+ if (*p == '/' || *p == '\\') {
+ sep[0] = *p;
+ break;
+ }
+ }
+
+ strcat(windowsdir, sep);
+ }
+ return strdup(windowsdir);
+ }
+ else
+ return strdup("C:\\");
+}
+
+static dbus_bool_t
+_dbus_set_user_home (DBusString *homedir)
+{
+ const char *env;
+ char *tmp = NULL;
+
+ env = _dbus_getenv("HOME");
+
+ /* Only believe HOME if it is an absolute path and exists.
+ *
+ * We only do this check on Windows for a couple of reasons.
+ * Historically, we only did it there because we used to ignore $HOME
+ * on UNIX. There are concerns about enabling it now on UNIX because
+ * of things like autofs. In short, if the user has a bogus value in
+ * $HOME then they get what they pay for...
+ */
+ if (env)
+ {
+ /* In case HOME is Unix-style (it happens), convert it to
+ * Windows style.
+ */
+ char *p;
+ tmp = strdup(env);
+ while ((p = strchr(tmp, '/')) != NULL) {
+ *p = '\\';
+ }
+
+ if (!((tmp[0] == '\\' || (((tmp[0] >= 'a' && tmp[0] <= 'z') || (tmp[0] >= 'A' && tmp[0] <= 'Z')) && tmp[1] == ':')) &&
+ GetFileAttributesA (tmp) != INVALID_FILE_ATTRIBUTES &&
+ (GetFileAttributesA (tmp) & FILE_ATTRIBUTE_DIRECTORY) != 0))
+ {
+ env = NULL;
+ free(tmp);
+ tmp = NULL;
+ }
+ }
+
+ if (!tmp)
+ {
+ /* USERPROFILE is probably the closest equivalent to $HOME? */
+ env = _dbus_getenv("USERPROFILE");
+ if (env != NULL)
+ tmp = strdup(env);
+ }
+
+ if (!tmp)
+ tmp = get_special_folder(CSIDL_PROFILE);
+
+ if (!tmp)
+ tmp = get_windows_directory_root();
+
+ if (tmp) {
+ _dbus_string_append (homedir, tmp);
+ free(tmp);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+_dbus_set_homedir_from_drive_and_path_env(DBusString *homedir)
+{
+ const char *homepath;
+ const char *homedrive;
+
+ homedrive = _dbus_getenv("HOMEDRIVE");
+ if (homedrive != NULL && *homedrive != '\0')
+ {
+ _dbus_string_append(homedir,homedrive);
+ }
+
+ homepath = _dbus_getenv("HOMEPATH");
+ if (homepath != NULL && *homepath != '\0')
+ {
+ _dbus_string_append(homedir,homepath);
+ }
+}
+
/**
* Appends the directory in which a keyring for the given credentials
* should be stored. The credentials should have either a Windows or
@@ -3398,8 +3532,6 @@ _dbus_append_keyring_directory_for_crede
{
DBusString homedir;
DBusString dotdir;
- const char *homepath;
- const char *homedrive;
_dbus_assert (credentials != NULL);
_dbus_assert (!_dbus_credentials_are_anonymous (credentials));
@@ -3407,18 +3539,12 @@ _dbus_append_keyring_directory_for_crede
if (!_dbus_string_init (&homedir))
return FALSE;
- homedrive = _dbus_getenv("HOMEDRIVE");
- if (homedrive != NULL && *homedrive != '\0')
- {
- _dbus_string_append(&homedir,homedrive);
- }
+ _dbus_string_set_length(&homedir, 0);
+ if (!_dbus_set_user_home(&homedir)) {
+ _dbus_string_set_length(&homedir, 0);
+ _dbus_set_homedir_from_drive_and_path_env(&homedir);
+ }
- homepath = _dbus_getenv("HOMEPATH");
- if (homepath != NULL && *homepath != '\0')
- {
- _dbus_string_append(&homedir,homepath);
- }
-
#ifdef DBUS_ENABLE_EMBEDDED_TESTS
{
const char *override;