[launchd-changes] [22999] trunk/launchd/src/launchd_core_logic.c

source_changes at macosforge.org source_changes at macosforge.org
Tue Jan 2 14:35:13 PST 2007


Revision: 22999
          http://trac.macosforge.org/projects/launchd/changeset/22999
Author:   zarzycki at apple.com
Date:     2007-01-02 14:35:13 -0800 (Tue, 02 Jan 2007)

Log Message:
-----------
<rdar://problem/4696825> reflect stderr of launchd jobs to ASL ("console logging")

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-01-02 18:32:46 UTC (rev 22998)
+++ trunk/launchd/src/launchd_core_logic.c	2007-01-02 22:35:13 UTC (rev 22999)
@@ -257,6 +257,7 @@
 	int argc;
 	int last_exit_status;
 	int forkfd;
+	int log_redirect_fd;
 	int nice;
 	int timeout;
 	int stdout_err_fd;
@@ -609,6 +610,10 @@
 		job_assumes(j, close(j->forkfd) != -1);
 	}
 
+	if (j->log_redirect_fd) {
+		job_assumes(j, close(j->log_redirect_fd) != -1);
+	}
+
 	if (j->j_port) {
 		job_assumes(j, launchd_mport_close_recv(j->j_port) == KERN_SUCCESS);
 	}
@@ -1586,6 +1591,11 @@
 
 	job_log(j, LOG_DEBUG, "Reaping");
 
+	if (j->log_redirect_fd) {
+		job_assumes(j, close(j->log_redirect_fd) != -1);
+		j->log_redirect_fd = 0;
+	}
+
 	if (j->forkfd) {
 		job_assumes(j, close(j->forkfd) != -1);
 		j->forkfd = 0;
@@ -1705,7 +1715,30 @@
 		watchpath_callback(j, kev);
 		break;
 	case EVFILT_READ:
-		socketgroup_callback(j, kev);
+		if (kev->ident == (uintptr_t)j->log_redirect_fd) {
+			char buf[4001];
+			ssize_t rsz;
+
+			rsz = read(j->log_redirect_fd, buf, sizeof(buf) - 1);
+
+			if (rsz == 0) {
+				job_assumes(j, close(j->log_redirect_fd) != -1);
+				j->log_redirect_fd = 0;
+			} else if (job_assumes(j, rsz != -1)) {
+				buf[rsz] = '\0';
+				switch (buf[0]) {
+				case '\n':
+				case '\r':
+				case '\0':
+					break;
+				default:
+					job_log(j, LOG_NOTICE, "Standard Out/Error: %s", buf);
+					break;
+				}
+			}
+		} else {
+			socketgroup_callback(j, kev);
+		}
 		break;
 	case EVFILT_MACHPORT:
 		job_dispatch(j, true);
@@ -1721,6 +1754,7 @@
 {
 	int spair[2];
 	int execspair[2];
+	int oepair[2];
 	char nbuf[64];
 	pid_t c;
 	bool sipc = false;
@@ -1759,11 +1793,17 @@
 	j->checkedin = false;
 
 	if (sipc) {
-		socketpair(AF_UNIX, SOCK_STREAM, 0, spair);
+		job_assumes(j, socketpair(AF_UNIX, SOCK_STREAM, 0, spair) != -1);
 	}
 
-	socketpair(AF_UNIX, SOCK_STREAM, 0, execspair);
+	job_assumes(j, socketpair(AF_UNIX, SOCK_STREAM, 0, execspair) != -1);
 
+	if (job_assumes(j, pipe(oepair) != -1)) {
+		j->log_redirect_fd = _fd(oepair[0]);
+		job_assumes(j, fcntl(j->log_redirect_fd, F_SETFL, O_NONBLOCK) != -1);
+		job_assumes(j, kevent_mod(j->log_redirect_fd, EVFILT_READ, EV_ADD, 0, 0, j) != -1);
+	}
+
 	time(&j->start_time);
 
 	switch (c = jobmgr_fork(j->mgr)) {
@@ -1777,6 +1817,9 @@
 		}
 		break;
 	case 0:
+		job_assumes(j, dup2(oepair[1], STDOUT_FILENO) != -1);
+		job_assumes(j, dup2(oepair[1], STDERR_FILENO) != -1);
+		job_assumes(j, close(oepair[1]) != -1);
 		job_assumes(j, close(execspair[0]) == 0);
 		/* wait for our parent to say they've attached a kevent to us */
 		read(_fd(execspair[1]), &c, sizeof(c));
@@ -1797,6 +1840,7 @@
 		job_start_child(j);
 		break;
 	default:
+		job_assumes(j, close(oepair[1]) != -1);
 		j->p = c;
 		j->forkfd = _fd(execspair[0]);
 		job_assumes(j, close(execspair[1]) == 0);
@@ -2544,8 +2588,9 @@
 
 	job_log(j, LOG_DEBUG, "Ignoring Sockets:%s", buf);
 
-	for (i = 0; i < sg->fd_cnt; i++)
+	for (i = 0; i < sg->fd_cnt; i++) {
 		job_assumes(j, kevent_mod(sg->fds[i], EVFILT_READ, EV_DELETE, 0, 0, NULL) != -1);
+	}
 }
 
 void
@@ -2563,8 +2608,9 @@
 
 	job_log(j, LOG_DEBUG, "Watching sockets:%s", buf);
 
-	for (i = 0; i < sg->fd_cnt; i++)
+	for (i = 0; i < sg->fd_cnt; i++) {
 		job_assumes(j, kevent_mod(sg->fds[i], EVFILT_READ, EV_ADD, 0, 0, j) != -1);
+	}
 }
 
 void

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070102/607266f1/attachment.html


More information about the launchd-changes mailing list