Changeset 23485
- Timestamp:
- 01/18/08 09:49:34 (11 months ago)
- Location:
- branches/SULeopard/launchd/src
- Files:
-
- 6 modified
-
launchd_core_logic.c (modified) (5 diffs)
-
launchd_runtime.h (modified) (1 diff)
-
liblaunch_public.h (modified) (1 diff)
-
libvproc.c (modified) (1 diff)
-
libvproc_private.h (modified) (1 diff)
-
protocol_job.defs (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/SULeopard/launchd/src/launchd_core_logic.c
r23459 r23485 323 323 size_t j_binpref_cnt; 324 324 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 */ 326 326 uid_t mach_uid; 327 327 jobmgr_t mgr; … … 362 362 wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_bootstrap:1, start_on_mount:1, 363 363 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; 365 365 const char label[0]; 366 366 }; … … 1569 1569 } 1570 1570 1571 static void 1572 policy_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 1571 1594 void 1572 1595 job_import_dictionary(job_t j, const char *key, launch_data_t value) … … 1575 1598 1576 1599 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; 1577 1606 case 'k': 1578 1607 case 'K': … … 6368 6397 6369 6398 kern_return_t 6399 job_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 6416 kern_return_t 6417 job_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 6453 kern_return_t 6370 6454 job_mig_wait(job_t j, mach_port_t srp, integer_t *waitstatus) 6371 6455 { -
branches/SULeopard/launchd/src/launchd_runtime.h
r23459 r23485 50 50 51 51 #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) 52 55 53 56 void _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 100 100 #define LAUNCH_JOBKEY_LAUNCHONLYONCE "LaunchOnlyOnce" 101 101 #define LAUNCH_JOBKEY_ABANDONPROCESSGROUP "AbandonProcessGroup" 102 #define LAUNCH_JOBKEY_POLICIES "Policies" 103 104 #define LAUNCH_JOBPOLICY_CANKICKSTARTOTHERJOBS "CanKickStartOtherJobs" 102 105 103 106 #define LAUNCH_JOBINETDCOMPATIBILITY_WAIT "Wait" -
branches/SULeopard/launchd/src/libvproc.c
r23384 r23485 554 554 555 555 vproc_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 565 vproc_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 575 vproc_err_t 556 576 _vproc_set_global_on_demand(bool state) 557 577 { -
branches/SULeopard/launchd/src/libvproc_private.h
r23304 r23485 62 62 63 63 vproc_err_t _vproc_send_signal_by_label(const char *label, int sig); 64 vproc_err_t _vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name); 65 vproc_err_t _vproc_wait_by_label(const char *label, int *out_wstatus); 64 66 65 67 void _vproc_log(int pri, const char *msg, ...) __attribute__((format(printf, 2, 3))); -
branches/SULeopard/launchd/src/protocol_job.defs
r23343 r23485 167 167 __bs_port : job_t; 168 168 __inval : pointer_t); 169 170 routine embedded_kickstart( 171 __bs_port : job_t; 172 __label : name_t; 173 out __pid : pid_t; 174 out __name_port : mach_port_t); 175 176 routine embedded_wait( 177 __bs_port : job_t; 178 __label : name_t; 179 out __waitval : integer_t);

