Projects
Browse Source     Search     Timeline     Wiki

Changeset 23485

Show
Ignore:
Timestamp:
01/18/08 09:49:34 (11 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/5692704> SpringBoard needs custom launchd job management API

Location:
branches/SULeopard/launchd/src
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • branches/SULeopard/launchd/src/launchd_core_logic.c

    r23459 r23485  
    323323        size_t j_binpref_cnt; 
    324324        mach_port_t j_port; 
    325         mach_port_t wait_reply_port; 
     325        mach_port_t wait_reply_port;    /* we probably should switch to a list of waiters */ 
    326326        uid_t mach_uid; 
    327327        jobmgr_t mgr; 
     
    362362                     wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_bootstrap:1, start_on_mount:1, 
    363363                     per_user:1, hopefully_exits_first:1, deny_unknown_mslookups:1, unload_at_mig_return:1, abandon_pg:1, 
    364                      poll_for_vfs_changes:1, internal_exc_handler:1; 
     364                     poll_for_vfs_changes:1, internal_exc_handler:1, can_kickstart:1; 
    365365        const char label[0]; 
    366366}; 
     
    15691569} 
    15701570 
     1571static void 
     1572policy_setup(launch_data_t obj, const char *key, void *context) 
     1573{ 
     1574        job_t j = context; 
     1575        bool found_key = false; 
     1576 
     1577        switch (key[0]) { 
     1578        case 'c': 
     1579        case 'C': 
     1580                if (strcasecmp(key, LAUNCH_JOBPOLICY_CANKICKSTARTOTHERJOBS) == 0) { 
     1581                        j->can_kickstart = launch_data_get_bool(obj); 
     1582                        found_key = true; 
     1583                } 
     1584                break; 
     1585        default: 
     1586                break; 
     1587        } 
     1588 
     1589        if (unlikely(!found_key)) { 
     1590                job_log(j, LOG_WARNING, "Unknown policy: %s", key); 
     1591        } 
     1592} 
     1593 
    15711594void 
    15721595job_import_dictionary(job_t j, const char *key, launch_data_t value) 
     
    15751598 
    15761599        switch (key[0]) { 
     1600        case 'p': 
     1601        case 'P': 
     1602                if (strcasecmp(key, LAUNCH_JOBKEY_POLICIES) == 0) { 
     1603                        launch_data_dict_iterate(value, policy_setup, j); 
     1604                } 
     1605                break; 
    15771606        case 'k': 
    15781607        case 'K': 
     
    63686397 
    63696398kern_return_t 
     6399job_mig_embedded_wait(job_t j, name_t targetlabel, integer_t *waitstatus) 
     6400{ 
     6401        job_t otherj; 
     6402 
     6403        if (!launchd_assumes(j != NULL)) { 
     6404                return BOOTSTRAP_NO_MEMORY; 
     6405        } 
     6406 
     6407        if (unlikely(!(otherj = job_find(targetlabel)))) { 
     6408                return BOOTSTRAP_UNKNOWN_SERVICE; 
     6409        } 
     6410 
     6411        *waitstatus = j->last_exit_status; 
     6412 
     6413        return 0; 
     6414} 
     6415 
     6416kern_return_t 
     6417job_mig_embedded_kickstart(job_t j, name_t targetlabel, pid_t *out_pid, mach_port_t *out_name_port) 
     6418{ 
     6419        struct ldcred ldc; 
     6420        kern_return_t kr; 
     6421        job_t otherj; 
     6422 
     6423        if (!launchd_assumes(j != NULL)) { 
     6424                return BOOTSTRAP_NO_MEMORY; 
     6425        } 
     6426 
     6427        runtime_get_caller_creds(&ldc); 
     6428 
     6429        if (!j->can_kickstart || (ldc.euid != 0 && ldc.euid != geteuid())) { 
     6430                return BOOTSTRAP_NOT_PRIVILEGED; 
     6431        } 
     6432 
     6433        if (unlikely(!(otherj = job_find(targetlabel)))) { 
     6434                return BOOTSTRAP_UNKNOWN_SERVICE; 
     6435        } 
     6436 
     6437        otherj = job_dispatch(otherj, true); 
     6438 
     6439        if (!job_assumes(j, otherj && otherj->p)) { 
     6440                return BOOTSTRAP_NO_MEMORY; 
     6441        } 
     6442 
     6443        kr = task_name_for_pid(mach_task_self(), otherj->p, out_name_port); 
     6444        if (!job_assumes(j, kr == 0)) { 
     6445                return kr; 
     6446        } 
     6447 
     6448        *out_pid = otherj->p; 
     6449 
     6450        return 0; 
     6451} 
     6452 
     6453kern_return_t 
    63706454job_mig_wait(job_t j, mach_port_t srp, integer_t *waitstatus) 
    63716455{ 
  • branches/SULeopard/launchd/src/launchd_runtime.h

    r23459 r23485  
    5050 
    5151#define launchd_assert(e)       if (__builtin_constant_p(e)) { char __compile_time_assert__[e ? 1 : -1] __attribute__((unused)); } else if (!launchd_assumes(e)) { abort(); } 
     52 
     53#define likely(x)       __builtin_expect((bool)(x), true) 
     54#define unlikely(x)     __builtin_expect((bool)(x), false) 
    5255 
    5356void _log_launchd_bug(const char *rcs_rev, const char *path, unsigned int line, const char *test); 
  • branches/SULeopard/launchd/src/liblaunch_public.h

    r23406 r23485  
    100100#define LAUNCH_JOBKEY_LAUNCHONLYONCE            "LaunchOnlyOnce" 
    101101#define LAUNCH_JOBKEY_ABANDONPROCESSGROUP       "AbandonProcessGroup" 
     102#define LAUNCH_JOBKEY_POLICIES                  "Policies" 
     103 
     104#define LAUNCH_JOBPOLICY_CANKICKSTARTOTHERJOBS  "CanKickStartOtherJobs" 
    102105 
    103106#define LAUNCH_JOBINETDCOMPATIBILITY_WAIT       "Wait" 
  • branches/SULeopard/launchd/src/libvproc.c

    r23384 r23485  
    554554 
    555555vproc_err_t 
     556_vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name) 
     557{ 
     558        if (vproc_mig_embedded_kickstart(bootstrap_port, (char *)label, out_pid, out_port_name) == 0) { 
     559                return NULL; 
     560        } 
     561 
     562        return (vproc_err_t)_vproc_kickstart_by_label; 
     563} 
     564 
     565vproc_err_t 
     566_vproc_wait_by_label(const char *label, int *out_wstatus) 
     567{ 
     568        if (vproc_mig_embedded_wait(bootstrap_port, (char *)label, out_wstatus) == 0) { 
     569                return NULL; 
     570        } 
     571 
     572        return (vproc_err_t)_vproc_wait_by_label; 
     573} 
     574 
     575vproc_err_t 
    556576_vproc_set_global_on_demand(bool state) 
    557577{ 
  • branches/SULeopard/launchd/src/libvproc_private.h

    r23304 r23485  
    6262 
    6363vproc_err_t _vproc_send_signal_by_label(const char *label, int sig); 
     64vproc_err_t _vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name); 
     65vproc_err_t _vproc_wait_by_label(const char *label, int *out_wstatus); 
    6466 
    6567void _vproc_log(int pri, const char *msg, ...) __attribute__((format(printf, 2, 3))); 
  • branches/SULeopard/launchd/src/protocol_job.defs

    r23343 r23485  
    167167                __bs_port       : job_t; 
    168168                __inval         : pointer_t); 
     169 
     170routine embedded_kickstart( 
     171                __bs_port       : job_t; 
     172                __label         : name_t; 
     173        out     __pid           : pid_t; 
     174        out     __name_port     : mach_port_t); 
     175 
     176routine embedded_wait( 
     177                __bs_port       : job_t; 
     178                __label         : name_t; 
     179        out     __waitval       : integer_t);