
* 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
220 lines
6.4 KiB
Diff
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;
|