Diff
Modified: trunk/launchd/src/bootstrap.defs (22876 => 22877)
--- trunk/launchd/src/bootstrap.defs 2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/bootstrap.defs 2006-09-24 06:20:35 UTC (rev 22877)
@@ -98,6 +98,7 @@
out __bs_reqport : mach_port_t;
out __bs_rcvright : mach_port_move_receive_t;
out __service_names : name_array_t, dealloc;
+ out __service_pids : pointer_t, dealloc;
out __service_ports : mach_port_array_t, dealloc);
routine bootstrap_getsocket(
Modified: trunk/launchd/src/bootstrap_private.h (22876 => 22877)
--- trunk/launchd/src/bootstrap_private.h 2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/bootstrap_private.h 2006-09-24 06:20:35 UTC (rev 22877)
@@ -30,6 +30,7 @@
kern_return_t
_launchd_to_launchd(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
+ vm_offset_t *service_pids, mach_msg_type_number_t *service_pidsCnt,
mach_port_array_t *ports, mach_msg_type_number_t *portCnt);
kern_return_t bootstrap_getsocket(mach_port_t bp, name_t);
Modified: trunk/launchd/src/bootstrap_public.c (22876 => 22877)
--- trunk/launchd/src/bootstrap_public.c 2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/bootstrap_public.c 2006-09-24 06:20:35 UTC (rev 22877)
@@ -41,9 +41,10 @@
kern_return_t
_launchd_to_launchd(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
+ vm_offset_t *service_pids, mach_msg_type_number_t *service_pidsCnt,
mach_port_array_t *ports, mach_msg_type_number_t *portCnt)
{
- return raw_bootstrap_transfer_subset(bp, reqport, rcvright, service_names, service_namesCnt, ports, portCnt);
+ return raw_bootstrap_transfer_subset(bp, reqport, rcvright, service_names, service_namesCnt, service_pids, service_pidsCnt, ports, portCnt);
}
pid_t
Modified: trunk/launchd/src/launchd.c (22876 => 22877)
--- trunk/launchd/src/launchd.c 2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/launchd.c 2006-09-24 06:20:35 UTC (rev 22877)
@@ -117,7 +117,8 @@
SIGWINCH, SIGINFO, SIGUSR1, SIGUSR2
};
bool sflag = false, dflag = false, Dflag = false;
- mach_msg_type_number_t l2l_name_cnt = 0, l2l_port_cnt = 0;
+ mach_msg_type_number_t l2l_name_cnt = 0, l2l_port_cnt = 0, l2l_pid_cnt = 0;
+ pid_t *l2l_pids = NULL;
name_array_t l2l_names = NULL;
mach_port_array_t l2l_ports = NULL;
char ldconf[PATH_MAX] = PID1LAUNCHD_CONF;
@@ -246,19 +247,31 @@
launchd_assert(bootstrap_parent(bootstrap_port, &newparent) == BOOTSTRAP_SUCCESS);
launchd_assert(_launchd_to_launchd(bootstrap_port, &req_mport, &checkin_mport,
- &l2l_names, &l2l_name_cnt, &l2l_ports, &l2l_port_cnt) == BOOTSTRAP_SUCCESS);
+ &l2l_names, &l2l_name_cnt, (vm_offset_t *)&l2l_pids, &l2l_pid_cnt,
+ &l2l_ports, &l2l_port_cnt) == BOOTSTRAP_SUCCESS);
- launchd_assert(l2l_name_cnt == l2l_port_cnt);
+ launchd_assert(l2l_name_cnt == l2l_port_cnt && l2l_name_cnt == (l2l_pid_cnt / sizeof(pid_t)));
task_set_bootstrap_port(mach_task_self(), newparent);
launchd_assumes(mach_port_deallocate(mach_task_self(), bootstrap_port) == KERN_SUCCESS);
bootstrap_port = newparent;
}
- mach_init_init(req_mport, checkin_mport, l2l_names, l2l_ports, l2l_name_cnt);
+ mach_init_init(req_mport, checkin_mport, l2l_names, l2l_ports, l2l_pids, l2l_name_cnt);
- if (h)
+ if (l2l_names) {
+ mig_deallocate((vm_address_t)l2l_names, l2l_name_cnt * sizeof(l2l_names[0]));
+ }
+ if (l2l_ports) {
+ mig_deallocate((vm_address_t)l2l_ports, l2l_port_cnt * sizeof(l2l_ports[0]));
+ }
+ if (l2l_pids) {
+ mig_deallocate((vm_address_t)l2l_pids, l2l_pid_cnt);
+ }
+
+ if (h) {
sprintf(ldconf, "%s/%s", h, LAUNCHD_CONF);
+ }
rlcj = job_new(root_job, READCONF_LABEL, LAUNCHCTL_PATH, NULL, ldconf, MACH_PORT_NULL);
launchd_assert(rlcj != NULL);
Modified: trunk/launchd/src/launchd.h (22876 => 22877)
--- trunk/launchd/src/launchd.h 2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/launchd.h 2006-09-24 06:20:35 UTC (rev 22877)
@@ -59,7 +59,7 @@
void catatonia(void);
void mach_start_shutdown(void);
-void mach_init_init(mach_port_t, mach_port_t, name_array_t, mach_port_array_t, mach_msg_type_number_t);
+void mach_init_init(mach_port_t, mach_port_t, name_array_t, mach_port_array_t, pid_t *, mach_msg_type_number_t);
int _fd(int fd);
Modified: trunk/launchd/src/launchd_mach_ipc.c (22876 => 22877)
--- trunk/launchd/src/launchd_mach_ipc.c 2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/launchd_mach_ipc.c 2006-09-24 06:20:35 UTC (rev 22877)
@@ -83,11 +83,11 @@
void
mach_init_init(mach_port_t req_port, mach_port_t checkin_port,
- name_array_t l2l_names, mach_port_array_t l2l_ports, mach_msg_type_number_t l2l_cnt)
+ name_array_t l2l_names, mach_port_array_t l2l_ports, pid_t *l2l_pids, mach_msg_type_number_t l2l_cnt)
{
mach_msg_type_number_t l2l_i;
auditinfo_t inherited_audit;
- job_t root_anon_job;
+ job_t anon_job;
getaudit(&inherited_audit);
inherited_asid = inherited_audit.ai_asid;
@@ -109,12 +109,14 @@
return;
}
- launchd_assert(root_anon_job = job_new_anonymous(root_job, 0));
-
for (l2l_i = 0; l2l_i < l2l_cnt; l2l_i++) {
struct machservice *ms;
- if ((ms = machservice_new(root_anon_job, l2l_names[l2l_i], l2l_ports + l2l_i))) {
+ if (!(anon_job = job_find_by_pid(root_job, l2l_pids[l2l_i], false))) {
+ launchd_assert(anon_job = job_new_anonymous(root_job, l2l_pids[l2l_i]));
+ }
+
+ if ((ms = machservice_new(anon_job, l2l_names[l2l_i], &l2l_ports[l2l_i]))) {
machservice_watch(ms);
}
}
@@ -374,6 +376,7 @@
name_array_t service_names;
bootstrap_status_array_t service_actives;
mach_port_array_t ports;
+ pid_t *pids;
unsigned int i;
};
@@ -390,6 +393,7 @@
info_resp->service_actives[info_resp->i] = machservice_status(ms);
} else {
info_resp->ports[info_resp->i] = machservice_port(ms);
+ info_resp->pids[info_resp->i] = job_get_pid(machservice_job(ms));
}
info_resp->i++;
}
@@ -398,20 +402,19 @@
x_bootstrap_info(mach_port_t bp, name_array_t *servicenamesp, unsigned int *servicenames_cnt,
bootstrap_status_array_t *serviceactivesp, unsigned int *serviceactives_cnt)
{
- struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, 0 };
+ struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, NULL, 0 };
job_t ji, j = job_find_by_port(bp);
- kern_return_t result;
unsigned int cnt = 0;
for (ji = j; ji; ji = job_parent(ji))
job_foreach_service(ji, x_bootstrap_info_countservices, &cnt, false);
- result = vm_allocate(mach_task_self(), (vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0]), true);
- if (!launchd_assumes(result == KERN_SUCCESS))
+ mig_allocate((vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+ if (!launchd_assumes(info_resp.service_names != NULL))
goto out_bad;
- result = vm_allocate(mach_task_self(), (vm_address_t *)&info_resp.service_actives, cnt * sizeof(info_resp.service_actives[0]), true);
- if (!launchd_assumes(result == KERN_SUCCESS))
+ mig_allocate((vm_address_t *)&info_resp.service_actives, cnt * sizeof(info_resp.service_actives[0]));
+ if (!launchd_assumes(info_resp.service_actives != NULL))
goto out_bad;
for (ji = j; ji; ji = job_parent(ji))
@@ -426,21 +429,25 @@
return BOOTSTRAP_SUCCESS;
out_bad:
- if (info_resp.service_names)
- vm_deallocate(mach_task_self(), (vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+ if (info_resp.service_names) {
+ mig_deallocate((vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+ }
+ if (info_resp.service_actives) {
+ mig_deallocate((vm_address_t)info_resp.service_actives, cnt * sizeof(info_resp.service_actives[0]));
+ }
return BOOTSTRAP_NO_MEMORY;
}
kern_return_t
x_bootstrap_transfer_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
- name_array_t *servicenamesp, unsigned int *servicenames_cnt,
- mach_port_array_t *ports, unsigned int *ports_cnt)
+ name_array_t *servicenamesp, unsigned int *servicenames_cnt,
+ vm_offset_t *service_pids, mach_msg_type_number_t *service_pidsCnt,
+ mach_port_array_t *ports, unsigned int *ports_cnt)
{
- struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, 0 };
+ struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, NULL, 0 };
job_t j = job_find_by_port(bp);
unsigned int cnt = 0;
- kern_return_t result;
if (getpid() != 1) {
job_log(j, LOG_ERR, "Only the system launchd will transfer Mach sub-bootstraps.");
@@ -454,14 +461,18 @@
job_foreach_service(j, x_bootstrap_info_countservices, &cnt, true);
- result = vm_allocate(mach_task_self(), (vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0]), true);
- if (!launchd_assumes(result == KERN_SUCCESS))
+ mig_allocate((vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+ if (!launchd_assumes(info_resp.service_names != NULL))
goto out_bad;
- result = vm_allocate(mach_task_self(), (vm_address_t *)&info_resp.ports, cnt * sizeof(info_resp.ports[0]), true);
- if (!launchd_assumes(result == KERN_SUCCESS))
+ mig_allocate((vm_address_t *)&info_resp.ports, cnt * sizeof(info_resp.ports[0]));
+ if (!launchd_assumes(info_resp.ports != NULL))
goto out_bad;
+ mig_allocate((vm_address_t *)&info_resp.pids, cnt * sizeof(pid_t));
+ if (!launchd_assumes(info_resp.pids != NULL))
+ goto out_bad;
+
job_foreach_service(j, x_bootstrap_info_copyservices, &info_resp, true);
launchd_assumes(info_resp.i == cnt);
@@ -469,6 +480,8 @@
*servicenamesp = info_resp.service_names;
*ports = info_resp.ports;
*servicenames_cnt = *ports_cnt = cnt;
+ *service_pids = (vm_offset_t)info_resp.pids;
+ *service_pidsCnt = cnt * sizeof(pid_t);
*reqport = job_get_reqport(j);
*rcvright = job_get_bsport(j);
@@ -480,8 +493,15 @@
return BOOTSTRAP_SUCCESS;
out_bad:
- if (info_resp.service_names)
- vm_deallocate(mach_task_self(), (vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+ if (info_resp.service_names) {
+ mig_deallocate((vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+ }
+ if (info_resp.ports) {
+ mig_deallocate((vm_address_t)info_resp.ports, cnt * sizeof(info_resp.ports[0]));
+ }
+ if (info_resp.pids) {
+ mig_deallocate((vm_address_t)info_resp.pids, cnt * sizeof(pid_t));
+ }
return BOOTSTRAP_NO_MEMORY;
}