Modified: trunk/launchd/src/launchd_core_logic.c (23004 => 23005)
--- trunk/launchd/src/launchd_core_logic.c 2007-01-05 00:11:52 UTC (rev 23004)
+++ trunk/launchd/src/launchd_core_logic.c 2007-01-05 01:14:23 UTC (rev 23005)
@@ -4195,6 +4195,13 @@
kern_return_t kr;
jobmgr_t jmr;
+ if (getuid() == 0) {
+ j = job_mig_intran2(root_jobmgr, target_subset);
+ job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS);
+ strcpy(j->mgr->name, "Aqua");
+ return 0;
+ }
+
kr = _vproc_grab_subset(target_subset, &reqport,
&rcvright, &l2l_names, &l2l_name_cnt, &l2l_ports, &l2l_port_cnt);
Modified: trunk/launchd/src/libvproc.c (23004 => 23005)
--- trunk/launchd/src/libvproc.c 2007-01-05 00:11:52 UTC (rev 23004)
+++ trunk/launchd/src/libvproc.c 2007-01-05 01:14:23 UTC (rev 23005)
@@ -29,6 +29,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
+#include <unistd.h>
#include "liblaunch_public.h"
#include "liblaunch_private.h"
@@ -47,10 +48,15 @@
_vproc_move_subset_to_user(void)
{
kern_return_t kr = 1;
- mach_port_t puc;
+ mach_port_t puc = 0, which_port = bootstrap_port;
- if (vproc_mig_lookup_per_user_context(bootstrap_port, 0, &puc) == 0) {
- kr = vproc_mig_move_subset_to_user(puc, bootstrap_port);
+ if ((getuid() || geteuid()) && vproc_mig_lookup_per_user_context(bootstrap_port, 0, &puc) == 0) {
+ which_port = puc;
+ }
+
+ kr = vproc_mig_move_subset_to_user(which_port, bootstrap_port);
+
+ if (puc) {
mach_port_deallocate(mach_task_self(), puc);
}