[launchd-changes] [22892] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Thu Oct 12 18:21:54 PDT 2006
Revision: 22892
http://trac.macosforge.org/projects/launchd/changeset/22892
Author: zarzycki at apple.com
Date: 2006-10-12 18:21:54 -0700 (Thu, 12 Oct 2006)
Log Message:
-----------
Merge all anonymous jobs into one to keep our sanity...
Modified Paths:
--------------
trunk/launchd/src/bootstrap_private.h
trunk/launchd/src/bootstrap_public.c
trunk/launchd/src/launchd.c
trunk/launchd/src/launchd.h
trunk/launchd/src/launchd_core_logic.c
trunk/launchd/src/protocol_legacy.defs
Modified: trunk/launchd/src/bootstrap_private.h
===================================================================
--- trunk/launchd/src/bootstrap_private.h 2006-10-13 00:54:01 UTC (rev 22891)
+++ trunk/launchd/src/bootstrap_private.h 2006-10-13 01:21:54 UTC (rev 22892)
@@ -37,7 +37,6 @@
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
===================================================================
--- trunk/launchd/src/bootstrap_public.c 2006-10-13 00:54:01 UTC (rev 22891)
+++ trunk/launchd/src/bootstrap_public.c 2006-10-13 01:21:54 UTC (rev 22892)
@@ -41,10 +41,9 @@
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 vproc_mig_transfer_subset(bp, reqport, rcvright, service_names, service_namesCnt, service_pids, service_pidsCnt, ports, portCnt);
+ return vproc_mig_transfer_subset(bp, reqport, rcvright, service_names, service_namesCnt, ports, portCnt);
}
pid_t
Modified: trunk/launchd/src/launchd.c
===================================================================
--- trunk/launchd/src/launchd.c 2006-10-13 00:54:01 UTC (rev 22891)
+++ trunk/launchd/src/launchd.c 2006-10-13 01:21:54 UTC (rev 22892)
@@ -119,8 +119,7 @@
};
struct sigaction fsa;
bool sflag = false, dflag = false, Dflag = false;
- mach_msg_type_number_t l2l_name_cnt = 0, l2l_port_cnt = 0, l2l_pid_cnt = 0;
- pid_t *l2l_pids = NULL;
+ mach_msg_type_number_t l2l_name_cnt = 0, l2l_port_cnt = 0;
name_array_t l2l_names = NULL;
mach_port_array_t l2l_ports = NULL;
char ldconf[PATH_MAX] = PID1LAUNCHD_CONF;
@@ -251,17 +250,16 @@
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, (vm_offset_t *)&l2l_pids, &l2l_pid_cnt,
- &l2l_ports, &l2l_port_cnt) == BOOTSTRAP_SUCCESS);
+ &l2l_names, &l2l_name_cnt, &l2l_ports, &l2l_port_cnt) == BOOTSTRAP_SUCCESS);
- launchd_assert(l2l_name_cnt == l2l_port_cnt && l2l_name_cnt == (l2l_pid_cnt / sizeof(pid_t)));
+ launchd_assert(l2l_name_cnt == l2l_port_cnt);
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_pids, l2l_name_cnt);
+ mach_init_init(req_mport, checkin_mport, l2l_names, l2l_ports, l2l_name_cnt);
if (l2l_names) {
mig_deallocate((vm_address_t)l2l_names, l2l_name_cnt * sizeof(l2l_names[0]));
@@ -269,9 +267,6 @@
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);
Modified: trunk/launchd/src/launchd.h
===================================================================
--- trunk/launchd/src/launchd.h 2006-10-13 00:54:01 UTC (rev 22891)
+++ trunk/launchd/src/launchd.h 2006-10-13 01:21:54 UTC (rev 22892)
@@ -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, pid_t *, mach_msg_type_number_t);
+void mach_init_init(mach_port_t, mach_port_t, name_array_t, mach_port_array_t, mach_msg_type_number_t);
int _fd(int fd);
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2006-10-13 00:54:01 UTC (rev 22891)
+++ trunk/launchd/src/launchd_core_logic.c 2006-10-13 01:21:54 UTC (rev 22892)
@@ -267,7 +267,8 @@
static job_t job_new_spawn(const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d, bool fppc);
static job_t job_new_via_mach_init(job_t jbs, const char *cmd, uid_t uid, bool ond);
static job_t job_new_bootstrap(job_t p, mach_port_t requestorport, mach_port_t checkin_port);
-static job_t job_new_anonymous(job_t p, pid_t who);
+static bool job_new_anonymous(job_t p);
+static job_t job_find_anonymous(job_t p);
static const char *job_prog(job_t j);
static pid_t job_get_pid(job_t j);
static mach_port_t job_get_bsport(job_t j);
@@ -759,33 +760,32 @@
}
job_t
-job_new_anonymous(job_t p, pid_t who)
+job_find_anonymous(job_t p)
{
- int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, who };
- char newlabel[1000], *procname = "unknown";
- struct kinfo_proc kp;
- size_t kplen = sizeof(kp);
- job_t jr;
+ job_t ji = NULL;
- if (who) {
- if (sysctl(mib, 4, &kp, &kplen, NULL, 0) == -1) {
- return NULL;
+ SLIST_FOREACH(ji, &p->jobs, sle) {
+ if (ji->anonymous) {
+ break;
}
- procname = kp.kp_proc.p_comm;
}
- sprintf(newlabel, "anonymous-%u.%s", who, procname);
+ return ji;
+}
- jr = job_new(p, newlabel, procname, NULL, NULL, MACH_PORT_NULL);
+bool
+job_new_anonymous(job_t p)
+{
+ char newlabel[1000], *procname = "unknown";
+ job_t jr;
- if (!jr) {
- return NULL;
+ sprintf(newlabel, "%u.anonymous", MACH_PORT_INDEX(p->bs_port));
+
+ if ((jr = job_new(p, newlabel, procname, NULL, NULL, MACH_PORT_NULL))) {
+ jr->anonymous = true;
}
- jr->anonymous = true;
- jr->p = who;
-
- return jr;
+ return jr ? true : false;
}
job_t
@@ -1413,7 +1413,26 @@
job_t
job_mig_intran(mach_port_t p)
{
- return job_find_by_port2(root_job, p);
+ struct ldcred ldc;
+ job_t jp, jr = NULL;
+
+ runtime_get_caller_creds(&ldc);
+
+ if (launchd_assumes((jp = job_find_by_port2(root_job, p)) != NULL)) {
+ if (jp->req_port) {
+ if (!(jr = job_find_by_pid(jp, ldc.pid, false))) {
+ jr = job_find_anonymous(jp);
+ }
+ } else {
+ jr = jp;
+ }
+ }
+
+ if (!launchd_assumes(jr != NULL)) {
+ syslog(LOG_EMERG, "@@@@@ jp->label == %s", jp->label);
+ }
+
+ return jr;
}
void
@@ -1658,7 +1677,7 @@
job_assumes(j, launchd_mport_notify_req(j->bs_port, MACH_NOTIFY_NO_SENDERS) == KERN_SUCCESS);
}
- switch (c = job_fork(j->legacy_mach_job ? j : j->parent)) {
+ switch (c = job_fork(j->parent)) {
case -1:
job_log_error(j, LOG_ERR, "fork() failed, will try again in one second");
job_assumes(j, close(execspair[0]) == 0);
@@ -2898,6 +2917,8 @@
job_log(p, LOG_DEBUG, "Mach sub-bootstrap created: %s", j->label);
}
+ job_assumes(j, job_new_anonymous(j));
+
return j;
out_bad:
@@ -2940,10 +2961,6 @@
return job_remove(j);
}
}
-
- if (j->anonymous && SLIST_EMPTY(&j->machservices)) {
- job_remove(j);
- }
}
struct machservice *
@@ -3519,27 +3536,17 @@
job_mig_get_self(job_t j, mach_port_t *unprivportp)
{
struct ldcred ldc;
- job_t j2;
runtime_get_caller_creds(&ldc);
job_log(j, LOG_DEBUG, "Requested unprivileged bootstrap port");
- j2 = job_find_by_pid(j, ldc.pid, false);
-
- if (!j2) {
- if (ldc.uid == getuid() && ldc.euid == geteuid()) {
- j2 = job_new_anonymous(j, ldc.pid);
- if (!j2) {
- return BOOTSTRAP_NO_MEMORY;
- }
- } else {
- job_log(j, LOG_NOTICE, "PID %u not managed by launchd", ldc.pid);
- return BOOTSTRAP_NOT_PRIVILEGED;
- }
+ if (j->anonymous) {
+ job_log(j, LOG_NOTICE, "PID %u not managed by %s", ldc.pid, getprogname());
+ return BOOTSTRAP_NOT_PRIVILEGED;
}
- *unprivportp = job_get_bsport(j2);
+ *unprivportp = job_get_bsport(j);
return BOOTSTRAP_SUCCESS;
}
@@ -3586,20 +3593,9 @@
{
struct machservice *ms;
struct ldcred ldc;
- job_t j2;
runtime_get_caller_creds(&ldc);
- if (j == job_get_bs(j)) {
- j2 = job_find_by_pid(j, ldc.pid, false);
- if (!j2) {
- j2 = job_new_anonymous(j, ldc.pid);
- }
- if (j2) {
- j = j2;
- }
- }
-
job_log(j, LOG_NOTICE, "bootstrap_register() is deprecated. PID: %u Service: %s", ldc.pid, servicename);
job_log(j, LOG_DEBUG, "Mach service registration attempt: %s", servicename);
@@ -3691,7 +3687,6 @@
name_array_t service_names;
bootstrap_status_array_t service_actives;
mach_port_array_t ports;
- pid_t *pids;
unsigned int i;
};
@@ -3708,7 +3703,6 @@
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++;
}
@@ -3717,7 +3711,7 @@
job_mig_info(job_t j, 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, NULL, 0 };
+ struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, 0 };
unsigned int cnt = 0;
job_t ji;
@@ -3759,12 +3753,15 @@
kern_return_t
job_mig_transfer_subset(job_t j, mach_port_t *reqport, mach_port_t *rcvright,
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, NULL, 0 };
+ struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, 0 };
unsigned int cnt = 0;
+ if (j->anonymous) {
+ j = j->parent;
+ }
+
if (getpid() != 1) {
job_log(j, LOG_ERR, "Only the system launchd will transfer Mach sub-bootstraps.");
return BOOTSTRAP_NOT_PRIVILEGED;
@@ -3787,11 +3784,6 @@
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, job_mig_info_copyservices, &info_resp, true);
launchd_assumes(info_resp.i == cnt);
@@ -3799,8 +3791,6 @@
*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);
@@ -3818,9 +3808,6 @@
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;
}
@@ -4019,7 +4006,7 @@
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, pid_t *l2l_pids, mach_msg_type_number_t l2l_cnt)
+ name_array_t l2l_names, mach_port_array_t l2l_ports, mach_msg_type_number_t l2l_cnt)
{
mach_msg_type_number_t l2l_i;
auditinfo_t inherited_audit;
@@ -4030,6 +4017,8 @@
launchd_assert((root_job = job_new_bootstrap(NULL, req_port ? req_port : mach_task_self(), checkin_port)) != NULL);
+ launchd_assert((anon_job = job_find_anonymous(root_job)) != NULL);
+
launchd_assert(launchd_get_bport(&inherited_bootstrap_port) == KERN_SUCCESS);
if (getpid() != 1) {
@@ -4049,10 +4038,6 @@
for (l2l_i = 0; l2l_i < l2l_cnt; l2l_i++) {
struct machservice *ms;
- 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);
}
Modified: trunk/launchd/src/protocol_legacy.defs
===================================================================
--- trunk/launchd/src/protocol_legacy.defs 2006-10-13 00:54:01 UTC (rev 22891)
+++ trunk/launchd/src/protocol_legacy.defs 2006-10-13 01:21:54 UTC (rev 22892)
@@ -86,7 +86,6 @@
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 getsocket(
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061012/58f70338/attachment.html
More information about the launchd-changes
mailing list