XQuartz: Pass along SIGINT and SIGTERM from the stub to X11.app
(cherry picked from commit 183ca5d68b4f34e248749f304ce140de11bd451b)
This commit is contained in:
		
							parent
							
								
									273df54685
								
							
						
					
					
						commit
						f12d7ad164
					
				| 
						 | 
				
			
			@ -1,14 +1,12 @@
 | 
			
		|||
AM_CPPFLAGS = \
 | 
			
		||||
	-DBUILD_DATE=\"$(BUILD_DATE)\" \
 | 
			
		||||
	-DXSERVER_VERSION=\"$(VERSION)\" \
 | 
			
		||||
	-DMACHO_STARTUP
 | 
			
		||||
	-DXSERVER_VERSION=\"$(VERSION)\"
 | 
			
		||||
 | 
			
		||||
x11appdir = $(APPLE_APPLICATIONS_DIR)/X11.app/Contents/MacOS
 | 
			
		||||
x11app_PROGRAMS = X11
 | 
			
		||||
 | 
			
		||||
dist_X11_SOURCES = \
 | 
			
		||||
	bundle-main.c 
 | 
			
		||||
#	launchd_fd.c
 | 
			
		||||
 | 
			
		||||
nodist_X11_SOURCES = \
 | 
			
		||||
	mach_startupServer.c \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,7 @@
 | 
			
		|||
#include <stdlib.h>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <sys/un.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +97,6 @@ static pthread_t create_thread(void *func, void *arg) {
 | 
			
		|||
    return tid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef MACHO_STARTUP
 | 
			
		||||
/*** Mach-O IPC Stuffs ***/
 | 
			
		||||
 | 
			
		||||
union MaxMsgSize {
 | 
			
		||||
| 
						 | 
				
			
			@ -303,6 +303,11 @@ kern_return_t do_request_fd_handoff_socket(mach_port_t port, string_t filename)
 | 
			
