[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