<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[23130] trunk/launchd/src</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.macosforge.org/projects/launchd/changeset/23130">23130</a></dd>
<dt>Author</dt> <dd>zarzycki@apple.com</dd>
<dt>Date</dt> <dd>2007-03-04 15:38:21 -0800 (Sun, 04 Mar 2007)</dd>
</dl>

<h3>Log Message</h3>
<pre>&lt;rdar://problem/4465956&gt; launchd should be able to bootstrap itself</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunklaunchdsrclaunchctlc">trunk/launchd/src/launchctl.c</a></li>
<li><a href="#trunklaunchdsrclaunchd_core_logicc">trunk/launchd/src/launchd_core_logic.c</a></li>
<li><a href="#trunklaunchdsrcliblaunchc">trunk/launchd/src/liblaunch.c</a></li>
<li><a href="#trunklaunchdsrclibvprocc">trunk/launchd/src/libvproc.c</a></li>
<li><a href="#trunklaunchdsrclibvproc_internalh">trunk/launchd/src/libvproc_internal.h</a></li>
<li><a href="#trunklaunchdsrcprotocol_jobdefs">trunk/launchd/src/protocol_job.defs</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunklaunchdsrclaunchctlc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchctl.c (23129 => 23130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/launchctl.c        2007-03-04 17:34:05 UTC (rev 23129)
+++ trunk/launchd/src/launchctl.c        2007-03-04 23:38:21 UTC (rev 23130)
</span><span class="lines">@@ -250,8 +250,9 @@
</span><span class="cx">                                 }
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        if (i &gt; 0)
</del><ins>+                        if (i &gt; 0) {
</ins><span class="cx">                                 demux_cmd(i, argv2);
</span><ins>+                        }
</ins><span class="cx"> 
</span><span class="cx">                         free(l);
</span><span class="cx">                 }
</span><span class="lines">@@ -1243,7 +1244,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void
</span><del>-very_pid2_specific_bootstrap(bool sflag)
</del><ins>+system_specific_bootstrap(bool sflag)
</ins><span class="cx"> {
</span><span class="cx">         int hnmib[] = { CTL_KERN, KERN_HOSTNAME };
</span><span class="cx">         struct group *tfp_gr;
</span><span class="lines">@@ -1340,7 +1341,7 @@
</span><span class="cx"> 
</span><span class="cx">         _vproc_set_global_on_demand(true);
</span><span class="cx"> 
</span><del>-        char *load_launchd_items[] = { &quot;load&quot;, &quot;-D&quot;, &quot;all&quot;, &quot;/etc/mach_init.d&quot;, NULL, NULL };
</del><ins>+        char *load_launchd_items[] = { &quot;load&quot;, &quot;-D&quot;, &quot;all&quot;, &quot;/etc/mach_init.d&quot;, NULL };
</ins><span class="cx"> 
</span><span class="cx">         if (is_safeboot()) {
</span><span class="cx">                 load_launchd_items[2] = &quot;system&quot;;
</span><span class="lines">@@ -1387,18 +1388,61 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int
</span><del>-bootstrap_cmd(int argc, char *const argv[] __attribute__((unused)))
</del><ins>+bootstrap_cmd(int argc, char *const argv[])
</ins><span class="cx"> {
</span><del>-        if (getuid() == 0) {
-                very_pid2_specific_bootstrap(argc == 2);
</del><ins>+        char *session_type = NULL;
+        bool sflag = false;
+        int ch;
+
+        while ((ch = getopt(argc, argv, &quot;sS:&quot;)) != -1) {
+                switch (ch) {
+                case 's':
+                        sflag = true;
+                        break;
+                case 'S':
+                        session_type = optarg;
+                        break;
+                case '?':
+                default:
+                        break;
+                }
+        }
+
+        optind = 1;
+        optreset = 1;
+
+        if (!session_type) {
+                fprintf(stderr, &quot;usage: %s bootstrap [-s] -S &lt;session-type&gt;\n&quot;, getprogname());
+                return 1;
+        }
+
+        if (strcasecmp(session_type, &quot;System&quot;) == 0) {
+                system_specific_bootstrap(sflag);
</ins><span class="cx">         } else {
</span><del>-                char *load_launchd_items[] = { &quot;load&quot;, &quot;-D&quot;, &quot;all&quot;, &quot;-S&quot;, &quot;Background&quot;, NULL };
</del><ins>+                char *load_launchd_items[] = { &quot;load&quot;, &quot;-S&quot;, session_type, &quot;-D&quot;, &quot;all&quot;, NULL, NULL, NULL, NULL };
+                int the_argc = 5;
</ins><span class="cx"> 
</span><span class="cx">                 if (is_safeboot()) {
</span><del>-                        load_launchd_items[2] = &quot;system&quot;;
</del><ins>+                        load_launchd_items[4] = &quot;system&quot;;
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                assumes(load_and_unload_cmd(5, load_launchd_items) == 0);
</del><ins>+                if (strcasecmp(session_type, &quot;Background&quot;) == 0 || strcasecmp(session_type, &quot;LoginWindow&quot;) == 0) {
+                        load_launchd_items[4] = &quot;system&quot;;
+                        if (!is_safeboot()) {
+                                load_launchd_items[5] = &quot;-D&quot;;
+                                load_launchd_items[6] = &quot;local&quot;;
+                                the_argc += 2;
+                        }
+                        if (strcasecmp(session_type, &quot;LoginWindow&quot;) == 0) {
+                                load_launchd_items[the_argc] = &quot;/etc/mach_init_per_login_session.d&quot;;
+                                the_argc += 1;
+                        }
+                } else if (strcasecmp(session_type, &quot;Aqua&quot;) == 0) {
+                        load_launchd_items[5] = &quot;/etc/mach_init_per_user.d&quot;;
+                        the_argc += 1;
+                }
+
+                assumes(load_and_unload_cmd(the_argc, load_launchd_items) == 0);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         return 0;
</span><span class="lines">@@ -1416,8 +1460,9 @@
</span><span class="cx"> 
</span><span class="cx">         memset(&amp;lus, 0, sizeof(lus));
</span><span class="cx"> 
</span><del>-        if (!strcmp(argv[0], &quot;load&quot;))
</del><ins>+        if (strcmp(argv[0], &quot;load&quot;) == 0) {
</ins><span class="cx">                 lus.load = true;
</span><ins>+        }
</ins><span class="cx"> 
</span><span class="cx">         while ((ch = getopt(argc, argv, &quot;wFS:D:&quot;)) != -1) {
</span><span class="cx">                 switch (ch) {
</span><span class="lines">@@ -1431,20 +1476,20 @@
</span><span class="cx">                         lus.session_type = optarg;
</span><span class="cx">                         break;
</span><span class="cx">                 case 'D':
</span><del>-                          if (strcasecmp(optarg, &quot;all&quot;) == 0) {
-                                  es |= NSAllDomainsMask;
-                          } else if (strcasecmp(optarg, &quot;user&quot;) == 0) {
-                                  es |= NSUserDomainMask;
-                          } else if (strcasecmp(optarg, &quot;local&quot;) == 0) {
-                                  es |= NSLocalDomainMask;
-                          } else if (strcasecmp(optarg, &quot;network&quot;) == 0) {
-                                  es |= NSNetworkDomainMask;
-                          } else if (strcasecmp(optarg, &quot;system&quot;) == 0) {
-                                  es |= NSSystemDomainMask;
-                          } else {
</del><ins>+                        if (strcasecmp(optarg, &quot;all&quot;) == 0) {
+                                es |= NSAllDomainsMask;
+                        } else if (strcasecmp(optarg, &quot;user&quot;) == 0) {
+                                es |= NSUserDomainMask;
+                        } else if (strcasecmp(optarg, &quot;local&quot;) == 0) {
+                                es |= NSLocalDomainMask;
+                        } else if (strcasecmp(optarg, &quot;network&quot;) == 0) {
+                                es |= NSNetworkDomainMask;
+                        } else if (strcasecmp(optarg, &quot;system&quot;) == 0) {
+                                es |= NSSystemDomainMask;
+                        } else {
</ins><span class="cx">                                 badopts = true;
</span><del>-                          }
-                          break;
</del><ins>+                        }
+                        break;
</ins><span class="cx">                 case '?':
</span><span class="cx">                 default:
</span><span class="cx">                         badopts = true;
</span><span class="lines">@@ -1454,11 +1499,13 @@
</span><span class="cx">         argc -= optind;
</span><span class="cx">         argv += optind;
</span><span class="cx"> 
</span><del>-        if (lus.session_type == NULL)
</del><ins>+        if (lus.session_type == NULL) {
</ins><span class="cx">                 es &amp;= ~NSUserDomainMask;
</span><ins>+        }
</ins><span class="cx"> 
</span><del>-        if (argc == 0 &amp;&amp; es == 0)
</del><ins>+        if (argc == 0 &amp;&amp; es == 0) {
</ins><span class="cx">                 badopts = true;
</span><ins>+        }
</ins><span class="cx"> 
</span><span class="cx">         if (badopts) {
</span><span class="cx">                 fprintf(stderr, &quot;usage: %s load [-wF] [-D &lt;user|local|network|system|all&gt;] paths...\n&quot;, getprogname());
</span><span class="lines">@@ -1497,8 +1544,9 @@
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        for (i = 0; i &lt; (size_t)argc; i++)
</del><ins>+        for (i = 0; i &lt; (size_t)argc; i++) {
</ins><span class="cx">                 readpath(argv[i], &amp;lus);
</span><ins>+        }
</ins><span class="cx"> 
</span><span class="cx">         if (launch_data_array_get_count(lus.pass0) == 0 &amp;&amp;
</span><span class="cx">                         launch_data_array_get_count(lus.pass1) == 0 &amp;&amp;
</span></span></pre></div>
<a id="trunklaunchdsrclaunchd_core_logicc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_core_logic.c (23129 => 23130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/launchd_core_logic.c        2007-03-04 17:34:05 UTC (rev 23129)
+++ trunk/launchd/src/launchd_core_logic.c        2007-03-04 23:38:21 UTC (rev 23130)
</span><span class="lines">@@ -211,7 +211,7 @@
</span><span class="cx"> #define jobmgr_assumes(jm, e)      \
</span><span class="cx">                         (__builtin_expect(!(e), 0) ? jobmgr_log_bug(jm, __rcs_file_version__, __FILE__, __LINE__, #e), false : true)
</span><span class="cx"> 
</span><del>-static jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag);
</del><ins>+static jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name);
</ins><span class="cx"> static jobmgr_t jobmgr_parent(jobmgr_t jm);
</span><span class="cx"> static jobmgr_t jobmgr_do_garbage_collection(jobmgr_t jm);
</span><span class="cx"> static bool jobmgr_is_idle(jobmgr_t jm);
</span><span class="lines">@@ -272,7 +272,7 @@
</span><span class="cx">         mode_t mask;
</span><span class="cx">         unsigned int globargv:1, wait4debugger:1, unload_at_exit:1, stall_before_exec:1, only_once:1,
</span><span class="cx">                      currently_ignored:1, forced_peers_to_demand_mode:1, setnice:1, hopefully_exits_last:1, removal_pending:1,
</span><del>-                     wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_per_user_bootstrap:1;
</del><ins>+                     wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_bootstrap:1;
</ins><span class="cx">         char label[0];
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -1649,7 +1649,7 @@
</span><span class="cx"> 
</span><span class="cx">         job_log(j, LOG_DEBUG, &quot;Reaping&quot;);
</span><span class="cx"> 
</span><del>-        if (j-&gt;weird_per_user_bootstrap) {
</del><ins>+        if (j-&gt;weird_bootstrap) {
</ins><span class="cx">                 mach_msg_size_t mxmsgsz = sizeof(union __RequestUnion__job_mig_protocol_vproc_subsystem);
</span><span class="cx"> 
</span><span class="cx">                 if (job_mig_protocol_vproc_subsystem.maxsize &gt; mxmsgsz) {
</span><span class="lines">@@ -1657,7 +1657,7 @@
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 job_assumes(j, runtime_add_mport(j-&gt;mgr-&gt;jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS);
</span><del>-                j-&gt;weird_per_user_bootstrap = false;
</del><ins>+                j-&gt;weird_bootstrap = false;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (j-&gt;log_redirect_fd &amp;&amp; (!j-&gt;wait4pipe_eof || j-&gt;mgr-&gt;shutting_down)) {
</span><span class="lines">@@ -1996,7 +1996,7 @@
</span><span class="cx"> 
</span><span class="cx">         time(&amp;j-&gt;start_time);
</span><span class="cx"> 
</span><del>-        switch (c = runtime_fork(j-&gt;weird_per_user_bootstrap ? j-&gt;j_port : j-&gt;mgr-&gt;jm_port)) {
</del><ins>+        switch (c = runtime_fork(j-&gt;weird_bootstrap ? j-&gt;j_port : j-&gt;mgr-&gt;jm_port)) {
</ins><span class="cx">         case -1:
</span><span class="cx">                 job_log_error(j, LOG_ERR, &quot;fork() failed, will try again in one second&quot;);
</span><span class="cx">                 job_assumes(j, close(execspair[0]) == 0);
</span><span class="lines">@@ -3397,15 +3397,15 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> jobmgr_t 
</span><del>-jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag)
</del><ins>+jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name)
</ins><span class="cx"> {
</span><del>-        const char *bootstrap_tool[] = { &quot;/bin/launchctl&quot;, &quot;bootstrap&quot;, NULL, NULL };
</del><ins>+        const char *bootstrap_tool[] = { &quot;/bin/launchctl&quot;, &quot;bootstrap&quot;, &quot;-S&quot;, name, NULL, NULL };
</ins><span class="cx">         mach_msg_size_t mxmsgsz;
</span><span class="cx">         job_t bootstrapper = NULL;
</span><span class="cx">         jobmgr_t jmr;
</span><span class="cx"> 
</span><span class="cx">         if (sflag) {
</span><del>-                bootstrap_tool[2] = &quot;-s&quot;;
</del><ins>+                bootstrap_tool[4] = &quot;-s&quot;;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         launchd_assert(offsetof(struct jobmgr_s, kqjobmgr_callback) == 0);
</span><span class="lines">@@ -3415,7 +3415,7 @@
</span><span class="cx">                 return NULL;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        jmr = calloc(1, sizeof(struct jobmgr_s) + 30);
</del><ins>+        jmr = calloc(1, sizeof(struct jobmgr_s) + (name ? (strlen(name) + 1) : 128));
</ins><span class="cx">         
</span><span class="cx">         if (jmr == NULL) {
</span><span class="cx">                 return NULL;
</span><span class="lines">@@ -3423,7 +3423,7 @@
</span><span class="cx"> 
</span><span class="cx">         TAILQ_INIT(&amp;jmr-&gt;jobs);
</span><span class="cx">         jmr-&gt;kqjobmgr_callback = jobmgr_callback;
</span><del>-        strcpy(jmr-&gt;name, &quot;In-utero&quot;);
</del><ins>+        strcpy(jmr-&gt;name, name ? name : &quot;Under construction&quot;);
</ins><span class="cx"> 
</span><span class="cx">         jmr-&gt;req_port = requestorport;
</span><span class="cx"> 
</span><span class="lines">@@ -3468,7 +3468,9 @@
</span><span class="cx">                 goto out_bad;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        sprintf(jmr-&gt;name, &quot;%u&quot;, MACH_PORT_INDEX(jmr-&gt;jm_port));
</del><ins>+        if (!name) {
+                sprintf(jmr-&gt;name, &quot;%u&quot;, MACH_PORT_INDEX(jmr-&gt;jm_port));
+        }
</ins><span class="cx"> 
</span><span class="cx">         /* Sigh... at the moment, MIG has maxsize == sizeof(reply union) */
</span><span class="cx">         mxmsgsz = sizeof(union __RequestUnion__job_mig_protocol_vproc_subsystem);
</span><span class="lines">@@ -3478,17 +3480,20 @@
</span><span class="cx"> 
</span><span class="cx">         jobmgr_assumes(jmr, (jmr-&gt;anonj = jobmgr_get_anonymous(jmr)) != NULL);
</span><span class="cx"> 
</span><del>-        bootstrapper = job_new(jmr, &quot;com.apple.launchctld&quot;, NULL, bootstrap_tool);
-
</del><span class="cx">         if (!jm) {
</span><span class="cx">                 jobmgr_assumes(jmr, kevent_mod(SIGTERM, EVFILT_SIGNAL, EV_ADD, 0, 0, jmr) != -1);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!jm &amp;&amp; getuid() != 0) {
-                /* per-user bootstrap context is messy */
-                bootstrapper-&gt;weird_per_user_bootstrap = true;
-                jobmgr_assumes(jmr, job_setup_machport(bootstrapper));
-        } else {
</del><ins>+        if (name) {
+                /* no name implies: bootstrap_subset() where creating a &quot;bootstrapper&quot; makes no sense */
+                bootstrapper = job_new(jmr, &quot;com.apple.launchctld&quot;, NULL, bootstrap_tool);
+                if (jm || getuid()) {
+                        bootstrapper-&gt;weird_bootstrap = true;
+                        jobmgr_assumes(jmr, job_setup_machport(bootstrapper));
+                }
+        }
+
+        if (!bootstrapper || !bootstrapper-&gt;weird_bootstrap) {
</ins><span class="cx">                 if (!jobmgr_assumes(jmr, runtime_add_mport(jmr-&gt;jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) {
</span><span class="cx">                         goto out_bad;
</span><span class="cx">                 }
</span><span class="lines">@@ -3496,7 +3501,7 @@
</span><span class="cx"> 
</span><span class="cx">         jobmgr_log(jmr, LOG_DEBUG, &quot;Created job manager%s%s&quot;, jm ? &quot; with parent: &quot; : &quot;.&quot;, jm ? jm-&gt;name : &quot;&quot;);
</span><span class="cx"> 
</span><del>-        if (!jm &amp;&amp; jobmgr_assumes(jmr, bootstrapper != NULL)) {
</del><ins>+        if (bootstrapper) {
</ins><span class="cx">                 jobmgr_assumes(jmr, job_dispatch(bootstrapper, true) != NULL);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -4586,7 +4591,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> kern_return_t
</span><del>-job_mig_move_subset_to_user(job_t j, mach_port_t target_subset)
</del><ins>+job_mig_move_subset(job_t j, mach_port_t target_subset, name_t session_type)
</ins><span class="cx"> {
</span><span class="cx">         mach_msg_type_number_t l2l_i, l2l_name_cnt = 0, l2l_port_cnt = 0;
</span><span class="cx">         name_array_t l2l_names = NULL;
</span><span class="lines">@@ -4596,9 +4601,17 @@
</span><span class="cx">         jobmgr_t jmr;
</span><span class="cx"> 
</span><span class="cx">         if (getuid() == 0) {
</span><ins>+                const char *bootstrap_tool[] = { &quot;/bin/launchctl&quot;, &quot;bootstrap&quot;, &quot;-S&quot;, session_type, NULL };
+                job_t bootstrapper;
+
</ins><span class="cx">                 j = job_mig_intran2(root_jobmgr, target_subset);
</span><ins>+                strcpy(j-&gt;mgr-&gt;name, session_type);
</ins><span class="cx">                 job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS);
</span><del>-                strcpy(j-&gt;mgr-&gt;name, &quot;Aqua&quot;);
</del><ins>+
+                bootstrapper = job_new(j-&gt;mgr, &quot;com.apple.launchctld&quot;, NULL, bootstrap_tool);
+                if (job_assumes(j, bootstrapper != NULL)) {
+                        job_dispatch(bootstrapper, true);
+                }
</ins><span class="cx">                 return 0;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -4613,13 +4626,11 @@
</span><span class="cx"> 
</span><span class="cx">         launchd_assert(l2l_name_cnt == l2l_port_cnt);
</span><span class="cx"> 
</span><del>-        if ((jmr = jobmgr_new(j-&gt;mgr, reqport, rcvright, false)) == NULL) {
</del><ins>+        if ((jmr = jobmgr_new(j-&gt;mgr, reqport, rcvright, false, session_type)) == NULL) {
</ins><span class="cx">                 kr = BOOTSTRAP_NO_MEMORY;
</span><span class="cx">                 goto out;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        strcpy(jmr-&gt;name, &quot;Aqua&quot;);
-
</del><span class="cx">         for (l2l_i = 0; l2l_i &lt; l2l_name_cnt; l2l_i++) {
</span><span class="cx">                 struct machservice *ms;
</span><span class="cx"> 
</span><span class="lines">@@ -4742,7 +4753,7 @@
</span><span class="cx">                 return BOOTSTRAP_NO_MEMORY;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if ((jmr = jobmgr_new(j-&gt;mgr, requestorport, MACH_PORT_NULL, false)) == NULL) {
</del><ins>+        if ((jmr = jobmgr_new(j-&gt;mgr, requestorport, MACH_PORT_NULL, false, NULL)) == NULL) {
</ins><span class="cx">                 if (requestorport == MACH_PORT_NULL) {
</span><span class="cx">                         return BOOTSTRAP_NOT_PRIVILEGED;
</span><span class="cx">                 }
</span><span class="lines">@@ -4917,5 +4928,5 @@
</span><span class="cx"> void
</span><span class="cx"> jobmgr_init(bool sflag)
</span><span class="cx"> {
</span><del>-        launchd_assert((root_jobmgr = jobmgr_new(NULL, MACH_PORT_NULL, MACH_PORT_NULL, sflag)) != NULL);
</del><ins>+        launchd_assert((root_jobmgr = jobmgr_new(NULL, MACH_PORT_NULL, MACH_PORT_NULL, sflag, getpid() == 1 ? &quot;System&quot; : &quot;Background&quot;)) != NULL);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunklaunchdsrcliblaunchc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/liblaunch.c (23129 => 23130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/liblaunch.c        2007-03-04 17:34:05 UTC (rev 23129)
+++ trunk/launchd/src/liblaunch.c        2007-03-04 23:38:21 UTC (rev 23130)
</span><span class="lines">@@ -1160,101 +1160,28 @@
</span><span class="cx">         return r;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static pid_t
-fexecv_as_user(const char *login, uid_t u, gid_t g, char *const argv[])
-{
-        int i, dtsz;
-        pid_t p;
-
-        if ((p = fork()) != 0)
-                return p;
-
-        chdir(&quot;/&quot;);
-
-        seteuid(0);
-        setegid(0);
-        setgid(g);
-        initgroups(login, g);
-        setuid(u);
-
-        dtsz = getdtablesize();
-
-        for (i = STDERR_FILENO + 1; i &lt; dtsz; i++)
-                close(i);
-
-        execv(argv[0], argv);
-        _exit(EXIT_FAILURE);
-}
-
</del><span class="cx"> void
</span><del>-load_launchd_jobs_at_loginwindow_prompt(int flags, ...)
</del><ins>+load_launchd_jobs_at_loginwindow_prompt(int flags __attribute__((unused)), ...)
</ins><span class="cx"> {
</span><del>-        char *largv[] = { &quot;/bin/launchctl&quot;, &quot;load&quot;, &quot;-S&quot;, &quot;LoginWindow&quot;,
-                &quot;-D&quot;, &quot;system&quot;, &quot;-D&quot;, &quot;local&quot;, &quot;/etc/mach_init_per_login_session.d&quot;, NULL };
-        int wstatus;
-        pid_t p;
-
-        if (flags &amp; LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) {
-                largv[5] = &quot;system&quot;;
-        }
-
-        if (__vproc_tag_loginwindow_context()) {
-                return;
-        }
-
-        if ((p = fexecv_as_user(&quot;root&quot;, 0, 0, largv)) == -1) {
-                return;
-        }
-
-        if (waitpid(p, &amp;wstatus, 0) != p) {
-                return;
-        }
</del><ins>+        _vproc_move_subset_to_user(&quot;LoginWindow&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> pid_t
</span><del>-create_and_switch_to_per_session_launchd(const char *login, int flags, ...)
</del><ins>+create_and_switch_to_per_session_launchd(const char *login __attribute__((unused)), int flags __attribute__((unused)), ...)
</ins><span class="cx"> {
</span><del>-        char *largv[] = { &quot;/bin/launchctl&quot;, &quot;load&quot;, &quot;-S&quot;, &quot;Aqua&quot;, &quot;-D&quot;, &quot;all&quot;, &quot;/etc/mach_init_per_user.d&quot;, NULL };
</del><span class="cx">         mach_port_t bezel_ui_server;
</span><del>-        struct passwd *pwe;
</del><span class="cx">         struct stat sb;
</span><del>-        int wstatus;
-        pid_t p;
-        uid_t u;
-        gid_t g;
</del><span class="cx"> 
</span><del>-        if (_vproc_move_subset_to_user()) {
</del><ins>+        if (_vproc_move_subset_to_user(&quot;Aqua&quot;)) {
</ins><span class="cx">                 return -1;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if ((pwe = getpwnam(login)) == NULL)
-                return -1;
-
-        u = pwe-&gt;pw_uid;
-        g = pwe-&gt;pw_gid;
-
-        if (flags &amp; LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) {
-                largv[5] = &quot;system&quot;;
-        }
-
-        if ((p = fexecv_as_user(login, u, g, largv)) == -1) {
-                return -1;
-        }
-
-        if (waitpid(p, &amp;wstatus, 0) != p) {
-                return -1;
-        }
-
-        if (!(WIFEXITED(wstatus) &amp;&amp; WEXITSTATUS(wstatus) == 0)) {
-                return -1;
-        }
-
</del><span class="cx"> #define BEZEL_UI_PATH &quot;/System/Library/LoginPlugins/BezelServices.loginPlugin/Contents/Resources/BezelUI/BezelUIServer&quot;
</span><span class="cx"> #define BEZEL_UI_PLIST &quot;/System/Library/LaunchAgents/com.apple.BezelUIServer.plist&quot;
</span><span class="cx"> #define BEZEL_UI_SERVICE &quot;BezelUI&quot;
</span><span class="cx"> 
</span><span class="cx">         if (!(stat(BEZEL_UI_PLIST, &amp;sb) == 0 &amp;&amp; S_ISREG(sb.st_mode))) {
</span><del>-                if (bootstrap_create_server(bootstrap_port, BEZEL_UI_PATH, u, true, &amp;bezel_ui_server) == BOOTSTRAP_SUCCESS) {
</del><ins>+                if (bootstrap_create_server(bootstrap_port, BEZEL_UI_PATH, 0, true, &amp;bezel_ui_server) == BOOTSTRAP_SUCCESS) {
</ins><span class="cx">                         mach_port_t srv;
</span><span class="cx"> 
</span><span class="cx">                         if (bootstrap_create_service(bezel_ui_server, BEZEL_UI_SERVICE, &amp;srv) == BOOTSTRAP_SUCCESS) {
</span></span></pre></div>
<a id="trunklaunchdsrclibvprocc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/libvproc.c (23129 => 23130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/libvproc.c        2007-03-04 17:34:05 UTC (rev 23129)
+++ trunk/launchd/src/libvproc.c        2007-03-04 23:38:21 UTC (rev 23130)
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> vproc_err_t
</span><del>-_vproc_move_subset_to_user(void)
</del><ins>+_vproc_move_subset_to_user(char *session_type)
</ins><span class="cx"> {
</span><span class="cx">         kern_return_t kr = 1;
</span><span class="cx">         mach_port_t puc = 0, which_port = bootstrap_port;
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">                 which_port = puc;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        kr = vproc_mig_move_subset_to_user(which_port, bootstrap_port);
</del><ins>+        kr = vproc_mig_move_subset(which_port, bootstrap_port, session_type);
</ins><span class="cx"> 
</span><span class="cx">         if (puc) {
</span><span class="cx">                 mach_port_deallocate(mach_task_self(), puc);
</span></span></pre></div>
<a id="trunklaunchdsrclibvproc_internalh"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/libvproc_internal.h (23129 => 23130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/libvproc_internal.h        2007-03-04 17:34:05 UTC (rev 23129)
+++ trunk/launchd/src/libvproc_internal.h        2007-03-04 23:38:21 UTC (rev 23130)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx"> 
</span><span class="cx"> kern_return_t _vprocmgr_getsocket(name_t);
</span><span class="cx"> 
</span><del>-vproc_err_t _vproc_move_subset_to_user(void);
</del><ins>+vproc_err_t _vproc_move_subset_to_user(char *session_type);
</ins><span class="cx"> 
</span><span class="cx"> void _vproc_logv(int pri, int err, const char *msg, va_list ap);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunklaunchdsrcprotocol_jobdefs"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/protocol_job.defs (23129 => 23130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/protocol_job.defs        2007-03-04 17:34:05 UTC (rev 23129)
+++ trunk/launchd/src/protocol_job.defs        2007-03-04 23:38:21 UTC (rev 23130)
</span><span class="lines">@@ -142,6 +142,7 @@
</span><span class="cx">                 __wu                : uid_t;
</span><span class="cx">         out        __u_cont        : mach_port_t);
</span><span class="cx"> 
</span><del>-routine move_subset_to_user(
</del><ins>+routine move_subset(
</ins><span class="cx">                 __bs_port        : job_t;
</span><del>-                __target_port        : mach_port_t);
</del><ins>+                __target_port        : mach_port_t;
+                __sessiontype        : name_t);
</ins></span></pre>
</div>
</div>

</body>
</html>