Revision: 22892 http://trac.macosforge.org/projects/launchd/changeset/22892 Author: zarzycki@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(
participants (1)
-
source_changes@macosforge.org