[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