[launchd-changes] [23262] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Thu May 24 13:54:11 PDT 2007


Revision: 23262
          http://trac.macosforge.org/projects/launchd/changeset/23262
Author:   zarzycki at apple.com
Date:     2007-05-24 13:54:11 -0700 (Thu, 24 May 2007)

Log Message:
-----------
<rdar://problem/5218846> loginwindow dialogs can't be seen via accessibility

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/libvproc.c
    trunk/launchd/src/libvproc_internal.h
    trunk/launchd/src/protocol_job.defs

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-05-22 20:22:10 UTC (rev 23261)
+++ trunk/launchd/src/launchd_core_logic.c	2007-05-24 20:54:11 UTC (rev 23262)
@@ -95,6 +95,11 @@
 #define LAUNCHD_DEFAULT_EXIT_TIMEOUT 20
 #define LAUNCHD_SIGKILL_TIMER 5
 
+
+#define TAKE_SUBSET_NAME	"TakeSubsetName"
+#define TAKE_SUBSET_PID		"TakeSubsetPID"
+#define TAKE_SUBSET_PERPID	"TakeSubsetPerPID"
+
 #define IS_POWER_OF_TWO(v)	(!(v & (v - 1)) && v)
 
 extern char **environ;
@@ -5272,12 +5277,11 @@
 kern_return_t
 job_mig_move_subset(job_t j, mach_port_t target_subset, name_t session_type)
 {
-	mach_msg_type_number_t l2l_i, l2l_name_cnt = 0, l2l_port_cnt = 0, l2l_pid_cnt = 0;
-	name_array_t l2l_names = NULL;
-	pid_array_t l2l_pids = NULL;
+	mach_msg_type_number_t l2l_i, l2l_port_cnt = 0;
 	mach_port_array_t l2l_ports = NULL;
 	mach_port_t reqport, rcvright;
 	kern_return_t kr = 1;
+	launch_data_t out_obj_array = NULL;
 	struct ldcred ldc;
 	jobmgr_t jmr = NULL;
 
@@ -5314,30 +5318,45 @@
 
 	job_log(j, LOG_DEBUG, "Move subset attempt: 0x%x", target_subset);
 
-	kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &l2l_names, &l2l_name_cnt, &l2l_pids, &l2l_pid_cnt, &l2l_ports, &l2l_port_cnt);
+	kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &out_obj_array, &l2l_ports, &l2l_port_cnt);
 
+	job_log(j, LOG_NOTICE, "@@@@@ kr == 0x%x", kr);
+
 	if (!job_assumes(j, kr == 0)) {
 		goto out;
 	}
 
-	launchd_assert(l2l_name_cnt == l2l_port_cnt);
-	launchd_assert(l2l_name_cnt == l2l_pid_cnt);
+	launchd_assert(launch_data_array_get_count(out_obj_array) == l2l_port_cnt);
 
 	if (!job_assumes(j, (jmr = jobmgr_new(j->mgr, reqport, rcvright, false, session_type)) != NULL)) {
 		kr = BOOTSTRAP_NO_MEMORY;
 		goto out;
 	}
 
-	for (l2l_i = 0; l2l_i < l2l_name_cnt; l2l_i++) {
-		job_t j_for_service = jobmgr_find_by_pid(jmr, l2l_pids[l2l_i], true);
+	for (l2l_i = 0; l2l_i < l2l_port_cnt; l2l_i++) {
+		launch_data_t tmp, obj_at_idx;
 		struct machservice *ms;
+		job_t j_for_service;
+		const char *serv_name;
+		pid_t target_pid;
+		bool serv_perpid;
 
+		job_assumes(j, obj_at_idx = launch_data_array_get_index(out_obj_array, l2l_i));
+		job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_PID));
+		job_assumes(j, target_pid = launch_data_get_integer(tmp));
+		job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_PERPID));
+		job_assumes(j, serv_perpid = launch_data_get_bool(tmp));
+		job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_NAME));
+		job_assumes(j, serv_name = launch_data_get_string(tmp));
+
+		j_for_service = jobmgr_find_by_pid(jmr, target_pid, true);
+
 		if (!jobmgr_assumes(jmr, j_for_service != NULL)) {
 			kr = BOOTSTRAP_NO_MEMORY;
 			goto out;
 		}
 
-		if ((ms = machservice_new(j_for_service, l2l_names[l2l_i], &l2l_ports[l2l_i], false))) {
+		if ((ms = machservice_new(j_for_service, serv_name, &l2l_ports[l2l_i], serv_perpid))) {
 			machservice_request_notifications(ms);
 		}
 	}
