Revision: 23297 http://trac.macosforge.org/projects/launchd/changeset/23297 Author: zarzycki@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);
participants (1)
-
source_changes@macosforge.org