xserver: Branch 'xorg-server-1.4-apple'

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Tue Oct 28 12:38:34 PDT 2008


 hw/xquartz/mach-startup/Makefile.am       |    4 +---
 hw/xquartz/mach-startup/bundle-main.c     |   29 ++++++-----------------------
 hw/xquartz/mach-startup/mach_startup.defs |    4 ++++
 hw/xquartz/mach-startup/stub.c            |   26 ++++++++++++++++----------
 4 files changed, 27 insertions(+), 36 deletions(-)

New commits:
commit 183ca5d68b4f34e248749f304ce140de11bd451b
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Oct 28 12:38:05 2008 -0700

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

diff --git a/hw/xquartz/mach-startup/Makefile.am b/hw/xquartz/mach-startup/Makefile.am
index 97539e1..800fb0c 100644
--- a/hw/xquartz/mach-startup/Makefile.am
+++ b/hw/xquartz/mach-startup/Makefile.am
@@ -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 \
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 576a370..9f03647 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.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];
diff --git a/hw/xquartz/mach-startup/mach_startup.defs b/hw/xquartz/mach-startup/mach_startup.defs
index 76c8edf..e47f49c 100644
--- a/hw/xquartz/mach-startup/mach_startup.defs
+++ b/hw/xquartz/mach-startup/mach_startup.defs
@@ -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);
diff --git a/hw/xquartz/mach-startup/stub.c b/hw/xquartz/mach-startup/stub.c
index 192a432..8bbd4d9 100644
--- a/hw/xquartz/mach-startup/stub.c
+++ b/hw/xquartz/mach-startup/stub.c
@@ -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
 }


More information about the xorg-commit mailing list