@@ -5345,15 +5364,13 @@
 	kr = 0;
 
 out:
-	if (l2l_names) {
-		mig_deallocate((vm_address_t)l2l_names, l2l_name_cnt * sizeof(l2l_names[0]));
+	if (out_obj_array) {
+		launch_data_free(out_obj_array);
 	}
+
 	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 * sizeof(l2l_pids[0]));
-	}
 
 	if (kr == 0) {
 		if (target_subset) {
@@ -5368,14 +5385,13 @@
 
 kern_return_t
 job_mig_take_subset(job_t j, mach_port_t *reqport, mach_port_t *rcvright,
-		name_array_t *servicenamesp, unsigned int *servicenames_cnt,
-		pid_array_t *pidsp, unsigned int *pids_cnt,
+		vm_offset_t *outdata, mach_msg_type_number_t *outdataCnt,
 		mach_port_array_t *portsp, unsigned int *ports_cnt)
 {
-	name_array_t service_names = NULL;
+	launch_data_t tmp_obj, tmp_dict, outdata_obj_array = NULL;
 	mach_port_array_t ports = NULL;
-	pid_array_t pids = NULL;
 	unsigned int cnt = 0, cnt2 = 0;
+	size_t packed_size;
 	struct machservice *ms;
 	jobmgr_t jm;
 	job_t ji;
@@ -5399,6 +5415,17 @@
 
 	job_log(j, LOG_DEBUG, "Transferring sub-bootstrap to the per session launchd.");
 
+	outdata_obj_array = launch_data_alloc(LAUNCH_DATA_ARRAY);
+	if (!job_assumes(j, outdata_obj_array)) {
+		goto out_bad;
+	}
+
+	*outdataCnt = 20 * 1024 * 1024;
+	mig_allocate(outdata, *outdataCnt);
+	if (!job_assumes(j, *outdata != 0)) {
+		return 1;
+	}
+
 	LIST_FOREACH(ji, &j->mgr->jobs, sle) {
 		if (!ji->anonymous) {
 			continue;
@@ -5408,29 +5435,43 @@
 		}
 	}
 
-	mig_allocate((vm_address_t *)&service_names, cnt * sizeof(service_names[0]));
-	if (!launchd_assumes(service_names != NULL)) {
-		goto out_bad;
-	}
-
 	mig_allocate((vm_address_t *)&ports, cnt * sizeof(ports[0]));
 	if (!launchd_assumes(ports != NULL)) {
 		goto out_bad;
 	}
 
-	mig_allocate((vm_address_t *)&pids, cnt * sizeof(pids[0]));
-	if (!launchd_assumes(pids != NULL)) {
-		goto out_bad;
-	}
-
 	LIST_FOREACH(ji, &j->mgr->jobs, sle) {
 		if (!ji->anonymous) {
 			continue;
 		}
+
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
-			strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0]));
+			if (job_assumes(j, (tmp_dict = launch_data_alloc(LAUNCH_DATA_DICTIONARY)))) {
+				job_assumes(j, launch_data_array_set_index(outdata_obj_array, tmp_dict, cnt2));
+			} else {
+				goto out_bad;
+			}
+
+			if (job_assumes(j, (tmp_obj = launch_data_new_string(machservice_name(ms))))) {
+				job_assumes(j, launch_data_dict_insert(tmp_dict, tmp_obj, TAKE_SUBSET_NAME));
+			} else {
+				goto out_bad;
+			}
+
+			if (job_assumes(j, (tmp_obj = launch_data_new_integer((ms->job->p))))) {
+				job_assumes(j, launch_data_dict_insert(tmp_dict, tmp_obj, TAKE_SUBSET_PID));
+			} else {
+				goto out_bad;
+			}
+
+			if (job_assumes(j, (tmp_obj = launch_data_new_bool((ms->per_pid))))) {
+				job_assumes(j, launch_data_dict_insert(tmp_dict, tmp_obj, TAKE_SUBSET_PERPID));
+			} else {
+				goto out_bad;
+			}
+
 			ports[cnt2] = machservice_port(ms);
-			pids[cnt2] = ms->job->p;
+
 			/* Increment the send right by one so we can shutdown the jobmgr cleanly */
 			jobmgr_assumes(jm, (errno = mach_port_mod_refs(mach_task_self(), ports[cnt2], MACH_PORT_RIGHT_SEND, 1)) == 0);
 			cnt2++;
@@ -5439,10 +5480,15 @@
 
 	launchd_assumes(cnt == cnt2);
 
-	*servicenamesp = service_names;
+	packed_size = launch_data_pack(outdata_obj_array, (void *)*outdata, *outdataCnt, NULL, NULL);
+	if (!job_assumes(j, packed_size != 0)) {
+		goto out_bad;
+	}
+
+	launch_data_free(outdata_obj_array);
+
 	*portsp = ports;
-	*pidsp = pids;
-	*servicenames_cnt = *ports_cnt = *pids_cnt = cnt;
+	*ports_cnt = cnt;
 
 	*reqport = jm->req_port;
 	*rcvright = jm->jm_port;
@@ -5455,11 +5501,11 @@
 	return BOOTSTRAP_SUCCESS;
 
 out_bad:
-	if (service_names) {
-		mig_deallocate((vm_address_t)service_names, cnt * sizeof(service_names[0]));
+	if (outdata_obj_array) {
+		launch_data_free(outdata_obj_array);
 	}
-	if (pids) {
-		mig_deallocate((vm_address_t)pids, cnt * sizeof(pids[0]));
+	if (*outdata) {
+		mig_deallocate(*outdata, *outdataCnt);
 	}
 	if (ports) {
 		mig_deallocate((vm_address_t)ports, cnt * sizeof(ports[0]));

Modified: trunk/launchd/src/libvproc.c
===================================================================
--- trunk/launchd/src/libvproc.c	2007-05-22 20:22:10 UTC (rev 23261)
+++ trunk/launchd/src/libvproc.c	2007-05-24 20:54:11 UTC (rev 23262)
@@ -45,12 +45,31 @@
 static int64_t cached_pid = -1;
 
 kern_return_t
-_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
-		name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
-		pid_array_t *pids, mach_msg_type_number_t *pidCnt,
+_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, launch_data_t *outval,
 		mach_port_array_t *ports, mach_msg_type_number_t *portCnt)
 {
-	return vproc_mig_take_subset(bp, reqport, rcvright, service_names, service_namesCnt, pids, pidCnt, ports, portCnt);
+	mach_msg_type_number_t outdata_cnt;
+	vm_offset_t outdata = 0;
+	size_t data_offset = 0;
+	launch_data_t out_obj;
+	kern_return_t kr;
+
+	if ((kr = vproc_mig_take_subset(bp, reqport, rcvright, &outdata, &outdata_cnt, ports, portCnt))) {
+		goto out;
+	}
+
+	if ((out_obj = launch_data_unpack((void *)outdata, outdata_cnt, NULL, 0, &data_offset, NULL))) {
+		*outval = launch_data_copy(out_obj);
+	} else {
+		kr = 1;
+	}
+
+out:
+	if (outdata) {
+		mig_deallocate(outdata, outdata_cnt);
+	}
+
+	return kr;
 }
 
 vproc_err_t

Modified: trunk/launchd/src/libvproc_internal.h
===================================================================
--- trunk/launchd/src/libvproc_internal.h	2007-05-22 20:22:10 UTC (rev 23261)
+++ trunk/launchd/src/libvproc_internal.h	2007-05-24 20:54:11 UTC (rev 23262)
@@ -22,6 +22,7 @@
 
 #include <mach/mach.h>
 #include <stdarg.h>
+#include "liblaunch_public.h"
 #include "libbootstrap_public.h"
 
 typedef char * _internal_string_t;
@@ -48,9 +49,7 @@
 #define SPAWN_WANTS_WAIT4DEBUGGER	0x0008
 
 kern_return_t
-_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
-		name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
-		pid_array_t *pids, mach_msg_type_number_t *pidCnt,
+_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, launch_data_t *outval,
 		mach_port_array_t *ports, mach_msg_type_number_t *portCnt);
 
 kern_return_t _vprocmgr_getsocket(name_t);

Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs	2007-05-22 20:22:10 UTC (rev 23261)
+++ trunk/launchd/src/protocol_job.defs	2007-05-24 20:54:11 UTC (rev 23262)
@@ -100,8 +100,7 @@
 		__bs_port	: job_t;
 	out	__bs_reqport	: mach_port_move_send_t;
 	out	__bs_rcvright	: mach_port_move_receive_t;
-	out	__service_names	: name_array_t, dealloc;
-	out	__service_pids	: pid_array_t, dealloc;
+	out	__outdata	: pointer_t, dealloc;
 	out	__service_ports	: mach_port_move_send_array_t, dealloc);
 
 routine getsocket(

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070524/df1da397/attachment.html


More information about the launchd-changes mailing list