Revision: 23928 http://trac.macosforge.org/projects/launchd/changeset/23928 Author: dsorresso@apple.com Date: 2009-07-02 16:29:48 -0700 (Thu, 02 Jul 2009) Log Message: ----------- <rdar://problem/6991074> Couldn't launch applications, -600 error -- coreservicesd appeared to be wedged Modified Paths: -------------- trunk/launchd/src/StartupItems.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/libvproc.c trunk/launchd/src/protocol_job_reply.defs trunk/launchd/src/protocol_vproc.defs Modified: trunk/launchd/src/StartupItems.c =================================================================== --- trunk/launchd/src/StartupItems.c 2009-06-18 22:47:09 UTC (rev 23927) +++ trunk/launchd/src/StartupItems.c 2009-07-02 23:29:48 UTC (rev 23928) @@ -294,7 +294,7 @@ * * Just in case... */ - mkdir(aPath, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH); + mkdir(aPath, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); if (!StartupItemSecurityCheck(aPath)) continue; Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2009-06-18 22:47:09 UTC (rev 23927) +++ trunk/launchd/src/launchd_core_logic.c 2009-07-02 23:29:48 UTC (rev 23928) @@ -156,9 +156,10 @@ struct waiting_for_exit { LIST_ENTRY(waiting_for_exit) sle; mach_port_t rp; + bool legacy; }; -static bool waiting4exit_new(job_t j, mach_port_t rp); +static bool waiting4exit_new(job_t j, mach_port_t rp, bool legacy); static void waiting4exit_delete(job_t j, struct waiting_for_exit *w4e); struct machservice { @@ -8581,17 +8582,25 @@ kern_return_t job_mig_wait(job_t j, mach_port_t srp, integer_t *waitstatus) { +#if 0 if (!launchd_assumes(j != NULL)) { return BOOTSTRAP_NO_MEMORY; } -#if 0 + return job_handle_mpm_wait(j, srp, waitstatus); +#else + if( false ) { + /* To make the compiler happy. */ + job_handle_mpm_wait(NULL, MACH_PORT_NULL, NULL); + } struct ldcred *ldc = runtime_get_caller_creds(); + job_t calling_j = job_mig_intran2(j->mgr, MACH_PORT_NULL, ldc->pid); + + return job_mig_wait2(calling_j, j, srp, waitstatus, true); #endif - return job_handle_mpm_wait(j, srp, waitstatus); } kern_return_t -job_mig_wait2(job_t j, job_t target_j, mach_port_t srp, integer_t *status __attribute__((unused))) +job_mig_wait2(job_t j, job_t target_j, mach_port_t srp, integer_t *status, boolean_t legacy) { if( !launchd_assumes(j != NULL) ) { return BOOTSTRAP_NO_MEMORY; @@ -8599,12 +8608,16 @@ if( !launchd_assumes(target_j != NULL) ) { return BOOTSTRAP_NO_MEMORY; } + if( !launchd_assumes(status != NULL) ) { + return BOOTSTRAP_NO_MEMORY; + } if( target_j->p == 0 ) { + *status = target_j->last_exit_status; return BOOTSTRAP_SUCCESS; } - if( !job_assumes(j, waiting4exit_new(target_j, srp) == true) ) { + if( !job_assumes(j, waiting4exit_new(target_j, srp, legacy) == true) ) { return BOOTSTRAP_NO_MEMORY; } @@ -8792,7 +8805,7 @@ } bool -waiting4exit_new(job_t j, mach_port_t rp) +waiting4exit_new(job_t j, mach_port_t rp, bool legacy) { struct waiting_for_exit *w4e = NULL; if( !job_assumes(j, (w4e = malloc(sizeof(struct waiting_for_exit))) != NULL) ) { @@ -8800,6 +8813,7 @@ } w4e->rp = rp; + w4e->legacy = legacy; LIST_INSERT_HEAD(&j->exit_watchers, w4e, sle); return true; @@ -8808,7 +8822,12 @@ void waiting4exit_delete(job_t j, struct waiting_for_exit *w4e) { - job_assumes(j, job_mig_wait2_reply(w4e->rp, KERN_SUCCESS, j->last_exit_status) == KERN_SUCCESS); + if( !w4e->legacy ) { + job_assumes(j, job_mig_wait2_reply(w4e->rp, KERN_SUCCESS, j->last_exit_status, false) == KERN_SUCCESS); + } else { + job_assumes(j, job_mig_wait_reply(w4e->rp, KERN_SUCCESS, j->last_exit_status) == KERN_SUCCESS); + } + LIST_REMOVE(w4e, sle); free(w4e); Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2009-06-18 22:47:09 UTC (rev 23927) +++ trunk/launchd/src/libvproc.c 2009-07-02 23:29:48 UTC (rev 23928) @@ -704,7 +704,7 @@ } kern_return_t -mpm_wait(mach_port_t ajob __attribute__((unused)), int *wstatus) +mpm_wait(mach_port_t ajob, int *wstatus) { return vproc_mig_wait(ajob, wstatus); } @@ -863,7 +863,7 @@ vproc_t pu_vp = vprocmgr_lookup_vproc(peruser_label); if( pu_vp ) { int status = 0; - kr = vproc_mig_wait2(bootstrap_port, pu_vp->j_port, &status); + kr = vproc_mig_wait2(bootstrap_port, pu_vp->j_port, &status, false); vproc_release(pu_vp); } break; Modified: trunk/launchd/src/protocol_job_reply.defs =================================================================== --- trunk/launchd/src/protocol_job_reply.defs 2009-06-18 22:47:09 UTC (rev 23927) +++ trunk/launchd/src/protocol_job_reply.defs 2009-07-02 23:29:48 UTC (rev 23928) @@ -100,4 +100,5 @@ simpleroutine job_mig_wait2_reply( __r_port : mach_port_move_send_once_t; __result : kern_return_t, RetCode; - __waitval : integer_t); + __waitval : integer_t; + __legacy : boolean_t); Modified: trunk/launchd/src/protocol_vproc.defs =================================================================== --- trunk/launchd/src/protocol_vproc.defs 2009-06-18 22:47:09 UTC (rev 23927) +++ trunk/launchd/src/protocol_vproc.defs 2009-07-02 23:29:48 UTC (rev 23928) @@ -225,4 +225,5 @@ __bs_port : job_t; __target_port : job_t; sreplyport __rport : mach_port_make_send_once_t; -out __waitval : integer_t); +out __waitval : integer_t; + __legacy : boolean_t);