aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/hw/xquartz
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/hw/xquartz')
-rw-r--r--xorg-server/hw/xquartz/X11Controller.m62
-rw-r--r--xorg-server/hw/xquartz/console_redirect.c28
-rw-r--r--xorg-server/hw/xquartz/mach-startup/bundle-main.c17
3 files changed, 94 insertions, 13 deletions
diff --git a/xorg-server/hw/xquartz/X11Controller.m b/xorg-server/hw/xquartz/X11Controller.m
index 393bc1abe..737db42e7 100644
--- a/xorg-server/hw/xquartz/X11Controller.m
+++ b/xorg-server/hw/xquartz/X11Controller.m
@@ -53,6 +53,11 @@
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <asl.h>
+#include <stdlib.h>
+
+extern aslclient aslc;
+extern char *bundle_id_prefix;
@implementation X11Controller
@@ -342,9 +347,12 @@
const char *newargv[4];
char buf[128];
char *s;
+#if 0 && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
+ int stdout_pipe[2];
+ int stderr_pipe[2];
+#endif
- newargv[0] =
- [X11App prefs_get_string:@PREFS_LOGIN_SHELL default:"/bin/sh"];
+ newargv[0] = [X11App prefs_get_string:@PREFS_LOGIN_SHELL default:"/bin/sh"];
newargv[1] = "-c";
newargv[2] = [filename UTF8String];
newargv[3] = NULL;
@@ -355,6 +363,40 @@
setenv("DISPLAY", buf, TRUE);
}
+#if 0 && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
+ if (asl_log_descriptor) {
+ char *asl_sender;
+ aslmsg amsg = asl_new(ASL_TYPE_MSG);
+ assert(amsg);
+
+ asprintf(&asl_sender, "%s.%s", bundle_id_prefix, newargv[2]);
+ assert(asl_sender);
+ for(s = asl_sender + strlen(bundle_id_prefix) + 1; *s; s++) {
+ if(! ((*s >= 'a' && *s <= 'z') ||
+ (*s >= 'A' && *s <= 'Z') ||
+ (*s >= '0' && *s <= '9'))) {
+ *s = '_';
+ }
+ }
+
+ (void)asl_set(amsg, ASL_KEY_SENDER, asl_sender);
+ free(asl_sender);
+
+ assert(0 == pipe(stdout_pipe));
+ fcntl(stdout_pipe[0], F_SETFD, FD_CLOEXEC);
+ fcntl(stdout_pipe[0], F_SETFL, O_NONBLOCK);
+
+ assert(0 == pipe(stderr_pipe));
+ fcntl(stderr_pipe[0], F_SETFD, FD_CLOEXEC);
+ fcntl(stderr_pipe[0], F_SETFL, O_NONBLOCK);
+
+ asl_log_descriptor(aslc, amsg, ASL_LEVEL_INFO, stdout_pipe[0], ASL_LOG_DESCRIPTOR_READ);
+ asl_log_descriptor(aslc, amsg, ASL_LEVEL_NOTICE, stderr_pipe[0], ASL_LOG_DESCRIPTOR_READ);
+
+ asl_free(amsg);
+ }
+#endif
+
/* Do the fork-twice trick to avoid having to reap zombies */
child1 = fork();
switch (child1) {
@@ -371,6 +413,14 @@
_exit(1);
case 0: /* child2 */
+#if 0 && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
+ if (asl_log_descriptor) {
+ /* Replace our stdout/stderr */
+ dup2(stdout_pipe[1], STDOUT_FILENO);
+ dup2(stderr_pipe[1], STDERR_FILENO);
+ }
+#endif
+
/* close all open files except for standard streams */
max_files = sysconf(_SC_OPEN_MAX);
for (i = 3; i < max_files; i++)
@@ -391,6 +441,14 @@
default: /* parent */
waitpid(child1, &status, 0);
}
+
+#if 0 && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
+ if (asl_log_descriptor) {
+ /* Close the write ends of the pipe */
+ close(stdout_pipe[1]);
+ close(stderr_pipe[1]);
+ }
+#endif
}
- (void) app_selected:sender
diff --git a/xorg-server/hw/xquartz/console_redirect.c b/xorg-server/hw/xquartz/console_redirect.c
index 91d693b67..8fdce4699 100644
--- a/xorg-server/hw/xquartz/console_redirect.c
+++ b/xorg-server/hw/xquartz/console_redirect.c
@@ -110,27 +110,33 @@ _read_redirect(int fd, int flush)
/* Increment our returned number read */
total_read += nbytes;
- nbytes += (aslr->w - aslr->buf);
- aslr->buf[nbytes] = '\0';
+ /* Increment our write location */
+ aslr->w += nbytes;
+ aslr->w[0] = '\0';
/* One line at a time */
- for (p = aslr->buf; *p && (p - aslr->buf) < nbytes; p = s + 1) {
+ for (p = aslr->buf; p < aslr->w; p = s + 1) {
// Find null or \n
for (s = p; *s && *s != '\n'; s++) ;
if (*s == '\n') {
*s = '\0';
+ }
+
+ if (s < aslr->w || aslr->buf == p) {
+ /* Either the first of multiple messages or one message which is larger than our buffer */
asl_log(aslr->asl, aslr->msg, aslr->level, "%s", p);
}
- else if (aslr->buf != p) {
+ else {
+ /* We reached the end of the buffer, move this chunk to the start. */
memmove(aslr->buf, p, BUF_SIZE - (p - aslr->buf));
aslr->w = aslr->buf + (s - p);
break;
}
- else if (nbytes == BUF_SIZE - 1) {
- asl_log(aslr->asl, aslr->msg, aslr->level, "%s", p);
- aslr->w = aslr->buf;
- break;
- }
+ }
+
+ if (p == aslr->w) {
+ /* Start writing at the beginning in the case where we flushed */
+ aslr->w = aslr->buf;
}
}
@@ -359,8 +365,8 @@ xq_asl_log_fd(aslclient asl, aslmsg msg, int level, int fd)
BLOCK_DONE;
}
redirect_fds = new_array;
- memset(redirect_fds + n_redirect_fds, 0, new_n -
- n_redirect_fds);
+ memset(redirect_fds + n_redirect_fds, 0, (new_n -
+ n_redirect_fds) * sizeof(*redirect_fds));
n_redirect_fds = new_n;
}
diff --git a/xorg-server/hw/xquartz/mach-startup/bundle-main.c b/xorg-server/hw/xquartz/mach-startup/bundle-main.c
index cabdf1eab..b40366244 100644
--- a/xorg-server/hw/xquartz/mach-startup/bundle-main.c
+++ b/xorg-server/hw/xquartz/mach-startup/bundle-main.c
@@ -563,8 +563,25 @@ setup_console_redirect(const char *bundle_id)
free(asl_facility);
asl_set_filter(aslc, ASL_FILTER_MASK_UPTO(ASL_LEVEL_WARNING));
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
+# if MAC_OS_X_VERSION_MIN_REQUIRED < 1080
+ if (asl_log_descriptor)
+# endif
+ {
+ asl_log_descriptor(aslc, NULL, ASL_LEVEL_INFO, STDOUT_FILENO, ASL_LOG_DESCRIPTOR_WRITE);
+ asl_log_descriptor(aslc, NULL, ASL_LEVEL_NOTICE, STDERR_FILENO, ASL_LOG_DESCRIPTOR_WRITE);
+ }
+# if MAC_OS_X_VERSION_MIN_REQUIRED < 1080
+ else {
+ xq_asl_capture_fd(aslc, NULL, ASL_LEVEL_INFO, STDOUT_FILENO);
+ xq_asl_capture_fd(aslc, NULL, ASL_LEVEL_NOTICE, STDERR_FILENO);
+ }
+# endif
+#else
xq_asl_capture_fd(aslc, NULL, ASL_LEVEL_INFO, STDOUT_FILENO);
xq_asl_capture_fd(aslc, NULL, ASL_LEVEL_NOTICE, STDERR_FILENO);
+#endif
}
static void