[launchd-changes] [23125] trunk/launchd/src/launchd_core_logic.c

source_changes at macosforge.org source_changes at macosforge.org
Sat Mar 3 15:42:02 PST 2007


Revision: 23125
          http://trac.macosforge.org/projects/launchd/changeset/23125
Author:   zarzycki at apple.com
Date:     2007-03-03 15:42:02 -0800 (Sat, 03 Mar 2007)

Log Message:
-----------
<rdar://problem/4369850> launchd should have a per-user bootstrap context ("background session")

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-03-03 23:09:49 UTC (rev 23124)
+++ trunk/launchd/src/launchd_core_logic.c	2007-03-03 23:42:02 UTC (rev 23125)
@@ -272,7 +272,7 @@
 	mode_t mask;
 	unsigned int globargv:1, wait4debugger:1, unload_at_exit:1, stall_before_exec:1, only_once:1,
 		     currently_ignored:1, forced_peers_to_demand_mode:1, setnice:1, hopefully_exits_last:1, removal_pending:1,
-		     wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1;
+		     wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_per_user_bootstrap:1;
 	char label[0];
 };
 
@@ -1649,6 +1649,17 @@
 
 	job_log(j, LOG_DEBUG, "Reaping");
 
+	if (j->weird_per_user_bootstrap) {
+		mach_msg_size_t mxmsgsz = sizeof(union __RequestUnion__job_mig_protocol_vproc_subsystem);
+
+		if (job_mig_protocol_vproc_subsystem.maxsize > mxmsgsz) {
+			mxmsgsz = job_mig_protocol_vproc_subsystem.maxsize;
+		}
+
+		job_assumes(j, runtime_add_mport(j->mgr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS);
+		j->weird_per_user_bootstrap = false;
+	}
+
 	if (j->log_redirect_fd && (!j->wait4pipe_eof || j->mgr->shutting_down)) {
 		job_assumes(j, close(j->log_redirect_fd) != -1);
 		j->log_redirect_fd = 0;
@@ -1985,7 +1996,7 @@
 
 	time(&j->start_time);
 
-	switch (c = runtime_fork(j->mgr->jm_port)) {
+	switch (c = runtime_fork(j->weird_per_user_bootstrap ? j->j_port : j->mgr->jm_port)) {
 	case -1:
 		job_log_error(j, LOG_ERR, "fork() failed, will try again in one second");
 		job_assumes(j, close(execspair[0]) == 0);
@@ -3465,10 +3476,6 @@
 		mxmsgsz = job_mig_protocol_vproc_subsystem.maxsize;
 	}
 
-	if (!jobmgr_assumes(jmr, runtime_add_mport(jmr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) {
-		goto out_bad;
-	}
-
 	jobmgr_assumes(jmr, (jmr->anonj = jobmgr_get_anonymous(jmr)) != NULL);
 
 	bootstrapper = job_new(jmr, "com.apple.launchctld", NULL, bootstrap_tool);
@@ -3477,6 +3484,16 @@
 		jobmgr_assumes(jmr, kevent_mod(SIGTERM, EVFILT_SIGNAL, EV_ADD, 0, 0, jmr) != -1);
 	}
 
+	if (!jm && getuid() != 0) {
+		/* per-user bootstrap context is messy */
+		bootstrapper->weird_per_user_bootstrap = true;
+		jobmgr_assumes(jmr, job_setup_machport(bootstrapper));
+	} else {
+		if (!jobmgr_assumes(jmr, runtime_add_mport(jmr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) {
+			goto out_bad;
+		}
+	}
+
 	jobmgr_log(jmr, LOG_DEBUG, "Created job manager%s%s", jm ? " with parent: " : ".", jm ? jm->name : "");
 
 	if (!jm && jobmgr_assumes(jmr, bootstrapper != NULL)) {

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070303/83c0dc73/attachment.html


More information about the launchd-changes mailing list