[23485] branches/SULeopard/launchd/src
Revision: 23485 http://trac.macosforge.org/projects/launchd/changeset/23485 Author: zarzycki@apple.com Date: 2008-01-18 09:49:34 -0800 (Fri, 18 Jan 2008) Log Message: ----------- <rdar://problem/5692704> SpringBoard needs custom launchd job management API Modified Paths: -------------- branches/SULeopard/launchd/src/launchd_core_logic.c branches/SULeopard/launchd/src/launchd_runtime.h branches/SULeopard/launchd/src/liblaunch_public.h branches/SULeopard/launchd/src/libvproc.c branches/SULeopard/launchd/src/libvproc_private.h branches/SULeopard/launchd/src/protocol_job.defs Modified: branches/SULeopard/launchd/src/launchd_core_logic.c =================================================================== --- branches/SULeopard/launchd/src/launchd_core_logic.c 2008-01-16 20:56:12 UTC (rev 23484) +++ branches/SULeopard/launchd/src/launchd_core_logic.c 2008-01-18 17:49:34 UTC (rev 23485) @@ -322,7 +322,7 @@ cpu_type_t *j_binpref; size_t j_binpref_cnt; mach_port_t j_port; - mach_port_t wait_reply_port; + mach_port_t wait_reply_port; /* we probably should switch to a list of waiters */ uid_t mach_uid; jobmgr_t mgr; char **argv; @@ -361,7 +361,7 @@ currently_ignored:1, forced_peers_to_demand_mode:1, setnice:1, hopefully_exits_last:1, removal_pending:1, wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_bootstrap:1, start_on_mount:1, per_user:1, hopefully_exits_first:1, deny_unknown_mslookups:1, unload_at_mig_return:1, abandon_pg:1, - poll_for_vfs_changes:1, internal_exc_handler:1; + poll_for_vfs_changes:1, internal_exc_handler:1, can_kickstart:1; const char label[0]; }; @@ -1568,12 +1568,41 @@ } } +static void +policy_setup(launch_data_t obj, const char *key, void *context) +{ + job_t j = context; + bool found_key = false; + + switch (key[0]) { + case 'c': + case 'C': + if (strcasecmp(key, LAUNCH_JOBPOLICY_CANKICKSTARTOTHERJOBS) == 0) { + j->can_kickstart = launch_data_get_bool(obj); + found_key = true; + } + break; + default: + break; + } + + if (unlikely(!found_key)) { + job_log(j, LOG_WARNING, "Unknown policy: %s", key); + } +} + void job_import_dictionary(job_t j, const char *key, launch_data_t value) { launch_data_t tmp; switch (key[0]) { + case 'p': + case 'P': + if (strcasecmp(key, LAUNCH_JOBKEY_POLICIES) == 0) { + launch_data_dict_iterate(value, policy_setup, j); + } + break; case 'k': case 'K': if (strcasecmp(key, LAUNCH_JOBKEY_KEEPALIVE) == 0) { @@ -6367,6 +6396,61 @@ } kern_return_t +job_mig_embedded_wait(job_t j, name_t targetlabel, integer_t *waitstatus) +{ + job_t otherj; + + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + + if (unlikely(!(otherj = job_find(targetlabel)))) { + return BOOTSTRAP_UNKNOWN_SERVICE; + } + + *waitstatus = j->last_exit_status; + + return 0; +} + +kern_return_t +job_mig_embedded_kickstart(job_t j, name_t targetlabel, pid_t *out_pid, mach_port_t *out_name_port) +{ + struct ldcred ldc; + kern_return_t kr; + job_t otherj; + + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + + runtime_get_caller_creds(&ldc); + + if (!j->can_kickstart || (ldc.euid != 0 && ldc.euid != geteuid())) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + + if (unlikely(!(otherj = job_find(targetlabel)))) { + return BOOTSTRAP_UNKNOWN_SERVICE; + } + + otherj = job_dispatch(otherj, true); + + if (!job_assumes(j, otherj && otherj->p)) { + return BOOTSTRAP_NO_MEMORY; + } + + kr = task_name_for_pid(mach_task_self(), otherj->p, out_name_port); + if (!job_assumes(j, kr == 0)) { + return kr; + } + + *out_pid = otherj->p; + + return 0; +} + +kern_return_t job_mig_wait(job_t j, mach_port_t srp, integer_t *waitstatus) { if (!launchd_assumes(j != NULL)) { Modified: branches/SULeopard/launchd/src/launchd_runtime.h =================================================================== --- branches/SULeopard/launchd/src/launchd_runtime.h 2008-01-16 20:56:12 UTC (rev 23484) +++ branches/SULeopard/launchd/src/launchd_runtime.h 2008-01-18 17:49:34 UTC (rev 23485) @@ -50,6 +50,9 @@ #define launchd_assert(e) if (__builtin_constant_p(e)) { char __compile_time_assert__[e ? 1 : -1] __attribute__((unused)); } else if (!launchd_assumes(e)) { abort(); } +#define likely(x) __builtin_expect((bool)(x), true) +#define unlikely(x) __builtin_expect((bool)(x), false) + void _log_launchd_bug(const char *rcs_rev, const char *path, unsigned int line, const char *test); typedef void (*kq_callback)(void *, struct kevent *); Modified: branches/SULeopard/launchd/src/liblaunch_public.h =================================================================== --- branches/SULeopard/launchd/src/liblaunch_public.h 2008-01-16 20:56:12 UTC (rev 23484) +++ branches/SULeopard/launchd/src/liblaunch_public.h 2008-01-18 17:49:34 UTC (rev 23485) @@ -99,7 +99,10 @@ #define LAUNCH_JOBKEY_THROTTLEINTERVAL "ThrottleInterval" #define LAUNCH_JOBKEY_LAUNCHONLYONCE "LaunchOnlyOnce" #define LAUNCH_JOBKEY_ABANDONPROCESSGROUP "AbandonProcessGroup" +#define LAUNCH_JOBKEY_POLICIES "Policies" +#define LAUNCH_JOBPOLICY_CANKICKSTARTOTHERJOBS "CanKickStartOtherJobs" + #define LAUNCH_JOBINETDCOMPATIBILITY_WAIT "Wait" #define LAUNCH_JOBKEY_MACH_RESETATCLOSE "ResetAtClose" Modified: branches/SULeopard/launchd/src/libvproc.c =================================================================== --- branches/SULeopard/launchd/src/libvproc.c 2008-01-16 20:56:12 UTC (rev 23484) +++ branches/SULeopard/launchd/src/libvproc.c 2008-01-18 17:49:34 UTC (rev 23485) @@ -553,6 +553,26 @@ } vproc_err_t +_vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name) +{ + if (vproc_mig_embedded_kickstart(bootstrap_port, (char *)label, out_pid, out_port_name) == 0) { + return NULL; + } + + return (vproc_err_t)_vproc_kickstart_by_label; +} + +vproc_err_t +_vproc_wait_by_label(const char *label, int *out_wstatus) +{ + if (vproc_mig_embedded_wait(bootstrap_port, (char *)label, out_wstatus) == 0) { + return NULL; + } + + return (vproc_err_t)_vproc_wait_by_label; +} + +vproc_err_t _vproc_set_global_on_demand(bool state) { int64_t val = state ? ~0 : 0; Modified: branches/SULeopard/launchd/src/libvproc_private.h =================================================================== --- branches/SULeopard/launchd/src/libvproc_private.h 2008-01-16 20:56:12 UTC (rev 23484) +++ branches/SULeopard/launchd/src/libvproc_private.h 2008-01-18 17:49:34 UTC (rev 23485) @@ -61,6 +61,8 @@ 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); +vproc_err_t _vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name); +vproc_err_t _vproc_wait_by_label(const char *label, int *out_wstatus); 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: branches/SULeopard/launchd/src/protocol_job.defs =================================================================== --- branches/SULeopard/launchd/src/protocol_job.defs 2008-01-16 20:56:12 UTC (rev 23484) +++ branches/SULeopard/launchd/src/protocol_job.defs 2008-01-18 17:49:34 UTC (rev 23485) @@ -166,3 +166,14 @@ routine log_forward( __bs_port : job_t; __inval : pointer_t); + +routine embedded_kickstart( + __bs_port : job_t; + __label : name_t; + out __pid : pid_t; + out __name_port : mach_port_t); + +routine embedded_wait( + __bs_port : job_t; + __label : name_t; + out __waitval : integer_t);
participants (1)
-
source_changes@macosforge.org