[prev in list] [next in list] [prev in thread] [next in thread] 

List:       launchd-changes
Subject:    [launchd-changes] [22920] trunk/launchd/src
From:       source_changes () macosforge ! org (source_changes () macosforge ! org)
Date:       2006-10-26 11:07:09
Message-ID: 20061026180056.2FC7E25ACA9 () cvs ! opensource ! apple ! com
[Download RAW message or body]

Revision: 22920
          http://trac.macosforge.org/projects/launchd/changeset/22920
Author:   zarzycki@apple.com
Date:     2006-10-26 11:00:55 -0700 (Thu, 26 Oct 2006)

Log Message:
-----------
It was always dubious that job_log*() could be called on the child side of the
fork() but before the exec*(). This provides a cleaner solution that is less
likely to confuse launchd itself or any logging API it uses (syslog or asl_log).

As a side effect, jobs _could_ now log indirectly via launchd, but I'm not sure
we'll make that public API yet... Maybe someday when we have a somewhat more
compelling story over syslog() or asl_log(), but that day isn't today, nor do I
intend to put much effort to acheiving that goal in the foreseeable future.

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/libvproc.c
    trunk/launchd/src/libvproc_internal.h

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2006-10-26 01:18:08 UTC (rev 22919)
+++ trunk/launchd/src/launchd_core_logic.c	2006-10-26 18:00:55 UTC (rev 22920)
@@ -283,7 +283,7 @@
 static void job_uncork_fork(job_t j);
 static struct machservice *job_lookup_service(job_t jbs, const char *name, bool \
check_parent);  static void job_foreach_service(job_t jbs, void (*bs_iter)(struct \
                machservice *, void *), void *context, bool only_anonymous);
-static void job_logv(job_t j, int pri, const char *msg, va_list ap);
+static void job_logv(job_t j, int pri, int err, const char *msg, va_list ap);
 static void job_log(job_t j, int pri, const char *msg, ...) \
__attribute__((format(printf, 3, 4)));  static void job_log_error(job_t j, int pri, \
const char *msg, ...) __attribute__((format(printf, 3, 4)));  static void \
job_log_bug(job_t j, const char *rcs_rev, const char *path, unsigned int line, const \
char *test); @@ -2115,15 +2115,28 @@
 }
 
 void
-job_logv(job_t j, int pri, const char *msg, va_list ap)
+job_logv(job_t j, int pri, int err, const char *msg, va_list ap)
 {
 	char newmsg[10000];
 	int oldmask = 0;
 	size_t o;
 
+	/*
+	 * Hack: If bootstrap_port is set, we must be on the child side of a
+	 * fork(), but before the exec*(). Let's route the log message back to
+	 * launchd proper.
+	 */
+	if (bootstrap_port) {
+		return _vproc_logv(pri, err, msg, ap);
+	}
+
 	o = job_prep_log_preface(j, newmsg);
 
-	sprintf(newmsg + o, ": %s", msg);
+	if (err) {
+		sprintf(newmsg + o, ": %s: %s", msg, strerror(err));
+	} else {
+		sprintf(newmsg + o, ": %s", msg);
+	}
 
 	if (j->debug) {
 		oldmask = setlogmask(LOG_UPTO(LOG_DEBUG));
@@ -2139,13 +2152,10 @@
 void
 job_log_error(job_t j, int pri, const char *msg, ...)
 {
-	char newmsg[10000];
 	va_list ap;
 
-	sprintf(newmsg, "%s: %s", msg, strerror(errno));
-
 	va_start(ap, msg);
-	job_logv(j, pri, newmsg, ap);
+	job_logv(j, pri, errno, msg, ap);
 	va_end(ap);
 }
 
@@ -2155,7 +2165,7 @@
 	va_list ap;
 
 	va_start(ap, msg);
-	job_logv(j, pri, msg, ap);
+	job_logv(j, pri, 0, msg, ap);
 	va_end(ap);
 }
 

Modified: trunk/launchd/src/libvproc.c
===================================================================
--- trunk/launchd/src/libvproc.c	2006-10-26 01:18:08 UTC (rev 22919)
+++ trunk/launchd/src/libvproc.c	2006-10-26 18:00:55 UTC (rev 22920)
@@ -177,7 +177,7 @@
 	return (vproc_err_t)_vproc_set_global_on_demand;
 }
 
-static void
+void
 _vproc_logv(int pri, int err, const char *msg, va_list ap)
 {
 	char flat_msg[3000];

Modified: trunk/launchd/src/libvproc_internal.h
===================================================================
--- trunk/launchd/src/libvproc_internal.h	2006-10-26 01:18:08 UTC (rev 22919)
+++ trunk/launchd/src/libvproc_internal.h	2006-10-26 18:00:55 UTC (rev 22920)
@@ -21,6 +21,7 @@
  */
 
 #include <mach/mach.h>
+#include <stdarg.h>
 #include "libbootstrap_public.h"
 
 typedef char * _internal_string_t;
@@ -51,7 +52,9 @@
 
 kern_return_t _vprocmgr_getsocket(mach_port_t bp, name_t);
 
+void _vproc_logv(int pri, int err, const char *msg, va_list ap);
 
+
 kern_return_t
 bootstrap_look_up_array(
 		mach_port_t bp,

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061026/3e22e069/attachment.html



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic