[launchd-changes] [23928] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Thu Jul 2 16:29:49 PDT 2009


Revision: 23928
          http://trac.macosforge.org/projects/launchd/changeset/23928
Author:   dsorresso at 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);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/launchd-changes/attachments/20090702/d7c0dc0d/attachment.html>


More information about the launchd-changes mailing list