summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Huddleston <jeremyhu@freedesktop.org>2009-09-04 00:38:58 -0700
committerJeremy Huddleston <jeremyhu@freedesktop.org>2009-09-04 00:38:58 -0700
commit3d5e10cce360a04bf917227615fb9b825675124f (patch)
tree682213892d56d36d48bfa974b7616281565324e4
parent990038ab006b2f5e03dcef385514ba4e4584bd25 (diff)
XQuartz: Check the DISPLAY environment variable to see if the socket at startup is ours. If not, ignore it and fork/exec startx.
-rw-r--r--hw/xquartz/mach-startup/bundle-main.c44
-rw-r--r--hw/xquartz/mach-startup/launchd_fd.c8
2 files changed, 42 insertions, 10 deletions
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 583d67ea1..be5d24ba3 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -355,7 +355,7 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
return KERN_FAILURE;
}
-int startup_trigger(int argc, char **argv, char **envp) {
+static int startup_trigger(int argc, char **argv, char **envp) {
Display *display;
const char *s;
@@ -392,9 +392,9 @@ int startup_trigger(int argc, char **argv, char **envp) {
kr = bootstrap_look_up(bootstrap_port, server_bootstrap_name, &mp);
if (kr != KERN_SUCCESS) {
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- fprintf(stderr, "bootstrap_look_up(): %s\n", bootstrap_strerror(kr));
+ fprintf(stderr, "bootstrap_look_up(%s): %s\n", server_bootstrap_name, bootstrap_strerror(kr));
#else
- fprintf(stderr, "bootstrap_look_up(): %ul\n", (unsigned long)kr);
+ fprintf(stderr, "bootstrap_look_up(%s): %ul\n", server_bootstrap_name, (unsigned long)kr);
#endif
exit(EXIT_FAILURE);
}
@@ -452,6 +452,7 @@ static void ensure_path(const char *dir) {
static void setup_env() {
char *temp;
const char *pds = NULL;
+ const char *disp = getenv("DISPLAY");
/* Pass on our prefs domain to startx and its inheritors (mainly for
* quartz-wm and the Xquartz stub's MachIPC)
@@ -468,12 +469,39 @@ static void setup_env() {
}
}
}
+ /* We need to unset DISPLAY if it is not our socket */
+ if(disp) {
+ if(!pds) {
+ /* If we can't detet our id, we are beyond hope and need to just
+ * revert to the non-launchd startup */
+ unsetenv("DISPLAY");
+ } else {
+ /* s = basename(disp) */
+ const char *d, *s;
+ for(s = NULL, d = disp; *d; d++) {
+ if(*d == '/')
+ s = d + 1;
+ }
- /* If we're not org.x.X11, we want to unset DISPLAY, so we don't
- * use the launchd DISPLAY socket.
- */
- if(pds == NULL || strcmp(pds, "org.x.X11") != 0)
- unsetenv("DISPLAY");
+ if(s && *s) {
+ temp = (char *)malloc(sizeof(char) * (strlen(pds) + 3));
+ if(!temp) {
+ fprintf(stderr, "Memory allocation error creating space for socket name test.\n");
+ }
+ strcpy(temp, pds);
+ strcat(temp, ":0");
+
+ if(strcpy(temp, s) != 0) {
+ /* If we don't have a match, unset it. */
+ unsetenv("DISPLAY");
+ }
+ free(temp);
+ } else {
+ /* The DISPLAY environment variable is not formatted like a launchd socket, so reset. */
+ unsetenv("DISPLAY");
+ }
+ }
+ }
/* Make sure PATH is right */
ensure_path(X11BINDIR);
diff --git a/hw/xquartz/mach-startup/launchd_fd.c b/hw/xquartz/mach-startup/launchd_fd.c
index 44a243a58..51017d630 100644
--- a/hw/xquartz/mach-startup/launchd_fd.c
+++ b/hw/xquartz/mach-startup/launchd_fd.c
@@ -26,6 +26,10 @@
* prior written authorization.
*/
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
#include <launch.h>
#include <stdio.h>
#include <errno.h>
@@ -65,9 +69,9 @@ int launchd_display_fd() {
return ERROR_FD;
}
- listening_fd_array = launch_data_dict_lookup(sockets_dict, ":0");
+ listening_fd_array = launch_data_dict_lookup(sockets_dict, LAUNCHD_ID_PREFIX":0");
if (NULL == listening_fd_array) {
- fprintf(stderr,"launchd check-in: No known sockets found to answer requests on!\n");
+ fprintf(stderr,"launchd check-in: No known sockets found to answer requests on! %s failed.\n", LAUNCHD_ID_PREFIX".startx:0");
return ERROR_FD;
}