XQuartz: Pass along SIGINT and SIGTERM from the stub to X11.app

(cherry picked from commit 183ca5d68b4f34e248749f304ce140de11bd451b)
This commit is contained in:
Jeremy Huddleston 2008-10-28 12:38:05 -07:00
parent 273df54685
commit f12d7ad164
4 changed files with 27 additions and 36 deletions

View File

@ -1,14 +1,12 @@
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-DBUILD_DATE=\"$(BUILD_DATE)\" \ -DBUILD_DATE=\"$(BUILD_DATE)\" \
-DXSERVER_VERSION=\"$(VERSION)\" \ -DXSERVER_VERSION=\"$(VERSION)\"
-DMACHO_STARTUP
x11appdir = $(APPLE_APPLICATIONS_DIR)/X11.app/Contents/MacOS x11appdir = $(APPLE_APPLICATIONS_DIR)/X11.app/Contents/MacOS
x11app_PROGRAMS = X11 x11app_PROGRAMS = X11
dist_X11_SOURCES = \ dist_X11_SOURCES = \
bundle-main.c bundle-main.c
# launchd_fd.c
nodist_X11_SOURCES = \ nodist_X11_SOURCES = \
mach_startupServer.c \ mach_startupServer.c \

View File

@ -37,6 +37,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <pthread.h> #include <pthread.h>
#include <stdbool.h> #include <stdbool.h>
#include <signal.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/un.h> #include <sys/un.h>
@ -96,7 +97,6 @@ static pthread_t create_thread(void *func, void *arg) {
return tid; return tid;
} }
#ifdef MACHO_STARTUP
/*** Mach-O IPC Stuffs ***/ /*** Mach-O IPC Stuffs ***/
union MaxMsgSize { union MaxMsgSize {
@ -303,6 +303,11 @@ kern_return_t do_request_fd_handoff_socket(mach_port_t port, string_t filename)
return KERN_SUCCESS; return KERN_SUCCESS;
} }
kern_return_t do_request_pid(mach_port_t port, int *my_pid) {
*my_pid = getpid();
return KERN_SUCCESS;
}
/*** Server Startup ***/ /*** Server Startup ***/
kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv, kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
mach_msg_type_number_t argvCnt, 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) { 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; Display *display;
const char *s; const char *s;
/* Take care of the case where we're called like a normal DDX */ /* Take care of the case where we're called like a normal DDX */
if(argc > 1 && argv[1][0] == ':') { if(argc > 1 && argv[1][0] == ':') {
#ifdef MACHO_STARTUP
size_t i; size_t i;
kern_return_t kr; kern_return_t kr;
mach_port_t mp; mach_port_t mp;
@ -387,10 +386,6 @@ int main(int argc, char **argv, char **envp) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
exit(EXIT_SUCCESS); 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 /* 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)); return execute(command_from_prefs("startx_script", DEFAULT_STARTX));
} }
#ifdef MACHO_STARTUP
/*** Main ***/ /*** Main ***/
int main(int argc, char **argv, char **envp) { int main(int argc, char **argv, char **envp) {
Bool listenOnly = FALSE; Bool listenOnly = FALSE;
@ -472,17 +466,6 @@ int main(int argc, char **argv, char **envp) {
return EXIT_SUCCESS; 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) { static int execute(const char *command) {
const char *newargv[7]; const char *newargv[7];

View File

@ -44,3 +44,7 @@ routine start_x11_server(
routine request_fd_handoff_socket ( routine request_fd_handoff_socket (
port : mach_port_t; port : mach_port_t;
out socket_filename : string_t); out socket_filename : string_t);
routine request_pid (
port : mach_port_t;
out pid : int);

View File

@ -48,6 +48,8 @@
#include <servers/bootstrap.h> #include <servers/bootstrap.h>
#include "mach_startup.h" #include "mach_startup.h"
#include <signal.h>
#include "launchd_fd.h" #include "launchd_fd.h"
#ifndef BUILD_DATE #ifndef BUILD_DATE
@ -61,6 +63,8 @@
static char x11_path[PATH_MAX + 1]; static char x11_path[PATH_MAX + 1];
static pid_t x11app_pid = 0;
static void set_x11_path() { static void set_x11_path() {
CFURLRef appURL = NULL; CFURLRef appURL = NULL;
CFBundleRef bundle = NULL; CFBundleRef bundle = NULL;
@ -115,7 +119,6 @@ static void set_x11_path() {
} }
} }
#ifdef MACHO_STARTUP
static int connect_to_socket(const char *filename) { static int connect_to_socket(const char *filename) {
struct sockaddr_un servaddr_un; struct sockaddr_un servaddr_un;
struct sockaddr *servaddr; struct sockaddr *servaddr;
@ -189,10 +192,13 @@ static void send_fd_handoff(int connected_fd, int launchd_fd) {
close(connected_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) { int main(int argc, char **argv, char **envp) {
#ifdef MACHO_STARTUP
int envpc; int envpc;
kern_return_t kr; kern_return_t kr;
mach_port_t mp; mach_port_t mp;
@ -201,7 +207,6 @@ int main(int argc, char **argv, char **envp) {
size_t i; size_t i;
int launchd_fd; int launchd_fd;
string_t handoff_socket_filename; string_t handoff_socket_filename;
#endif
sig_t handler; sig_t handler;
if(argc == 2 && !strcmp(argv[1], "-version")) { if(argc == 2 && !strcmp(argv[1], "-version")) {
@ -220,7 +225,10 @@ int main(int argc, char **argv, char **envp) {
kill(getppid(), SIGUSR1); kill(getppid(), SIGUSR1);
signal(SIGUSR1, handler); signal(SIGUSR1, handler);
#ifdef MACHO_STARTUP /* Pass on SIGs to X11.app */
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
/* Get the $DISPLAY FD */ /* Get the $DISPLAY FD */
launchd_fd = launchd_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 */ /* Handoff the $DISPLAY FD */
if(launchd_fd != -1) { if(launchd_fd != -1) {
size_t try, try_max; size_t try, try_max;
@ -308,9 +319,4 @@ int main(int argc, char **argv, char **envp) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
return EXIT_SUCCESS; return EXIT_SUCCESS;
#else
set_x11_path();
argv[0] = x11_path;
return execvp(x11_path, argv);
#endif
} }