Revision: 23228 http://trac.macosforge.org/projects/launchd/changeset/23228 Author: zarzycki@apple.com Date: 2007-04-18 10:30:47 -0700 (Wed, 18 Apr 2007) Log Message: ----------- <rdar://problem/4485670> need a way to have launchd safely send a signal to one of its child processes Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/libvproc.c trunk/launchd/src/libvproc_private.h trunk/launchd/src/protocol_job.defs Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-04-18 16:05:52 UTC (rev 23227) +++ trunk/launchd/src/launchd_core_logic.c 2007-04-18 17:30:47 UTC (rev 23228) @@ -4456,6 +4456,33 @@ } kern_return_t +job_mig_send_signal(job_t j, name_t targetlabel, int sig) +{ + struct ldcred ldc; + job_t otherj; + + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + + runtime_get_caller_creds(&ldc); + + if (ldc.euid != 0 && ldc.euid != getuid()) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + + if (!(otherj = job_find(targetlabel))) { + return BOOTSTRAP_UNKNOWN_SERVICE; + } + + if (otherj->p) { + job_assumes(j, kill(otherj->p, sig) != -1); + } + + return 0; +} + +kern_return_t job_mig_swap_integer(job_t j, vproc_gsk_t inkey, vproc_gsk_t outkey, int64_t inval, int64_t *outval) { const char *action; Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2007-04-18 16:05:52 UTC (rev 23227) +++ trunk/launchd/src/libvproc.c 2007-04-18 17:30:47 UTC (rev 23228) @@ -232,6 +232,16 @@ } vproc_err_t +_vproc_send_signal_by_label(const char *label, int sig) +{ + if (vproc_mig_send_signal(bootstrap_port, (char *)label, sig) == 0) { + return NULL; + } + + return _vproc_send_signal_by_label; +} + +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_private.h =================================================================== --- trunk/launchd/src/libvproc_private.h 2007-04-18 16:05:52 UTC (rev 23227) +++ trunk/launchd/src/libvproc_private.h 2007-04-18 17:30:47 UTC (rev 23228) @@ -46,6 +46,8 @@ vproc_err_t _vproc_get_last_exit_status(int *wstatus); vproc_err_t _vproc_set_global_on_demand(bool val); +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))); void _vproc_log_error(int pri, const char *msg, ...) __attribute__((format(printf, 2, 3))); Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- trunk/launchd/src/protocol_job.defs 2007-04-18 16:05:52 UTC (rev 23227) +++ trunk/launchd/src/protocol_job.defs 2007-04-18 17:30:47 UTC (rev 23228) @@ -68,7 +68,10 @@ __target_pid : pid_t; __flags : uint64_t); -skip; /* last used in 10.4 */ +routine send_signal( + __bs_port : job_t; + __label : name_t; + __signal : integer_t); routine parent( __bs_port : job_t;