[launchd-changes] [23297] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Fri Jul 6 14:38:28 PDT 2007


Revision: 23297
          http://trac.macosforge.org/projects/launchd/changeset/23297
Author:   zarzycki at apple.com
Date:     2007-07-06 14:38:27 -0700 (Fri, 06 Jul 2007)

Log Message:
-----------
<rdar://problem/2981922> A lot of startup messages are not written to the system.log file

Modified Paths:
--------------
    trunk/launchd/src/launchd.h
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/launchd_core_logic.h
    trunk/launchd/src/launchd_runtime.c
    trunk/launchd/src/launchd_runtime.h
    trunk/launchd/src/libvproc.c
    trunk/launchd/src/libvproc_internal.h
    trunk/launchd/src/libvproc_private.h
    trunk/launchd/src/protocol_job.defs
    trunk/launchd/src/protocol_job_reply.defs

Modified: trunk/launchd/src/launchd.h
===================================================================
--- trunk/launchd/src/launchd.h	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/launchd.h	2007-07-06 21:38:27 UTC (rev 23297)
@@ -33,7 +33,6 @@
 
 extern bool debug_shutdown_hangs;
 extern bool network_up;
-extern mach_port_t inherited_bootstrap_port;
 
 bool init_check_pid(pid_t);
 

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/launchd_core_logic.c	2007-07-06 21:38:27 UTC (rev 23297)
@@ -1927,7 +1927,7 @@
 #endif
 
 	if (WIFEXITED(status) && WEXITSTATUS(status) != 0) {
-		job_log(j, LOG_WARNING, "exited with exit code: %d", WEXITSTATUS(status));
+		job_log(j, LOG_WARNING, "Exited with exit code: %d", WEXITSTATUS(status));
 	}
 
 	if (WIFSIGNALED(status)) {
@@ -1999,6 +1999,17 @@
 	return j;
 }
 
+static void
+job_log_stdouterr2(job_t j, const char *msg, ...)
+{
+	struct runtime_syslog_attr attr = { j->label, j->label, j->mgr->name, LOG_NOTICE, getuid(), j->p, j->p };
+	va_list ap;
+
+	va_start(ap, msg);
+	runtime_vsyslog(&attr, msg, ap);
+	va_end(ap);
+}
+
 void
 job_log_stdouterr(job_t j)
 {
@@ -2023,7 +2034,7 @@
 
 		while ((msg = strsep(&bufindex, "\n\r"))) {
 			if (msg[0]) {
-				job_log(j, LOG_NOTICE, "Standard out/error: %s", msg);
+				job_log_stdouterr2(j, "%s", msg);
 			}
 		}
 	}
