xserver: Branch 'xorg-server-1.5-apple' - 5 commits
Jeremy Huddleston
jeremyhu at kemper.freedesktop.org
Wed Jun 4 12:23:55 PDT 2008
hw/xquartz/Makefile.am | 4 -
hw/xquartz/darwinEvents.c | 55 ++++++++++++------
hw/xquartz/mach-startup/Makefile.am | 22 +++----
hw/xquartz/mach-startup/bundle-main.c | 83 +++++++++-------------------
hw/xquartz/mach-startup/stub.c | 99 +++++++++++++++++++++-------------
5 files changed, 139 insertions(+), 124 deletions(-)
New commits:
commit 500ace5659edb1d71e1b4d8916201e82eccf2258
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date: Wed Jun 4 12:19:28 2008 -0700
XQuartz: Removed async debugging sleep
(cherry picked from commit 7812a8bdf9fab651ea5c07b852b2999547ec628d)
diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 1e79cd3..151aaa0 100644
--- a/hw/xquartz/darwinEvents.c
+++ b/hw/xquartz/darwinEvents.c
@@ -101,8 +101,10 @@ static inline void darwinEvents_lock(void) {
* when darwinEvents == NULL
*
* TODO: Cleanup this race more elegantly.
+ *
+ * For some reason, xinitrc doesn't run until after this anyways... =/
+ * sleep(2);
*/
- sleep(2);
}
}
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 1c32518..d7b6c37 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -160,9 +160,7 @@ static void accept_fd_handoff(int connected_fd) {
if(launchd_fd == -1)
fprintf(stderr, "Error receiving $DISPLAY file descriptor, no descriptor received? %d\n", launchd_fd);
- fprintf(stderr, "Received new DISPLAY fd (1): %d\n", launchd_fd);
- sleep(10);
- fprintf(stderr, "Received new DISPLAY fd (2): %d\n", launchd_fd);
+ fprintf(stderr, "Received new DISPLAY fd: %d\n", launchd_fd);
DarwinListenOnOpenFD(launchd_fd);
}
@@ -354,6 +352,9 @@ int main(int argc, char **argv, char **envp) {
/* Could open the display, start the launcher */
XCloseDisplay(display);
+ /* TODO: Clean up this race better... givint xinitrc time to run. */
+ sleep(2);
+
return execute(command_from_prefs("app_to_run", DEFAULT_CLIENT));
}
}
commit 677c8d6af735fe814b7ff9fa158b848d24226ed3
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date: Wed Jun 4 12:01:19 2008 -0700
XQuartz: use a condition variable to signal when darwinEvents is ready rather than polling
(cherry picked from commit ff1c443cadf11d12a7d939e51194f6105153870e)
diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 0ecb064..1e79cd3 100644
--- a/hw/xquartz/darwinEvents.c
+++ b/hw/xquartz/darwinEvents.c
@@ -80,21 +80,36 @@ void QuartzModeEQInit(void);
static int old_flags = 0; // last known modifier state
static xEvent *darwinEvents = NULL;
-static pthread_mutex_t darwinEvents_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static pthread_mutex_t mieq_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t mieq_ready_cond = PTHREAD_COND_INITIALIZER;
static inline void darwinEvents_lock(void) {
int err;
- if((err = pthread_mutex_lock(&darwinEvents_mutex))) {
- ErrorF("%s:%s:%d: Failed to lock darwinEvents_mutex: %d\n",
+ if((err = pthread_mutex_lock(&mieq_lock))) {
+ ErrorF("%s:%s:%d: Failed to lock mieq_lock: %d\n",
__FILE__, __FUNCTION__, __LINE__, err);
spewCallStack();
}
+ if(darwinEvents == NULL) {
+ pthread_cond_wait(&mieq_ready_cond, &mieq_lock);
+
+ /* We want to give xinit time to finish running xinitrc before we accept
+ * the launchd socket connection.
+ *
+ * Yes, we lock then immediately unlock because the lock does a cond_wait
+ * when darwinEvents == NULL
+ *
+ * TODO: Cleanup this race more elegantly.
+ */
+ sleep(2);
+ }
}
static inline void darwinEvents_unlock(void) {
int err;
- if((err = pthread_mutex_unlock(&darwinEvents_mutex))) {
- ErrorF("%s:%s:%d: Failed to unlock darwinEvents_mutex: %d\n",
+ if((err = pthread_mutex_unlock(&mieq_lock))) {
+ ErrorF("%s:%s:%d: Failed to unlock mieq_lock: %d\n",
__FILE__, __FUNCTION__, __LINE__, err);
spewCallStack();
}
@@ -333,11 +348,17 @@ Bool DarwinEQInit(void) {
QuartzModeEQInit();
- if (!darwinEvents)
+ if (!darwinEvents) {
darwinEvents = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
- if (!darwinEvents)
- FatalError("Couldn't allocate event buffer\n");
-
+
+ if (!darwinEvents)
+ FatalError("Couldn't allocate event buffer\n");
+
+ darwinEvents_lock();
+ pthread_cond_broadcast(&mieq_ready_cond);
+ darwinEvents_unlock();
+ }
+
return TRUE;
}
@@ -453,7 +474,6 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin
POINTER_ABSOLUTE, 0, dev==darwinTablet?5:2, valuators);
for(i=0; i<num_events; i++) mieqEnqueue (dev, &darwinEvents[i]);
DarwinPokeEQ();
-
} darwinEvents_unlock();
}
@@ -578,13 +598,8 @@ void DarwinSendDDXEvent(int type, int argc, ...) {
va_end (args);
}
- /* If we're called from something other than the X server thread, we need
- * to wait for the X server to setup darwinEvents.
- */
- while(darwinEvents == NULL) {
- usleep(250000);
- }
-
- mieqEnqueue(darwinPointer, &xe);
- DarwinPokeEQ();
+ darwinEvents_lock(); {
+ mieqEnqueue(darwinPointer, &xe);
+ DarwinPokeEQ();
+ } darwinEvents_unlock();
}
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 9a50668..1c32518 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -412,11 +412,6 @@ int main(int argc, char **argv, char **envp) {
}
#else
void *add_launchd_display_thread(void *data) {
- /* TODO: Really fix this race... we want xinitrc to finish before connections
- * are accepted on the launchd socket.
- */
- sleep(2);
-
/* Start listening on the launchd fd */
int launchd_fd = launchd_display_fd();
if(launchd_fd != -1) {
commit 9e30e41c6e3f448c0d3e0ca11ca63a9a5c3c2805
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date: Wed Jun 4 11:35:24 2008 -0700
XQuartz: Don't forget to destroy the mutex and cond after we're done with them
(cherry picked from commit c3558bb8cd889e5b957190e9f5d23afad1e17b72)
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 67c338f..9a50668 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -203,15 +203,15 @@ static void socket_handoff_thread(void *arg) {
fprintf(stderr, "Failed to create socket: %s - %s\n", filename, strerror(errno));
data->retval = EXIT_FAILURE;
- pthread_mutex_unlock(&data->lock);
pthread_cond_broadcast(&data->cond);
+ pthread_mutex_unlock(&data->lock);
return;
}
/* Let the dispatch thread now tell the caller that we're ready */
data->retval = EXIT_SUCCESS;
- pthread_mutex_unlock(&data->lock);
pthread_cond_broadcast(&data->cond);
+ pthread_mutex_unlock(&data->lock);
if(connect(handoff_fd, servaddr, servaddr_len) < 0) {
fprintf(stderr, "Failed to connect to socket: %s - %s\n", filename, strerror(errno));
@@ -227,6 +227,7 @@ static void socket_handoff_thread(void *arg) {
kern_return_t do_prep_fd_handoff(mach_port_t port, string_t socket_filename) {
handoff_data_t handoff_data;
+ /* Initialize our data */
pthread_mutex_init(&handoff_data.lock, NULL);
pthread_cond_init(&handoff_data.cond, NULL);
strlcpy(handoff_data.socket_filename, socket_filename, STRING_T_SIZE);
@@ -234,9 +235,15 @@ kern_return_t do_prep_fd_handoff(mach_port_t port, string_t socket_filename) {
pthread_mutex_lock(&handoff_data.lock);
create_thread(socket_handoff_thread, &handoff_data);
-
+
+ /* Wait for our return value */
pthread_cond_wait(&handoff_data.cond, &handoff_data.lock);
+ pthread_mutex_unlock(&handoff_data.lock);
+ /* Cleanup */
+ pthread_cond_destroy(&handoff_data.cond);
+ pthread_mutex_destroy(&handoff_data.lock);
+
return handoff_data.retval;
}
commit 469b649e137c955ea1e8e36c7e9f19ae982471ff
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date: Wed Jun 4 11:18:52 2008 -0700
XQuartz: Fork for trigger
(cherry picked from commit dd0f8a0f59593d7831fe09a2a086fcd57c84910e)
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 943ec54..67c338f 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -79,12 +79,6 @@ static pthread_t create_thread(void *func, void *arg) {
}
#ifdef NEW_LAUNCH_METHOD
-struct arg {
- int argc;
- char **argv;
- char **envp;
-};
-
/*** Mach-O IPC Stuffs ***/
union MaxMsgSize {
@@ -368,12 +362,6 @@ int main(int argc, char **argv, char **envp) {
}
#ifdef NEW_LAUNCH_METHOD
-static void startup_trigger_thread(void *arg) {
- struct arg args = *((struct arg *)arg);
- free(arg);
- startup_trigger(args.argc, args.argv, args.envp);
-}
-
/*** Main ***/
int main(int argc, char **argv, char **envp) {
Bool listenOnly = FALSE;
@@ -400,21 +388,13 @@ int main(int argc, char **argv, char **envp) {
* thread handle it.
*/
if(!listenOnly) {
- struct arg *args = (struct arg*)malloc(sizeof(struct arg));
- if(!args) {
- fprintf(stderr, "Memory allocation error.\n");
- return EXIT_FAILURE;
+ if(fork() == 0) {
+ return startup_trigger(argc, argv, envp);
}
-
- args->argc = argc;
- args->argv = argv;
- args->envp = envp;
-
- create_thread(startup_trigger_thread, args);
}
/* Main event loop */
- fprintf(stderr, "Statrup coming...\n");
+ fprintf(stderr, "Waiting for startup parameters via Mach IPC.\n");
kr = mach_msg_server(mach_startup_server, mxmsgsz, mp, 0);
if (kr != KERN_SUCCESS) {
fprintf(stderr, "org.x.X11(mp): %s\n", mach_error_string(kr));
commit 17fb292b528da72b9ec8c4d5119dca45947e49a0
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date: Tue Jun 3 00:06:26 2008 -0700
XQuartz: Switched over to new startup path for testing. Cleaned it up a bit. Server still crashes when using the icon to launch =/
(cherry picked from commit 7f840e9dc180421eaa9b0ea3ab993fdd5b2466e5)
diff --git a/hw/xquartz/Makefile.am b/hw/xquartz/Makefile.am
index cc39c9d..69778c1 100644
--- a/hw/xquartz/Makefile.am
+++ b/hw/xquartz/Makefile.am
@@ -7,8 +7,8 @@ AM_CPPFLAGS = \
-DINXQUARTZ \
-DUSE_NEW_CLUT \
-DXFree86Server \
- -I$(top_srcdir)/miext/rootless
-# -DNEW_LAUNCH_METHOD
+ -I$(top_srcdir)/miext/rootless \
+ -DNEW_LAUNCH_METHOD
SUBDIRS = bundle . GL xpr mach-startup doc
diff --git a/hw/xquartz/mach-startup/Makefile.am b/hw/xquartz/mach-startup/Makefile.am
index 11f6ba6..59018a9 100644
--- a/hw/xquartz/mach-startup/Makefile.am
+++ b/hw/xquartz/mach-startup/Makefile.am
@@ -1,18 +1,18 @@
AM_CPPFLAGS = \
-DBUILD_DATE=\"$(BUILD_DATE)\" \
- -DXSERVER_VERSION=\"$(VERSION)\"
-# -DNEW_LAUNCH_METHOD -DNEW_LAUNCH_METHOD_2
+ -DXSERVER_VERSION=\"$(VERSION)\" \
+ -DNEW_LAUNCH_METHOD -DNEW_LAUNCH_METHOD_2
x11appdir = $(APPLE_APPLICATIONS_DIR)/X11.app/Contents/MacOS
x11app_PROGRAMS = X11
dist_X11_SOURCES = \
- bundle-main.c \
- launchd_fd.c
+ bundle-main.c
+# launchd_fd.c
-#nodist_X11_SOURCES = \
-# mach_startupServer.c \
-# mach_startupUser.c
+nodist_X11_SOURCES = \
+ mach_startupServer.c \
+ mach_startupUser.c
X11_LDADD = \
$(top_builddir)/hw/xquartz/libXquartz.la \
@@ -34,11 +34,11 @@ X11_LDFLAGS = \
bin_PROGRAMS = Xquartz
dist_Xquartz_SOURCES = \
- stub.c
-# launchd_fd.c
+ stub.c \
+ launchd_fd.c
-#nodist_Xquartz_SOURCES = \
-# mach_startupUser.c
+nodist_Xquartz_SOURCES = \
+ mach_startupUser.c
Xquartz_LDFLAGS = \
-Wl,-framework,CoreServices
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 0068e02..943ec54 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -48,9 +48,9 @@
#include "mach_startupServer.h"
#include "launchd_fd.h"
+/* From darwinEvents.c ... but don't want to pull in all the server cruft */
void DarwinListenOnOpenFD(int fd);
-
#define DEFAULT_CLIENT "/usr/X11/bin/xterm"
#define DEFAULT_STARTX "/usr/X11/bin/startx"
#define DEFAULT_SHELL "/bin/sh"
@@ -124,9 +124,6 @@ static mach_port_t checkin_or_register(char *bname) {
}
/*** $DISPLAY handoff ***/
-/* From darwinEvents.c ... but don't want to pull in all the server cruft */
-void DarwinListenOnOpenFD(int fd);
-
static void accept_fd_handoff(int connected_fd) {
int launchd_fd;
@@ -169,7 +166,9 @@ static void accept_fd_handoff(int connected_fd) {
if(launchd_fd == -1)
fprintf(stderr, "Error receiving $DISPLAY file descriptor, no descriptor received? %d\n", launchd_fd);
- fprintf(stderr, "Received new DISPLAY fd: %d\n", launchd_fd);
+ fprintf(stderr, "Received new DISPLAY fd (1): %d\n", launchd_fd);
+ sleep(10);
+ fprintf(stderr, "Received new DISPLAY fd (2): %d\n", launchd_fd);
DarwinListenOnOpenFD(launchd_fd);
}
@@ -189,7 +188,7 @@ static void socket_handoff_thread(void *arg) {
struct sockaddr_un servaddr_un;
struct sockaddr *servaddr;
socklen_t servaddr_len;
- int handoff_fd, connected_fd;
+ int handoff_fd;
/* We need to save it since data dies after we pthread_cond_broadcast */
strlcpy(filename, data->socket_filename, STRING_T_SIZE);
@@ -208,40 +207,27 @@ static void socket_handoff_thread(void *arg) {
handoff_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if(handoff_fd == 0) {
fprintf(stderr, "Failed to create socket: %s - %s\n", filename, strerror(errno));
+
data->retval = EXIT_FAILURE;
- return;
- }
-
- if(bind(handoff_fd, servaddr, servaddr_len) != 0) {
- fprintf(stderr, "Failed to bind socket: %s - %s\n", filename, strerror(errno));
- data->retval = EXIT_FAILURE;
- return;
- }
-
- if(listen(handoff_fd, 10) != 0) {
- fprintf(stderr, "Failed to listen to socket: %s - %s\n", filename, strerror(errno));
- data->retval = EXIT_FAILURE;
+ pthread_mutex_unlock(&data->lock);
+ pthread_cond_broadcast(&data->cond);
return;
}
- /* Let the dispatch thread now tell the caller that we're listening */
+ /* Let the dispatch thread now tell the caller that we're ready */
data->retval = EXIT_SUCCESS;
pthread_mutex_unlock(&data->lock);
pthread_cond_broadcast(&data->cond);
- connected_fd = accept(handoff_fd, NULL, NULL);
-
- if(connected_fd == -1) {
- fprintf(stderr, "Failed to accept incoming connection on socket: %s - %s\n", filename, strerror(errno));
+ if(connect(handoff_fd, servaddr, servaddr_len) < 0) {
+ fprintf(stderr, "Failed to connect to socket: %s - %s\n", filename, strerror(errno));
return;
}
/* Now actually get the passed file descriptor from this connection */
- accept_fd_handoff(connected_fd);
+ accept_fd_handoff(handoff_fd);
- close(connected_fd);
close(handoff_fd);
- unlink(filename);
}
kern_return_t do_prep_fd_handoff(mach_port_t port, string_t socket_filename) {
@@ -273,9 +259,11 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
if(!_argv || !_envp) {
return KERN_FAILURE;
}
-
+
+ fprintf(stderr, "X11.app: do_start_x11_server(): argc=%d\n", argvCnt);
for(i=0; i < argvCnt; i++) {
_argv[i] = argv[i];
+ fprintf(stderr, "\targv[%u] = %s\n", (unsigned)i, argv[i]);
}
_argv[argvCnt] = NULL;
diff --git a/hw/xquartz/mach-startup/stub.c b/hw/xquartz/mach-startup/stub.c
index 854b71c..d48ae74 100644
--- a/hw/xquartz/mach-startup/stub.c
+++ b/hw/xquartz/mach-startup/stub.c
@@ -113,9 +113,53 @@ static void set_x11_path() {
}
}
+#ifdef NEW_LAUNCH_METHOD
+static int create_socket(char *filename_out) {
+ struct sockaddr_un servaddr_un;
+ struct sockaddr *servaddr;
+ socklen_t servaddr_len;
+ int ret_fd;
+ size_t try, try_max;
+
+ for(try=0, try_max=5; try < try_max; try++) {
+ tmpnam(filename_out);
+
+ /* Setup servaddr_un */
+ memset (&servaddr_un, 0, sizeof (struct sockaddr_un));
+ servaddr_un.sun_family = AF_UNIX;
+ strlcpy(servaddr_un.sun_path, filename_out, sizeof(servaddr_un.sun_path));
+
+ servaddr = (struct sockaddr *) &servaddr_un;
+ servaddr_len = sizeof(struct sockaddr_un) - sizeof(servaddr_un.sun_path) + strlen(filename_out);
+
+ ret_fd = socket(PF_UNIX, SOCK_STREAM, 0);
+ if(ret_fd == 0) {
+ fprintf(stderr, "Failed to create socket (try %d / %d): %s - %s\n", (int)try+1, (int)try_max, filename_out, strerror(errno));
+ continue;
+ }
+
+ if(bind(ret_fd, servaddr, servaddr_len) != 0) {
+ fprintf(stderr, "Failed to bind socket: %s - %s\n", filename_out, strerror(errno));
+ close(ret_fd);
+ return 0;
+ }
+
+ if(listen(ret_fd, 10) != 0) {
+ fprintf(stderr, "Failed to listen to socket: %s - %s\n", filename_out, strerror(errno));
+ close(ret_fd);
+ return 0;
+ }
+
+ return ret_fd;
+ }
+
+ return 0;
+}
+
static void send_fd_handoff(int handoff_fd, int launchd_fd) {
char databuf[] = "display";
struct iovec iov[1];
+ int connected_fd;
iov[0].iov_base = databuf;
iov[0].iov_len = sizeof(databuf);
@@ -143,44 +187,21 @@ static void send_fd_handoff(int handoff_fd, int launchd_fd) {
*((int*)CMSG_DATA(cmsg)) = launchd_fd;
- if (sendmsg(handoff_fd, &msg, 0) < 0) {
- fprintf(stderr, "Error sending $DISPLAY file descriptor: %s\n", strerror(errno));
+ connected_fd = accept(handoff_fd, NULL, NULL);
+ if(connected_fd == -1) {
+ fprintf(stderr, "Failed to accept incoming connection on socket: %s\n", strerror(errno));
return;
}
-
- fprintf(stderr, "send %d %d %d %s\n", handoff_fd, launchd_fd, errno, strerror(errno));
-}
-
-static void handoff_fd(const char *filename, int launchd_fd) {
- struct sockaddr_un servaddr_un;
- struct sockaddr *servaddr;
- socklen_t servaddr_len;
- int handoff_fd;
-
- /* Setup servaddr_un */
- memset (&servaddr_un, 0, sizeof (struct sockaddr_un));
- servaddr_un.sun_family = AF_UNIX;
- strlcpy(servaddr_un.sun_path, filename, sizeof(servaddr_un.sun_path));
-
- servaddr = (struct sockaddr *) &servaddr_un;
- servaddr_len = sizeof(struct sockaddr_un) - sizeof(servaddr_un.sun_path) + strlen(filename);
-
- handoff_fd = socket(PF_UNIX, SOCK_STREAM, 0);
- if(handoff_fd == 0) {
- fprintf(stderr, "Failed to create socket: %s - %s\n", filename, strerror(errno));
- return;
- }
-
- if(connect(handoff_fd, servaddr, servaddr_len) < 0) {
- fprintf(stderr, "Failed to establish connection on socket: %s - %s\n", filename, strerror(errno));
+
+ if(sendmsg(connected_fd, &msg, 0) < 0) {
+ fprintf(stderr, "Error sending $DISPLAY file descriptor: %s\n", strerror(errno));
return;
}
- fprintf(stderr, "Socket: %s\n", filename);
-
- send_fd_handoff(handoff_fd, launchd_fd);
- close(handoff_fd);
+ close(connected_fd);
+ fprintf(stderr, "send %d %d %d %s\n", handoff_fd, launchd_fd, errno, strerror(errno));
}
+#endif
int main(int argc, char **argv, char **envp) {
#ifdef NEW_LAUNCH_METHOD
@@ -191,7 +212,7 @@ int main(int argc, char **argv, char **envp) {
string_array_t newargv;
size_t i;
int launchd_fd;
- string_t handoff_socket;
+ string_t handoff_socket_filename;
#endif
if(argc == 2 && !strcmp(argv[1], "-version")) {
@@ -241,9 +262,15 @@ int main(int argc, char **argv, char **envp) {
/* Handoff the $DISPLAY FD */
if(launchd_fd != -1) {
- tmpnam(handoff_socket);
- if(prep_fd_handoff(mp, handoff_socket) == KERN_SUCCESS) {
- handoff_fd(handoff_socket, launchd_fd);
+ int handoff_fd = create_socket(handoff_socket_filename);
+
+ if((handoff_fd != 0) &&
+ (prep_fd_handoff(mp, handoff_socket_filename) == KERN_SUCCESS)) {
+ send_fd_handoff(handoff_fd, launchd_fd);
+
+ // Cleanup
+ close(handoff_fd);
+ unlink(handoff_socket_filename);
} else {
fprintf(stderr, "Unable to hand of $DISPLAY file descriptor\n");
}
More information about the xorg-commit
mailing list