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 = \
|
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 \
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue