[launchd-changes] [23485] branches/SULeopard/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Fri Jan 18 09:49:36 PST 2008
Revision: 23485
http://trac.macosforge.org/projects/launchd/changeset/23485
Author: zarzycki at 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);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20080118/5125729e/attachment.html
More information about the launchd-changes
mailing list