Revision: 23539 http://trac.macosforge.org/projects/launchd/changeset/23539 Author: zarzycki@apple.com Date: 2008-03-06 11:00:19 -0800 (Thu, 06 Mar 2008) Log Message: ----------- Refinements on: <rdar://problem/5783944> Deprecate bootstrap_create_service() in favor of bootstrap_check_in() Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/libbootstrap.c trunk/launchd/src/libbootstrap_private.h trunk/launchd/src/protocol_job.defs Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2008-03-06 18:46:35 UTC (rev 23538) +++ trunk/launchd/src/launchd_core_logic.c 2008-03-06 19:00:19 UTC (rev 23539) @@ -140,8 +140,9 @@ job_t job; unsigned int gen_num; mach_port_name_t port; - unsigned int isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, - per_user_hack:1, debug_on_close:1, per_pid:1, special_port_num:24; + unsigned int isActive:1, reset:1, recv:1, hide:1, + kUNCServer:1, per_user_hack:1, debug_on_close:1, per_pid:1, + delete_on_destruction:1, special_port_num:23; const char name[0]; }; @@ -4888,6 +4889,7 @@ job_ack_port_destruction(mach_port_t p) { struct machservice *ms; + job_t j; LIST_FOREACH(ms, &port_hash[HASH_PORT(p)], port_hash_sle) { if (ms->recv && (ms->port == p)) { @@ -4895,18 +4897,23 @@ } } - if (!ms) { + if (!jobmgr_assumes(root_jobmgr, ms != NULL)) { return false; } + j = ms->job; + + job_log(j, LOG_DEBUG, "Receive right returned to us: %s", ms->name); + ms->isActive = false; - if (ms->reset) { - machservice_resetport(ms->job, ms); + if (ms->delete_on_destruction) { + machservice_delete(j, ms, false); + } else if (ms->reset) { + machservice_resetport(j, ms); } - job_log(ms->job, LOG_DEBUG, "Receive right returned to us: %s", ms->name); - job_dispatch(ms->job, false); + job_dispatch(j, false); root_jobmgr = jobmgr_do_garbage_collection(root_jobmgr); @@ -5901,26 +5908,27 @@ } kern_return_t -job_mig_check_in(job_t j, name_t servicename, mach_port_t *serviceportp) +job_mig_check_in2(job_t j, name_t servicename, mach_port_t *serviceportp, uint64_t flags) { + bool per_pid_service = flags & BOOTSTRAP_PER_PID_SERVICE; + struct ldcred *ldc = runtime_get_caller_creds(); struct machservice *ms; - struct ldcred *ldc = runtime_get_caller_creds(); job_t jo; if (!launchd_assumes(j != NULL)) { return BOOTSTRAP_NO_MEMORY; } - ms = jobmgr_lookup_service(j->mgr, servicename, true, 0); + ms = jobmgr_lookup_service(j->mgr, servicename, false, per_pid_service ? ldc->pid : 0); if (ms == NULL) { *serviceportp = MACH_PORT_NULL; - ms = machservice_new(j, servicename, serviceportp, false); - if (unlikely(ms == NULL)) { + if (unlikely((ms = machservice_new(j, servicename, serviceportp, per_pid_service)) == NULL)) { return BOOTSTRAP_NO_MEMORY; } + ms->delete_on_destruction = true; /* parity with bootstrap_register() */ job_checkin(j); if (!(j->anonymous || j->legacy_LS_job || j->legacy_mach_job)) { Modified: trunk/launchd/src/libbootstrap.c =================================================================== --- trunk/launchd/src/libbootstrap.c 2008-03-06 18:46:35 UTC (rev 23538) +++ trunk/launchd/src/libbootstrap.c 2008-03-06 19:00:19 UTC (rev 23539) @@ -116,10 +116,16 @@ kern_return_t bootstrap_check_in(mach_port_t bp, name_t service_name, mach_port_t *sp) { - return vproc_mig_check_in(bp, service_name, sp); + return vproc_mig_check_in2(bp, service_name, sp, 0); } kern_return_t +bootstrap_check_in2(mach_port_t bp, name_t service_name, mach_port_t *sp, uint64_t flags) +{ + return vproc_mig_check_in2(bp, service_name, sp, flags); +} + +kern_return_t bootstrap_look_up_per_user(mach_port_t bp, name_t service_name, uid_t target_user, mach_port_t *sp) { struct stat sb; Modified: trunk/launchd/src/libbootstrap_private.h =================================================================== --- trunk/launchd/src/libbootstrap_private.h 2008-03-06 18:46:35 UTC (rev 23538) +++ trunk/launchd/src/libbootstrap_private.h 2008-03-06 19:00:19 UTC (rev 23539) @@ -35,6 +35,8 @@ kern_return_t bootstrap_look_up2(mach_port_t bp, name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags); +kern_return_t bootstrap_check_in2(mach_port_t bp, name_t service_name, mach_port_t *sp, uint64_t flags); + kern_return_t bootstrap_look_up_per_user(mach_port_t bp, name_t service_name, uid_t target_user, mach_port_t *sp); kern_return_t bootstrap_set_policy(mach_port_t bp, pid_t target_pid, uint64_t flags, const char *target_service); Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- trunk/launchd/src/protocol_job.defs 2008-03-06 18:46:35 UTC (rev 23538) +++ trunk/launchd/src/protocol_job.defs 2008-03-06 19:00:19 UTC (rev 23539) @@ -50,10 +50,11 @@ __bs_port : job_t; __flags : uint64_t); -routine check_in( - __bs_port : job_t; - __service_name : name_t; - out __service_port : mach_port_move_receive_t); +routine check_in2( + __bs_port : job_t; + __service_name : name_t; + out __service_port : mach_port_move_receive_t; + __flags : uint64_t); routine register2( __bs_port : job_t;
participants (1)
-
source_changes@macosforge.org