XQuartz: Check the DISPLAY environment variable to see if the socket at startup is ours. If not, ignore it and fork/exec startx.
(cherry picked from commit 3d5e10cce360a04bf917227615fb9b825675124f)
This commit is contained in:
		
							parent
							
								
									0a361d0e5f
								
							
						
					
					
						commit
						1f61bbeffd
					
				| 
						 | 
					@ -355,7 +355,7 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
 | 
				
			||||||
        return KERN_FAILURE;
 | 
					        return KERN_FAILURE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int startup_trigger(int argc, char **argv, char **envp) {
 | 
					static int startup_trigger(int argc, char **argv, char **envp) {
 | 
				
			||||||
    Display *display;
 | 
					    Display *display;
 | 
				
			||||||
    const char *s;
 | 
					    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);
 | 
					        kr = bootstrap_look_up(bootstrap_port, server_bootstrap_name, &mp);
 | 
				
			||||||
        if (kr != KERN_SUCCESS) {
 | 
					        if (kr != KERN_SUCCESS) {
 | 
				
			||||||
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
 | 
					#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
 | 
					#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
 | 
					#endif
 | 
				
			||||||
            exit(EXIT_FAILURE);
 | 
					            exit(EXIT_FAILURE);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -452,6 +452,7 @@ static void ensure_path(const char *dir) {
 | 
				
			||||||
static void setup_env() {
 | 
					static void setup_env() {
 | 
				
			||||||
    char *temp;
 | 
					    char *temp;
 | 
				
			||||||
    const char *pds = NULL;
 | 
					    const char *pds = NULL;
 | 
				
			||||||
 | 
					    const char *disp = getenv("DISPLAY");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Pass on our prefs domain to startx and its inheritors (mainly for
 | 
					    /* Pass on our prefs domain to startx and its inheritors (mainly for
 | 
				
			||||||
     * quartz-wm and the Xquartz stub's MachIPC)
 | 
					     * 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
 | 
					            if(s && *s) {
 | 
				
			||||||
     * use the launchd DISPLAY socket.
 | 
					                temp = (char *)malloc(sizeof(char) * (strlen(pds) + 3));
 | 
				
			||||||
     */
 | 
					                if(!temp) {
 | 
				
			||||||
    if(pds == NULL || strcmp(pds, "org.x.X11") != 0)
 | 
					                    fprintf(stderr, "Memory allocation error creating space for socket name test.\n");
 | 
				
			||||||
        unsetenv("DISPLAY");
 | 
					                }
 | 
				
			||||||
 | 
					                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 */
 | 
					    /* Make sure PATH is right */
 | 
				
			||||||
    ensure_path(X11BINDIR);
 | 
					    ensure_path(X11BINDIR);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,10 @@
 | 
				
			||||||
 * prior written authorization.
 | 
					 * prior written authorization.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_DIX_CONFIG_H
 | 
				
			||||||
 | 
					#include <dix-config.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <launch.h>
 | 
					#include <launch.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <errno.h>
 | 
					#include <errno.h>
 | 
				
			||||||
| 
						 | 
					@ -65,9 +69,9 @@ int launchd_display_fd() {
 | 
				
			||||||
        return ERROR_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) {
 | 
					    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;
 | 
					        return ERROR_FD;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue