[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