diff options
author | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2009-09-04 00:38:58 -0700 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2009-09-04 00:38:58 -0700 |
commit | 3d5e10cce360a04bf917227615fb9b825675124f (patch) | |
tree | 682213892d56d36d48bfa974b7616281565324e4 | |
parent | 990038ab006b2f5e03dcef385514ba4e4584bd25 (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.c | 44 | ||||
-rw-r--r-- | hw/xquartz/mach-startup/launchd_fd.c | 8 |
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; } |