		|||
    return KERN_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
kern_return_t do_request_pid(mach_port_t port, int *my_pid) {
 | 
			
		||||
    *my_pid = getpid();
 | 
			
		||||
    return KERN_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*** Server Startup ***/
 | 
			
		||||
kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
 | 
			
		||||
                                  mach_msg_type_number_t argvCnt,
 | 
			
		||||
| 
						 | 
				
			
			@ -336,17 +341,11 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
int startup_trigger(int argc, char **argv, char **envp) {
 | 
			
		||||
#else
 | 
			
		||||
void *add_launchd_display_thread(void *data);
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv, char **envp) {
 | 
			
		||||
#endif
 | 
			
		||||
    Display *display;
 | 
			
		||||
    const char *s;
 | 
			
		||||
    
 | 
			
		||||
    /* Take care of the case where we're called like a normal DDX */
 | 
			
		||||
    if(argc > 1 && argv[1][0] == ':') {
 | 
			
		||||
#ifdef MACHO_STARTUP
 | 
			
		||||
        size_t i;
 | 
			
		||||
        kern_return_t kr;
 | 
			
		||||
        mach_port_t mp;
 | 
			
		||||
| 
						 | 
				
			
			@ -387,10 +386,6 @@ int main(int argc, char **argv, char **envp) {
 | 
			
		|||
            exit(EXIT_FAILURE);
 | 
			
		||||
        }
 | 
			
		||||
        exit(EXIT_SUCCESS);
 | 
			
		||||
#else
 | 
			
		||||
        create_thread(add_launchd_display_thread, NULL);
 | 
			
		||||
        return server_main(argc, argv, envp);
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* If we have a process serial number and it's our only arg, act as if
 | 
			
		||||
| 
						 | 
				
			
			@ -424,7 +419,6 @@ int main(int argc, char **argv, char **envp) {
 | 
			
		|||
    return execute(command_from_prefs("startx_script", DEFAULT_STARTX));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef MACHO_STARTUP
 | 
			
		||||
/*** Main ***/
 | 
			
		||||
int main(int argc, char **argv, char **envp) {
 | 
			
		||||
    Bool listenOnly = FALSE;
 | 
			
		||||
| 
						 | 
				
			
			@ -472,17 +466,6 @@ int main(int argc, char **argv, char **envp) {
 | 
			
		|||
    
 | 
			
		||||
    return EXIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
void *add_launchd_display_thread(void *data) {
 | 
			
		||||
    /* Start listening on the launchd fd */
 | 
			
		||||
    int launchd_fd = launchd_display_fd();
 | 
			
		||||
    if(launchd_fd != -1) {
 | 
			
		||||
        DarwinListenOnOpenFD(launchd_fd);
 | 
			
		||||
    }
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
    
 | 
			
		||||
static int execute(const char *command) {
 | 
			
		||||
    const char *newargv[7];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,3 +44,7 @@ routine start_x11_server(
 | 
			
		|||
routine request_fd_handoff_socket (
 | 
			
		||||
        port             : mach_port_t;
 | 
			
		||||
    out socket_filename  : string_t);
 | 
			
		||||
 | 
			
		||||
routine request_pid (
 | 
			
		||||
        port    : mach_port_t;
 | 
			
		||||
    out pid     : int);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,6 +48,8 @@
 | 
			
		|||
#include <servers/bootstrap.h>
 | 
			
		||||
#include "mach_startup.h"
 | 
			
		||||
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
 | 
			
		||||
#include "launchd_fd.h"
 | 
			
		||||
 | 
			
		||||
#ifndef BUILD_DATE
 | 
			
		||||
| 
						 | 
				
			
			@ -61,6 +63,8 @@
 | 
			
		|||
 | 
			
		||||
static char x11_path[PATH_MAX + 1];
 | 
			
		||||
 | 
			
		||||
static pid_t x11app_pid = 0;
 | 
			
		||||
 | 
			
		||||
static void set_x11_path() {
 | 
			
		||||
    CFURLRef appURL = NULL;
 | 
			
		||||
    CFBundleRef bundle = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -115,7 +119,6 @@ static void set_x11_path() {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef MACHO_STARTUP
 | 
			
		||||
static int connect_to_socket(const char *filename) {
 | 
			
		||||
    struct sockaddr_un servaddr_un;
 | 
			
		||||
    struct sockaddr *servaddr;
 | 
			
		||||
| 
						 | 
				
			
			@ -189,10 +192,13 @@ static void send_fd_handoff(int connected_fd, int launchd_fd) {
 | 
			
		|||
    close(connected_fd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
static void signal_handler(int sig) {
 | 
			
		||||
    if(x11app_pid)
 | 
			
		||||
        kill(x11app_pid, sig);
 | 
			
		||||
    _exit(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv, char **envp) {
 | 
			
		||||
#ifdef MACHO_STARTUP
 | 
			
		||||
    int envpc;
 | 
			
		||||
    kern_return_t kr;
 | 
			
		||||
    mach_port_t mp;
 | 
			
		||||
| 
						 | 
				
			
			@ -201,7 +207,6 @@ int main(int argc, char **argv, char **envp) {
 | 
			
		|||
    size_t i;
 | 
			
		||||
    int launchd_fd;
 | 
			
		||||
    string_t handoff_socket_filename;
 | 
			
		||||
#endif
 | 
			
		||||
    sig_t handler;
 | 
			
		||||
 | 
			
		||||
    if(argc == 2 && !strcmp(argv[1], "-version")) {
 | 
			
		||||
| 
						 | 
				
			
			@ -220,7 +225,10 @@ int main(int argc, char **argv, char **envp) {
 | 
			
		|||
        kill(getppid(), SIGUSR1);
 | 
			
		||||
    signal(SIGUSR1, handler);
 | 
			
		||||
 | 
			
		||||
#ifdef MACHO_STARTUP
 | 
			
		||||
    /* Pass on SIGs to X11.app */
 | 
			
		||||
    signal(SIGINT, signal_handler);
 | 
			
		||||
    signal(SIGTERM, signal_handler);
 | 
			
		||||
    
 | 
			
		||||
    /* Get the $DISPLAY FD */
 | 
			
		||||
    launchd_fd = launchd_display_fd();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -258,6 +266,9 @@ int main(int argc, char **argv, char **envp) {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /* Get X11.app's pid */
 | 
			
		||||
    request_pid(mp, &x11app_pid);
 | 
			
		||||
 | 
			
		||||
    /* Handoff the $DISPLAY FD */
 | 
			
		||||
    if(launchd_fd != -1) {
 | 
			
		||||
        size_t try, try_max;
 | 
			
		||||
| 
						 | 
				
			
			@ -308,9 +319,4 @@ int main(int argc, char **argv, char **envp) {
 | 
			
		|||
        return EXIT_FAILURE;
 | 
			
		||||
    }
 | 
			
		||||
    return EXIT_SUCCESS;
 | 
			
		||||
#else
 | 
			
		||||
    set_x11_path();
 | 
			
		||||
    argv[0] = x11_path;
 | 
			
		||||
    return execvp(x11_path, argv);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue