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 7f840e9dc1)
This commit is contained in:
Jeremy Huddleston 2008-06-03 00:06:26 -07:00
parent 45b661c67a
commit 2393dae6ff
4 changed files with 91 additions and 76 deletions

View File

@ -7,8 +7,8 @@ AM_CPPFLAGS = \
-DINXQUARTZ \ -DINXQUARTZ \
-DUSE_NEW_CLUT \ -DUSE_NEW_CLUT \
-DXFree86Server \ -DXFree86Server \
-I$(top_srcdir)/miext/rootless -I$(top_srcdir)/miext/rootless \
# -DNEW_LAUNCH_METHOD -DNEW_LAUNCH_METHOD
SUBDIRS = bundle . GL xpr mach-startup doc SUBDIRS = bundle . GL xpr mach-startup doc

View File

@ -1,18 +1,18 @@
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-DBUILD_DATE=\"$(BUILD_DATE)\" \ -DBUILD_DATE=\"$(BUILD_DATE)\" \
-DXSERVER_VERSION=\"$(VERSION)\" -DXSERVER_VERSION=\"$(VERSION)\" \
# -DNEW_LAUNCH_METHOD -DNEW_LAUNCH_METHOD_2 -DNEW_LAUNCH_METHOD -DNEW_LAUNCH_METHOD_2
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 # launchd_fd.c
#nodist_X11_SOURCES = \ nodist_X11_SOURCES = \
# mach_startupServer.c \ mach_startupServer.c \
# mach_startupUser.c mach_startupUser.c
X11_LDADD = \ X11_LDADD = \
$(top_builddir)/hw/xquartz/libXquartz.la \ $(top_builddir)/hw/xquartz/libXquartz.la \
@ -34,11 +34,11 @@ X11_LDFLAGS = \
bin_PROGRAMS = Xquartz bin_PROGRAMS = Xquartz
dist_Xquartz_SOURCES = \ dist_Xquartz_SOURCES = \
stub.c stub.c \
# launchd_fd.c launchd_fd.c
#nodist_Xquartz_SOURCES = \ nodist_Xquartz_SOURCES = \
# mach_startupUser.c mach_startupUser.c
Xquartz_LDFLAGS = \ Xquartz_LDFLAGS = \
-Wl,-framework,CoreServices -Wl,-framework,CoreServices

View File

@ -48,9 +48,9 @@
#include "mach_startupServer.h" #include "mach_startupServer.h"
#include "launchd_fd.h" #include "launchd_fd.h"
/* From darwinEvents.c ... but don't want to pull in all the server cruft */
void DarwinListenOnOpenFD(int fd); void DarwinListenOnOpenFD(int fd);
#define DEFAULT_CLIENT "/usr/X11/bin/xterm" #define DEFAULT_CLIENT "/usr/X11/bin/xterm"
#define DEFAULT_STARTX "/usr/X11/bin/startx" #define DEFAULT_STARTX "/usr/X11/bin/startx"
#define DEFAULT_SHELL "/bin/sh" #define DEFAULT_SHELL "/bin/sh"
@ -124,9 +124,6 @@ static mach_port_t checkin_or_register(char *bname) {
} }
/*** $DISPLAY handoff ***/ /*** $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) { static void accept_fd_handoff(int connected_fd) {
int launchd_fd; int launchd_fd;
@ -169,7 +166,9 @@ static void accept_fd_handoff(int connected_fd) {
if(launchd_fd == -1) if(launchd_fd == -1)
fprintf(stderr, "Error receiving $DISPLAY file descriptor, no descriptor received? %d\n", launchd_fd); 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); DarwinListenOnOpenFD(launchd_fd);
} }
@ -189,7 +188,7 @@ static void socket_handoff_thread(void *arg) {
struct sockaddr_un servaddr_un; struct sockaddr_un servaddr_un;
struct sockaddr *servaddr; struct sockaddr *servaddr;
socklen_t servaddr_len; 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 */ /* We need to save it since data dies after we pthread_cond_broadcast */
strlcpy(filename, data->socket_filename, STRING_T_SIZE); 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); handoff_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if(handoff_fd == 0) { if(handoff_fd == 0) {
fprintf(stderr, "Failed to create socket: %s - %s\n", filename, strerror(errno)); fprintf(stderr, "Failed to create socket: %s - %s\n", filename, strerror(errno));
data->retval = EXIT_FAILURE; data->retval = EXIT_FAILURE;
pthread_mutex_unlock(&data->lock);
pthread_cond_broadcast(&data->cond);
return; return;
} }
if(bind(handoff_fd, servaddr, servaddr_len) != 0) { /* Let the dispatch thread now tell the caller that we're ready */
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;
return;
}
/* Let the dispatch thread now tell the caller that we're listening */
data->retval = EXIT_SUCCESS; data->retval = EXIT_SUCCESS;
pthread_mutex_unlock(&data->lock); pthread_mutex_unlock(&data->lock);
pthread_cond_broadcast(&data->cond); pthread_cond_broadcast(&data->cond);
connected_fd = accept(handoff_fd, NULL, NULL); if(connect(handoff_fd, servaddr, servaddr_len) < 0) {
fprintf(stderr, "Failed to connect to socket: %s - %s\n", filename, strerror(errno));
if(connected_fd == -1) {
fprintf(stderr, "Failed to accept incoming connection on socket: %s - %s\n", filename, strerror(errno));
return; return;
} }
/* Now actually get the passed file descriptor from this connection */ /* 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); close(handoff_fd);
unlink(filename);
} }
kern_return_t do_prep_fd_handoff(mach_port_t port, string_t socket_filename) { kern_return_t do_prep_fd_handoff(mach_port_t port, string_t socket_filename) {
@ -274,8 +260,10 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
return KERN_FAILURE; return KERN_FAILURE;
} }
fprintf(stderr, "X11.app: do_start_x11_server(): argc=%d\n", argvCnt);
for(i=0; i < argvCnt; i++) { for(i=0; i < argvCnt; i++) {
_argv[i] = argv[i]; _argv[i] = argv[i];
fprintf(stderr, "\targv[%u] = %s\n", (unsigned)i, argv[i]);
} }
_argv[argvCnt] = NULL; _argv[argvCnt] = NULL;

View File

@ -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) { static void send_fd_handoff(int handoff_fd, int launchd_fd) {
char databuf[] = "display"; char databuf[] = "display";
struct iovec iov[1]; struct iovec iov[1];
int connected_fd;
iov[0].iov_base = databuf; iov[0].iov_base = databuf;
iov[0].iov_len = sizeof(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; *((int*)CMSG_DATA(cmsg)) = launchd_fd;
if (sendmsg(handoff_fd, &msg, 0) < 0) { 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;
}
if(sendmsg(connected_fd, &msg, 0) < 0) {
fprintf(stderr, "Error sending $DISPLAY file descriptor: %s\n", strerror(errno)); fprintf(stderr, "Error sending $DISPLAY file descriptor: %s\n", strerror(errno));
return; return;
} }
close(connected_fd);
fprintf(stderr, "send %d %d %d %s\n", handoff_fd, launchd_fd, errno, strerror(errno)); fprintf(stderr, "send %d %d %d %s\n", handoff_fd, launchd_fd, errno, strerror(errno));
} }
#endif
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));
return;
}
fprintf(stderr, "Socket: %s\n", filename);
send_fd_handoff(handoff_fd, launchd_fd);
close(handoff_fd);
}
int main(int argc, char **argv, char **envp) { int main(int argc, char **argv, char **envp) {
#ifdef NEW_LAUNCH_METHOD #ifdef NEW_LAUNCH_METHOD
@ -191,7 +212,7 @@ int main(int argc, char **argv, char **envp) {
string_array_t newargv; string_array_t newargv;
size_t i; size_t i;
int launchd_fd; int launchd_fd;
string_t handoff_socket; string_t handoff_socket_filename;
#endif #endif
if(argc == 2 && !strcmp(argv[1], "-version")) { if(argc == 2 && !strcmp(argv[1], "-version")) {
@ -241,9 +262,15 @@ int main(int argc, char **argv, char **envp) {
/* Handoff the $DISPLAY FD */ /* Handoff the $DISPLAY FD */
if(launchd_fd != -1) { if(launchd_fd != -1) {
tmpnam(handoff_socket); int handoff_fd = create_socket(handoff_socket_filename);
if(prep_fd_handoff(mp, handoff_socket) == KERN_SUCCESS) {
handoff_fd(handoff_socket, launchd_fd); 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 { } else {
fprintf(stderr, "Unable to hand of $DISPLAY file descriptor\n"); fprintf(stderr, "Unable to hand of $DISPLAY file descriptor\n");
} }