@@ -2850,10 +2861,10 @@
 void
 job_logv(job_t j, int pri, int err, const char *msg, va_list ap)
 {
+	struct runtime_syslog_attr attr = { "com.apple.launchd", j->label, j->mgr->name, pri, getuid(), getpid(), j->p };
 	char *newmsg;
-	char *newlabel;
 	int oldmask = 0;
-	size_t i, o, jlabel_len = strlen(j->label), newmsgsz;
+	size_t newmsgsz;
 
 	/*
 	 * Hack: If bootstrap_port is set, we must be on the child side of a
@@ -2864,30 +2875,20 @@
 		return _vproc_logv(pri, err, msg, ap);
 	}
 
-	newlabel = alloca((jlabel_len + 1) * 2);
-	newmsgsz = (jlabel_len + 1) * 2 + strlen(msg) + 100;
+	newmsgsz = strlen(msg) + 200;
 	newmsg = alloca(newmsgsz);
 
-	for (i = 0, o = 0; i < jlabel_len; i++, o++) {
-		if (j->label[i] == '%') {
-			newlabel[o] = '%';
-			o++;
-		}
-		newlabel[o] = j->label[i];
-	}
-	newlabel[o] = '\0';
-
 	if (err) {
-		snprintf(newmsg, newmsgsz, "%s: %s: %s", newlabel, msg, strerror(err));
+		snprintf(newmsg, newmsgsz, "%s: %s", msg, strerror(err));
 	} else {
-		snprintf(newmsg, newmsgsz, "%s: %s", newlabel, msg);
+		snprintf(newmsg, newmsgsz, "%s", msg);
 	}
 
 	if (j->debug) {
 		oldmask = setlogmask(LOG_UPTO(LOG_DEBUG));
 	}
 
-	jobmgr_logv(j->mgr, pri, 0, newmsg, ap);
+	runtime_vsyslog(&attr, newmsg, ap);
 
 	if (j->debug) {
 		setlogmask(oldmask);
@@ -2965,7 +2966,9 @@
 	if (jm->parentmgr) {
 		jobmgr_logv(jm->parentmgr, pri, 0, newmsg, ap);
 	} else {
-		runtime_vsyslog(pri, newmsg, ap);
+		struct runtime_syslog_attr attr = { "com.apple.launchd", "com.apple.launchd", jm->name, pri, getuid(), getpid(), getpid() };
+
+		runtime_vsyslog(&attr, newmsg, ap);
 	}
 }
 
@@ -3985,9 +3988,11 @@
 			unsetenv(LAUNCHD_TRUSTED_FD_ENV);
 		}
 
+		/* cut off the Libc cache, we don't want to deadlock against ourself */
 		inherited_bootstrap_port = bootstrap_port;
-		/* cut off the Libc cache, we don't want to deadlock against ourself */
 		bootstrap_port = MACH_PORT_NULL;
+		launchd_assert(launchd_mport_notify_req(inherited_bootstrap_port, MACH_NOTIFY_DEAD_NAME) == KERN_SUCCESS);
+
 		/* We set this explicitly as we start each child */
 		launchd_assert(launchd_set_bport(MACH_PORT_NULL) == KERN_SUCCESS);
 	} else if (!jobmgr_assumes(jmr, launchd_mport_create_recv(&jmr->jm_port) == KERN_SUCCESS)) {
@@ -4076,6 +4081,13 @@
 	 */
 
 	if (jm == root_jobmgr) {
+		if (port == inherited_bootstrap_port) {
+			launchd_assumes(launchd_mport_deallocate(port) == KERN_SUCCESS);
+			inherited_bootstrap_port = MACH_PORT_NULL;
+
+			return jobmgr_shutdown(jm);
+		}
+
 		LIST_FOREACH_SAFE(ms, &port_hash[HASH_PORT(port)], port_hash_sle, next_ms) {
 			if (ms->port == port) {
 				machservice_delete(ms->job, ms, true);
@@ -4758,6 +4770,42 @@
 }
 
 kern_return_t
+job_mig_log_forward(job_t j, vm_offset_t inval, mach_msg_type_number_t invalCnt)
+{
+	struct ldcred ldc;
+
+	if (!launchd_assumes(j != NULL)) {
+		return BOOTSTRAP_NO_MEMORY;
+	}
+
+	if (!job_assumes(j, j->per_user)) {
+		return BOOTSTRAP_NOT_PRIVILEGED;
+	}
+
+	runtime_get_caller_creds(&ldc);
+
+	return runtime_log_forward(ldc.euid, ldc.egid, inval, invalCnt);
+}
+
+kern_return_t
+job_mig_log_drain(job_t j, mach_port_t srp, vm_offset_t *outval, mach_msg_type_number_t *outvalCnt)
+{
+	struct ldcred ldc;
+
+	if (!launchd_assumes(j != NULL)) {
+		return BOOTSTRAP_NO_MEMORY;
+	}
+
+	runtime_get_caller_creds(&ldc);
+
+	if (ldc.euid) {
+		return BOOTSTRAP_NOT_PRIVILEGED;
+	}
+
+	return runtime_log_drain(srp, outval, outvalCnt);
+}
+
+kern_return_t
 job_mig_swap_complex(job_t j, vproc_gsk_t inkey, vproc_gsk_t outkey,
 		vm_offset_t inval, mach_msg_type_number_t invalCnt,
 		vm_offset_t *outval, mach_msg_type_number_t *outvalCnt) 

Modified: trunk/launchd/src/launchd_core_logic.h
===================================================================
--- trunk/launchd/src/launchd_core_logic.h	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/launchd_core_logic.h	2007-07-06 21:38:27 UTC (rev 23297)
@@ -27,6 +27,7 @@
 typedef struct jobmgr_s *jobmgr_t;
 
 extern jobmgr_t root_jobmgr;
+extern mach_port_t inherited_bootstrap_port;
 
 void jobmgr_init(bool);
 jobmgr_t jobmgr_shutdown(jobmgr_t jm);

Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/launchd_runtime.c	2007-07-06 21:38:27 UTC (rev 23297)
@@ -64,6 +64,8 @@
 #include "launch.h"
 #include "launchd.h"
 #include "launchd_core_logic.h"
+#include "libvproc_internal.h"
+#include "job_reply.h"
 
 static mach_port_t ipc_port_set;
 static mach_port_t demand_port_set;
@@ -91,6 +93,18 @@
 static mach_msg_timeout_t runtime_idle_timeout;
 static audit_token_t *au_tok;
 
+
+static STAILQ_HEAD(, logmsg_s) logmsg_queue = STAILQ_HEAD_INITIALIZER(logmsg_queue);
+static size_t logmsg_queue_sz;
+static size_t logmsg_queue_cnt;
+static mach_port_t drain_reply_port;
+static void runtime_log_uncork_pending_drain(void);
+static kern_return_t runtime_log_pack(vm_offset_t *outval, mach_msg_type_number_t *outvalCnt);
+static void runtime_log_push(void);
+
+static bool logmsg_add(struct runtime_syslog_attr *attr, int err_num, const char *msg);
+static void logmsg_remove(struct logmsg_s *lm);
+
 void
 launchd_runtime_init(void)
 {
@@ -773,9 +787,9 @@
 	 * a receiver somewhere else on the system.
 	 */
 
-	if (name == inherited_bootstrap_port) {
+	if (name == drain_reply_port) {
 		launchd_assumes(launchd_mport_deallocate(name) == KERN_SUCCESS);
-		inherited_bootstrap_port = MACH_PORT_NULL;
+		drain_reply_port = MACH_PORT_NULL;
 	}
 
 	if (launchd_assumes(root_jobmgr != NULL)) {
@@ -857,6 +871,8 @@
 			}
 		}
 
+		runtime_log_push();
+
 		mr = mach_msg(&bufReply->Head, tmp_options, bufReply->Head.msgh_size,
 				msg_size, ipc_port_set, to, MACH_PORT_NULL);
 
@@ -973,26 +989,35 @@
 	}
 }
 
+static int internal_mask_pri;
+
 int
 runtime_setlogmask(int maskpri)
 {
-	return setlogmask(maskpri);
+	internal_mask_pri = maskpri;
+
+	return internal_mask_pri;
 }
 
 void
-runtime_syslog(int priority, const char *message, ...)
+runtime_syslog(int pri, const char *message, ...)
 {
+	struct runtime_syslog_attr attr = {
+		"com.apple.launchd", "com.apple.launchd",
+		getpid() == 1 ? "System" : "Background",
+		pri, getuid(), getpid(), getpid()
+	};
 	va_list ap;
 
 	va_start(ap, message);
 
-	runtime_vsyslog(priority, message, ap);
+	runtime_vsyslog(&attr, message, ap);
 
 	va_end(ap);
 }
 
 void
-runtime_vsyslog(int priority, const char *message, va_list args)
+runtime_vsyslog(struct runtime_syslog_attr *attr, const char *message, va_list args)
 {
 	static pthread_mutex_t ourlock = PTHREAD_MUTEX_INITIALIZER;
 	static struct timeval shutdown_start;
@@ -1004,19 +1029,25 @@
 	char newmsg[10000];
 	size_t i, j;
 
+	if (!(LOG_MASK(attr->priority) & internal_mask_pri)) {
+		goto out;
+	}
+
 	if (apple_internal_logging == 1) {
 		apple_internal_logging = stat("/AppleInternal", &sb);
 	}
 
+
 	if (!(debug_shutdown_hangs && getpid() == 1)) {
-		if (priority == LOG_APPLEONLY) {
+		if (attr->priority == LOG_APPLEONLY) {
 			if (apple_internal_logging == -1) {
-				return;
+				goto out;
 			}
-			priority = LOG_NOTICE;
+			attr->priority = LOG_NOTICE;
 		}
-		vsyslog(priority, message, args);
-		return closelog();
+		vsnprintf(newmsg, sizeof(newmsg), message, args);
+		logmsg_add(attr, saved_errno, newmsg);
+		goto out;
 	}
 
 	if (shutdown_start.tv_sec == 0) {
@@ -1038,12 +1069,11 @@
 	pthread_mutex_unlock(&ourlock);
 
 	if (ourlogfile == NULL) {
-		syslog(LOG_ERR, "Couldn't open alternate log file!");
-		return vsyslog(priority, message, args);
+		goto out;
 	}
 
 	if (message == NULL) {
-		return;
+		goto out;
 	}
 
 	timersub(&tvnow, &shutdown_start, &tvd_total);
@@ -1074,4 +1104,190 @@
 	strcpy(newmsg + j, "\n");
 
 	vfprintf(ourlogfile, newmsg, args);
+
+out:
+	runtime_log_uncork_pending_drain();
 }
+
+bool
+logmsg_add(struct runtime_syslog_attr *attr, int err_num, const char *msg)
+{
+	size_t lm_sz = sizeof(struct logmsg_s) + strlen(msg) + strlen(attr->from_name) + strlen(attr->about_name) + strlen(attr->session_name) + 4;
+	char *data_off;
+	struct logmsg_s *lm;
+
+#define ROUND_TO_64BIT_WORD_SIZE(x)     ((x + 7) & ~7)
+
+	/* we do this to make the unpacking for the log_drain cause unalignment faults */
+	lm_sz = ROUND_TO_64BIT_WORD_SIZE(lm_sz);
+
+	if (!(lm = calloc(1, lm_sz))) {
+		return false;
+	}
+
+	data_off = lm->data;
+
+	launchd_assumes(gettimeofday(&lm->when, NULL) != -1);
+	lm->from_pid = attr->from_pid;
+	lm->about_pid = attr->about_pid;
+	lm->err_num = err_num;
+	lm->pri = attr->priority;
+	lm->obj_sz = lm_sz;
+	lm->msg = data_off;
+	data_off += sprintf(data_off, "%s", msg) + 1;
+	lm->from_name = data_off;
+	data_off += sprintf(data_off, "%s", attr->from_name) + 1;
+	lm->about_name = data_off;
+	data_off += sprintf(data_off, "%s", attr->about_name) + 1;
+	lm->session_name = data_off;
+	data_off += sprintf(data_off, "%s", attr->session_name) + 1;
+
+	STAILQ_INSERT_TAIL(&logmsg_queue, lm, sqe);
+	logmsg_queue_sz += lm_sz;
+	logmsg_queue_cnt++;
+
+	return true;
+}
+
+void
+logmsg_remove(struct logmsg_s *lm)
+{
+	STAILQ_REMOVE(&logmsg_queue, lm, logmsg_s, sqe);
+	logmsg_queue_sz -= lm->obj_sz;
+	logmsg_queue_cnt--;
+
+	free(lm);
+}
+ 
+kern_return_t
+runtime_log_pack(vm_offset_t *outval, mach_msg_type_number_t *outvalCnt)
+{
+	struct logmsg_s *lm;
+	void *offset;
+
+	*outvalCnt = logmsg_queue_sz;
+
+	mig_allocate(outval, *outvalCnt);
+
+	if (*outval == 0) {
+		return 1;
+	}
+
+	offset = (void *)*outval;
+
+	while ((lm = STAILQ_FIRST(&logmsg_queue))) {
+		lm->from_name -= (size_t)lm;
+		lm->about_name -= (size_t)lm;
+		lm->msg -= (size_t)lm;
+		lm->session_name -= (size_t)lm;
+
+		memcpy(offset, lm, lm->obj_sz);
+		
+		offset += lm->obj_sz;
+
+		logmsg_remove(lm);
+	}
+
+	return 0;
+}
+
+void
+runtime_log_uncork_pending_drain(void)
+{
+	mach_msg_type_number_t outvalCnt;
+	vm_offset_t outval;
+
+	if (!drain_reply_port) {
+		return;
+	}
+
+	if (logmsg_queue_cnt == 0) {
+		return;
+	}
+
+	if (runtime_log_pack(&outval, &outvalCnt) != 0) {
+		return;
+	}
+
+	if (!launchd_assumes(job_mig_log_drain_reply(drain_reply_port, 0, outval, outvalCnt) == 0)) {
+		launchd_assumes(launchd_mport_deallocate(drain_reply_port) == KERN_SUCCESS);
+	}
+
+	drain_reply_port = MACH_PORT_NULL;
+
+	mig_deallocate(outval, outvalCnt);
+}
+
+void
+runtime_log_push(void)
+{
+	mach_msg_type_number_t outvalCnt;
+	vm_offset_t outval;
+
+	if (logmsg_queue_cnt == 0) {
+		launchd_assumes(STAILQ_EMPTY(&logmsg_queue));
+		return;
+	} else if (getpid() == 1) {
+		return;
+	}
+
+	if (runtime_log_pack(&outval, &outvalCnt) != 0) {
+		return;
+	}
+
+	launchd_assumes(_vprocmgr_log_forward(inherited_bootstrap_port, (void *)outval, outvalCnt) == NULL);
+
+	mig_deallocate(outval, outvalCnt);
+}
+
+kern_return_t
+runtime_log_forward(uid_t forward_uid, gid_t forward_gid, vm_offset_t inval, mach_msg_type_number_t invalCnt)
+{
+	struct logmsg_s *lm, *lm_walk;
+	mach_msg_type_number_t data_left = invalCnt;
+
+	if (inval == 0) {
+		return 0;
+	}
+
+	for (lm_walk = (struct logmsg_s *)inval; (data_left > 0) && (lm_walk->obj_sz <= data_left); lm_walk = ((void *)lm_walk + lm_walk->obj_sz)) {
+		if (!launchd_assumes(lm = malloc(lm_walk->obj_sz))) {
+			continue;
+		}
+
+		memcpy(lm, lm_walk, lm_walk->obj_sz);
+		lm->sender_uid = forward_uid;
+		lm->sender_gid = forward_gid;
+
+		lm->from_name += (size_t)lm;
+		lm->about_name += (size_t)lm;
+		lm->msg += (size_t)lm;
+		lm->session_name += (size_t)lm;
+
+		STAILQ_INSERT_TAIL(&logmsg_queue, lm, sqe);
+		logmsg_queue_sz += lm->obj_sz;
+		logmsg_queue_cnt++;
+
+		data_left -= lm->obj_sz;
+	}
+
+	mig_deallocate(inval, invalCnt);
+
+	return 0;
+}
+
+kern_return_t
+runtime_log_drain(mach_port_t srp, vm_offset_t *outval, mach_msg_type_number_t *outvalCnt)
+{
+	if (logmsg_queue_cnt == 0) {
+		launchd_assumes(STAILQ_EMPTY(&logmsg_queue));
+		launchd_assumes(drain_reply_port == 0);
+
+		drain_reply_port = srp;
+		launchd_assumes(launchd_mport_notify_req(drain_reply_port, MACH_NOTIFY_DEAD_NAME) == KERN_SUCCESS);
+
+		return MIG_NO_REPLY;
+	}
+
+	return runtime_log_pack(outval, outvalCnt);
+}

Modified: trunk/launchd/src/launchd_runtime.h
===================================================================
--- trunk/launchd/src/launchd_runtime.h	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/launchd_runtime.h	2007-07-06 21:38:27 UTC (rev 23297)
@@ -77,12 +77,24 @@
 
 void runtime_openlog(const char *ident, int logopt, int facility);
 void runtime_closelog(void);
+kern_return_t runtime_log_forward(uid_t forward_uid, gid_t forward_gid, vm_offset_t inval, mach_msg_type_number_t invalCnt);
+kern_return_t runtime_log_drain(mach_port_t srp, vm_offset_t *outval, mach_msg_type_number_t *outvalCnt);
 
 #define LOG_APPLEONLY 0x4141504c /* AAPL in hex */
 
+struct runtime_syslog_attr {
+	const char *from_name;
+	const char *about_name;
+	const char *session_name;
+	int priority;
+	uid_t from_uid;
+	pid_t from_pid;
+	pid_t about_pid;
+};
+
 int runtime_setlogmask(int maskpri);
-void runtime_syslog(int priority, const char *message, ...) __attribute__((format(printf, 2, 3)));
-void runtime_vsyslog(int priority, const char *message, va_list args) __attribute__((format(printf, 2, 0)));
+void runtime_syslog(int pri, const char *message, ...) __attribute__((format(printf, 2, 3)));
+void runtime_vsyslog(struct runtime_syslog_attr *attr, const char *message, va_list args) __attribute__((format(printf, 2, 0)));
 
 
 kern_return_t launchd_set_bport(mach_port_t name);

Modified: trunk/launchd/src/libvproc.c
===================================================================
--- trunk/launchd/src/libvproc.c	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/libvproc.c	2007-07-06 21:38:27 UTC (rev 23297)
@@ -31,6 +31,7 @@
 #include <errno.h>
 #include <unistd.h>
 #include <syslog.h>
+#include <pthread.h>
 
 #include "liblaunch_public.h"
 #include "liblaunch_private.h"
@@ -382,6 +383,55 @@
 }
 
 vproc_err_t
+_vprocmgr_log_forward(mach_port_t mp, void *data, size_t len)
+{
+	if (vproc_mig_log_forward(mp, (vm_offset_t)data, len) == 0) {
+		return NULL;
+	}
+
+	return _vprocmgr_log_forward;
+}
+
+vproc_err_t
+_vprocmgr_log_drain(vproc_t vp __attribute__((unused)), pthread_mutex_t *mutex, _vprocmgr_log_drain_callback_t func)
+{
+	mach_msg_type_number_t outdata_cnt;
+	vm_offset_t outdata = 0;
+	struct logmsg_s *lm;
+
+	if (!func) {
+		return _vprocmgr_log_drain;
+	}
+
+	if (vproc_mig_log_drain(bootstrap_port, &outdata, &outdata_cnt) != 0) {
+		return _vprocmgr_log_drain;
+	}
+
+	if (mutex) {
+		pthread_mutex_lock(mutex);
+	}
+
+	for (lm = (struct logmsg_s *)outdata; lm->obj_sz; lm = ((void *)lm + lm->obj_sz)) {
+		lm->from_name += (size_t)lm;
+		lm->about_name += (size_t)lm;
+		lm->msg += (size_t)lm;
+		lm->session_name += (size_t)lm;
+
+		func(&lm->when, lm->from_pid, lm->about_pid, lm->sender_uid, lm->sender_gid, lm->pri, lm->from_name, lm->about_name, lm->session_name, lm->msg);
+	}
+
+	if (mutex) {
+		pthread_mutex_unlock(mutex);
+	}
+
+	if (outdata) {
+		mig_deallocate(outdata, outdata_cnt);
+	}
+
+	return NULL;
+}
+
+vproc_err_t
 vproc_swap_integer(vproc_t vp __attribute__((unused)), vproc_gsk_t key, int64_t *inval, int64_t *outval)
 {
 	static int64_t cached_is_managed = -1;

Modified: trunk/launchd/src/libvproc_internal.h
===================================================================
--- trunk/launchd/src/libvproc_internal.h	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/libvproc_internal.h	2007-07-06 21:38:27 UTC (rev 23297)
@@ -1,7 +1,7 @@
 #ifndef _VPROC_INTERNAL_H_
 #define _VPROC_INTERNAL_H_
 /*
- * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2006-2007 Apple Inc. All rights reserved.
  *
  * @APPLE_APACHE_LICENSE_HEADER_START@
  * 
@@ -21,9 +21,12 @@
  */
 
 #include <mach/mach.h>
+#include <sys/queue.h>
+#include <sys/time.h>
 #include <stdarg.h>
 #include "liblaunch_public.h"
 #include "libbootstrap_public.h"
+#include "libvproc_public.h"
 
 typedef char * _internal_string_t;
 typedef char * logmsg_t;
@@ -53,8 +56,29 @@
 
 kern_return_t _vprocmgr_getsocket(name_t);
 
+
+struct logmsg_s {
+	STAILQ_ENTRY(logmsg_s) sqe;
+	struct timeval when;
+	pid_t from_pid;
+	pid_t about_pid;
+	uid_t sender_uid;
+	gid_t sender_gid;
+	int err_num;
+	int pri;
+	const char *from_name;
+	const char *about_name;
+	const char *session_name;
+	const char *msg;
+	size_t obj_sz;
+	char data[0];
+};
+
+
 void _vproc_logv(int pri, int err, const char *msg, va_list ap);
+vproc_err_t _vprocmgr_log_forward(mach_port_t mp, void *data, size_t len);
 
+
 kern_return_t
 bootstrap_info(
 		mach_port_t bp,

Modified: trunk/launchd/src/libvproc_private.h
===================================================================
--- trunk/launchd/src/libvproc_private.h	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/libvproc_private.h	2007-07-06 21:38:27 UTC (rev 23297)
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include <sys/cdefs.h>
 #include <sys/syslog.h>
+#include <sys/time.h>
 #include <stdbool.h>
 #include <launch.h>
 
@@ -52,6 +53,10 @@
 vproc_err_t _vproc_get_last_exit_status(int *wstatus);
 vproc_err_t _vproc_set_global_on_demand(bool val);
 
+typedef void (*_vprocmgr_log_drain_callback_t)(struct timeval *when, pid_t from_pid, pid_t about_pid, uid_t sender_uid, gid_t sender_gid, int priority, const char *from_name, const char *about_name, const char *session_name, const char *msg);
+
+vproc_err_t _vprocmgr_log_drain(vproc_t vp, pthread_mutex_t *optional_mutex_around_callback, _vprocmgr_log_drain_callback_t func);
+
 vproc_err_t _vproc_send_signal_by_label(const char *label, int sig);
 
 void _vproc_log(int pri, const char *msg, ...) __attribute__((format(printf, 2, 3)));

Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/protocol_job.defs	2007-07-06 21:38:27 UTC (rev 23297)
@@ -115,7 +115,7 @@
 
 routine wait(
 		__bs_port	: job_t;
-	sreplyport		__rport	: mach_port_make_send_once_t;
+	sreplyport	__rport	: mach_port_make_send_once_t;
 	out	__waitval	: integer_t);
 
 routine uncork_fork(
@@ -156,3 +156,12 @@
 		__outkey	: vproc_gsk_t;
 		__inval		: pointer_t;
 	out	__outval	: pointer_t, dealloc);
+
+routine log_drain(
+		__bs_port	: job_t;
+	sreplyport	__rport	: mach_port_make_send_once_t;
+	out	__outval	: pointer_t, dealloc);
+
+routine log_forward(
+		__bs_port	: job_t;
+		__inval		: pointer_t);

Modified: trunk/launchd/src/protocol_job_reply.defs
===================================================================
--- trunk/launchd/src/protocol_job_reply.defs	2007-07-06 16:44:54 UTC (rev 23296)
+++ trunk/launchd/src/protocol_job_reply.defs	2007-07-06 21:38:27 UTC (rev 23297)
@@ -37,7 +37,7 @@
 
 skip; /* look_up */
 
-skip;
+skip; /* send_signal */
 
 skip; /* parent */
 
@@ -59,3 +59,22 @@
 		__r_port	: mach_port_move_send_once_t;
 		__result	: kern_return_t, RetCode;
 		__wait		: integer_t);
+
+skip; /* uncork_fork */
+
+skip; /* swap_integer */
+
+skip; /* set_service_policy */
+
+skip; /* log */
+
+skip; /* lookup_per_user_context */
+
+skip; /* move_subset */
+
+skip; /* swap_complex */
+
+simpleroutine job_mig_log_drain_reply(
+		__r_port	: mach_port_move_send_once_t;
+		__result	: kern_return_t, RetCode;
+		__outval        : pointer_t);

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


More information about the launchd-changes mailing list