<!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><rdar://problem/4465956> 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 > 0)
</del><ins>+                        if (i > 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[] = { "load", "-D", "all", "/etc/mach_init.d", NULL, NULL };
</del><ins>+        char *load_launchd_items[] = { "load", "-D", "all", "/etc/mach_init.d", NULL };
</ins><span class="cx">
</span><span class="cx">         if (is_safeboot()) {
</span><span class="cx">                 load_launchd_items[2] = "system";
</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, "sS:")) != -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, "usage: %s bootstrap [-s] -S <session-type>\n", getprogname());
+                return 1;
+        }
+
+        if (strcasecmp(session_type, "System") == 0) {
+                system_specific_bootstrap(sflag);
</ins><span class="cx">         } else {
</span><del>-                char *load_launchd_items[] = { "load", "-D", "all", "-S", "Background", NULL };
</del><ins>+                char *load_launchd_items[] = { "load", "-S", session_type, "-D", "all", 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] = "system";
</del><ins>+                        load_launchd_items[4] = "system";
</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, "Background") == 0 || strcasecmp(session_type, "LoginWindow") == 0) {
+                        load_launchd_items[4] = "system";
+                        if (!is_safeboot()) {
+                                load_launchd_items[5] = "-D";
+                                load_launchd_items[6] = "local";
+                                the_argc += 2;
+                        }
+                        if (strcasecmp(session_type, "LoginWindow") == 0) {
+                                load_launchd_items[the_argc] = "/etc/mach_init_per_login_session.d";
+                                the_argc += 1;
+                        }
+                } else if (strcasecmp(session_type, "Aqua") == 0) {
+                        load_launchd_items[5] = "/etc/mach_init_per_user.d";
+                        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(&lus, 0, sizeof(lus));
</span><span class="cx">
</span><del>-        if (!strcmp(argv[0], "load"))
</del><ins>+        if (strcmp(argv[0], "load") == 0) {
</ins><span class="cx">                 lus.load = true;
</span><ins>+        }
</ins><span class="cx">
</span><span class="cx">         while ((ch = getopt(argc, argv, "wFS:D:")) != -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, "all") == 0) {
-                                 es |= NSAllDomainsMask;
-                         } else if (strcasecmp(optarg, "user") == 0) {
-                                 es |= NSUserDomainMask;
-                         } else if (strcasecmp(optarg, "local") == 0) {
-                                 es |= NSLocalDomainMask;
-                         } else if (strcasecmp(optarg, "network") == 0) {
-                                 es |= NSNetworkDomainMask;
-                         } else if (strcasecmp(optarg, "system") == 0) {
-                                 es |= NSSystemDomainMask;
-                         } else {
</del><ins>+                        if (strcasecmp(optarg, "all") == 0) {
+                                es |= NSAllDomainsMask;
+                        } else if (strcasecmp(optarg, "user") == 0) {
+                                es |= NSUserDomainMask;
+                        } else if (strcasecmp(optarg, "local") == 0) {
+                                es |= NSLocalDomainMask;
+                        } else if (strcasecmp(optarg, "network") == 0) {
+                                es |= NSNetworkDomainMask;
+                        } else if (strcasecmp(optarg, "system") == 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 &= ~NSUserDomainMask;
</span><ins>+        }
</ins><span class="cx">
</span><del>-        if (argc == 0 && es == 0)
</del><ins>+        if (argc == 0 && 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, "usage: %s load [-wF] [-D <user|local|network|system|all>] paths...\n", 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 < (size_t)argc; i++)
</del><ins>+        for (i = 0; i < (size_t)argc; i++) {
</ins><span class="cx">                 readpath(argv[i], &lus);
</span><ins>+        }
</ins><span class="cx">
</span><span class="cx">         if (launch_data_array_get_count(lus.pass0) == 0 &&
</span><span class="cx">                         launch_data_array_get_count(lus.pass1) == 0 &&
</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, "Reaping");
</span><span class="cx">
</span><del>-        if (j->weird_per_user_bootstrap) {
</del><ins>+        if (j->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 > 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->mgr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS);
</span><del>-                j->weird_per_user_bootstrap = false;
</del><ins>+                j->weird_bootstrap = false;
</ins><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         if (j->log_redirect_fd && (!j->wait4pipe_eof || j->mgr->shutting_down)) {
</span><span class="lines">@@ -1996,7 +1996,7 @@
</span><span class="cx">
</span><span class="cx">         time(&j->start_time);
</span><span class="cx">
</span><del>-        switch (c = runtime_fork(j->weird_per_user_bootstrap ? j->j_port : j->mgr->jm_port)) {
</del><ins>+        switch (c = runtime_fork(j->weird_bootstrap ? j->j_port : j->mgr->jm_port)) {
</ins><span class="cx">         case -1:
</span><span class="cx">                 job_log_error(j, LOG_ERR, "fork() failed, will try again in one second");
</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[] = { "/bin/launchctl", "bootstrap", NULL, NULL };
</del><ins>+        const char *bootstrap_tool[] = { "/bin/launchctl", "bootstrap", "-S", 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] = "-s";
</del><ins>+                bootstrap_tool[4] = "-s";
</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(&jmr->jobs);
</span><span class="cx">         jmr->kqjobmgr_callback = jobmgr_callback;
</span><del>-        strcpy(jmr->name, "In-utero");
</del><ins>+        strcpy(jmr->name, name ? name : "Under construction");
</ins><span class="cx">
</span><span class="cx">         jmr->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->name, "%u", MACH_PORT_INDEX(jmr->jm_port));
</del><ins>+        if (!name) {
+                sprintf(jmr->name, "%u", MACH_PORT_INDEX(jmr->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->anonj = jobmgr_get_anonymous(jmr)) != NULL);
</span><span class="cx">
</span><del>-        bootstrapper = job_new(jmr, "com.apple.launchctld", 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 && getuid() != 0) {
-                /* per-user bootstrap context is messy */
-                bootstrapper->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 "bootstrapper" makes no sense */
+                bootstrapper = job_new(jmr, "com.apple.launchctld", NULL, bootstrap_tool);
+                if (jm || getuid()) {
+                        bootstrapper->weird_bootstrap = true;
+                        jobmgr_assumes(jmr, job_setup_machport(bootstrapper));
+                }
+        }
+
+        if (!bootstrapper || !bootstrapper->weird_bootstrap) {
</ins><span class="cx">                 if (!jobmgr_assumes(jmr, runtime_add_mport(jmr->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, "Created job manager%s%s", jm ? " with parent: " : ".", jm ? jm->name : "");
</span><span class="cx">
</span><del>-        if (!jm && 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[] = { "/bin/launchctl", "bootstrap", "-S", session_type, NULL };
+                job_t bootstrapper;
+
</ins><span class="cx">                 j = job_mig_intran2(root_jobmgr, target_subset);
</span><ins>+                strcpy(j->mgr->name, session_type);
</ins><span class="cx">                 job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS);
</span><del>-                strcpy(j->mgr->name, "Aqua");
</del><ins>+
+                bootstrapper = job_new(j->mgr, "com.apple.launchctld", 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->mgr, reqport, rcvright, false)) == NULL) {
</del><ins>+        if ((jmr = jobmgr_new(j->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->name, "Aqua");
-
</del><span class="cx">         for (l2l_i = 0; l2l_i < 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->mgr, requestorport, MACH_PORT_NULL, false)) == NULL) {
</del><ins>+        if ((jmr = jobmgr_new(j->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 ? "System" : "Background")) != 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("/");
-
-        seteuid(0);
-        setegid(0);
-        setgid(g);
-        initgroups(login, g);
-        setuid(u);
-
-        dtsz = getdtablesize();
-
-        for (i = STDERR_FILENO + 1; i < 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[] = { "/bin/launchctl", "load", "-S", "LoginWindow",
-                "-D", "system", "-D", "local", "/etc/mach_init_per_login_session.d", NULL };
-        int wstatus;
-        pid_t p;
-
-        if (flags & LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) {
-                largv[5] = "system";
-        }
-
-        if (__vproc_tag_loginwindow_context()) {
-                return;
-        }
-
-        if ((p = fexecv_as_user("root", 0, 0, largv)) == -1) {
-                return;
-        }
-
-        if (waitpid(p, &wstatus, 0) != p) {
-                return;
-        }
</del><ins>+        _vproc_move_subset_to_user("LoginWindow");
</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[] = { "/bin/launchctl", "load", "-S", "Aqua", "-D", "all", "/etc/mach_init_per_user.d", 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("Aqua")) {
</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->pw_uid;
-        g = pwe->pw_gid;
-
-        if (flags & LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) {
-                largv[5] = "system";
-        }
-
-        if ((p = fexecv_as_user(login, u, g, largv)) == -1) {
-                return -1;
-        }
-
-        if (waitpid(p, &wstatus, 0) != p) {
-                return -1;
-        }
-
-        if (!(WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0)) {
-                return -1;
-        }
-
</del><span class="cx"> #define BEZEL_UI_PATH "/System/Library/LoginPlugins/BezelServices.loginPlugin/Contents/Resources/BezelUI/BezelUIServer"
</span><span class="cx"> #define BEZEL_UI_PLIST "/System/Library/LaunchAgents/com.apple.BezelUIServer.plist"
</span><span class="cx"> #define BEZEL_UI_SERVICE "BezelUI"
</span><span class="cx">
</span><span class="cx">         if (!(stat(BEZEL_UI_PLIST, &sb) == 0 && S_ISREG(sb.st_mode))) {
</span><del>-                if (bootstrap_create_server(bootstrap_port, BEZEL_UI_PATH, u, true, &bezel_ui_server) == BOOTSTRAP_SUCCESS) {
</del><ins>+                if (bootstrap_create_server(bootstrap_port, BEZEL_UI_PATH, 0, true, &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, &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>