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,