xref: /xnu-11215.81.4/tests/prioritize_process_launch_helper.c (revision d4514f0bc1d3f944c22d92e68b646ac3fb40d452)
1*d4514f0bSApple OSS Distributions /*
2*d4514f0bSApple OSS Distributions  * prioritize process launch: Tests prioritized process launch across posix spawn and exec.
3*d4514f0bSApple OSS Distributions  */
4*d4514f0bSApple OSS Distributions 
5*d4514f0bSApple OSS Distributions #include <dispatch/dispatch.h>
6*d4514f0bSApple OSS Distributions #include <pthread.h>
7*d4514f0bSApple OSS Distributions #include <launch.h>
8*d4514f0bSApple OSS Distributions #include <mach/mach.h>
9*d4514f0bSApple OSS Distributions #include <mach/message.h>
10*d4514f0bSApple OSS Distributions #include <mach/mach_voucher.h>
11*d4514f0bSApple OSS Distributions #include <pthread/workqueue_private.h>
12*d4514f0bSApple OSS Distributions #include <voucher/ipc_pthread_priority_types.h>
13*d4514f0bSApple OSS Distributions #include <servers/bootstrap.h>
14*d4514f0bSApple OSS Distributions #include <stdlib.h>
15*d4514f0bSApple OSS Distributions #include <sys/event.h>
16*d4514f0bSApple OSS Distributions #include <stdio.h>
17*d4514f0bSApple OSS Distributions #include <unistd.h>
18*d4514f0bSApple OSS Distributions #include <crt_externs.h>
19*d4514f0bSApple OSS Distributions #include <signal.h>
20*d4514f0bSApple OSS Distributions #include <sys/types.h>
21*d4514f0bSApple OSS Distributions #include <sys/sysctl.h>
22*d4514f0bSApple OSS Distributions #include <libkern/OSAtomic.h>
23*d4514f0bSApple OSS Distributions #include <sys/wait.h>
24*d4514f0bSApple OSS Distributions #include <spawn.h>
25*d4514f0bSApple OSS Distributions #include <spawn_private.h>
26*d4514f0bSApple OSS Distributions #include <string.h>
27*d4514f0bSApple OSS Distributions 
28*d4514f0bSApple OSS Distributions 
29*d4514f0bSApple OSS Distributions mach_port_t
30*d4514f0bSApple OSS Distributions receive(
31*d4514f0bSApple OSS Distributions 	mach_port_t rcv_port,
32*d4514f0bSApple OSS Distributions 	mach_port_t notify_port);
33*d4514f0bSApple OSS Distributions 
34*d4514f0bSApple OSS Distributions static int
get_pri(thread_t thread_port)35*d4514f0bSApple OSS Distributions get_pri(thread_t thread_port)
36*d4514f0bSApple OSS Distributions {
37*d4514f0bSApple OSS Distributions 	kern_return_t kr;
38*d4514f0bSApple OSS Distributions 
39*d4514f0bSApple OSS Distributions 	thread_extended_info_data_t extended_info;
40*d4514f0bSApple OSS Distributions 	mach_msg_type_number_t count = THREAD_EXTENDED_INFO_COUNT;
41*d4514f0bSApple OSS Distributions 	kr = thread_info(thread_port, THREAD_EXTENDED_INFO,
42*d4514f0bSApple OSS Distributions 	    (thread_info_t)&extended_info, &count);
43*d4514f0bSApple OSS Distributions 
44*d4514f0bSApple OSS Distributions 	if (kr != KERN_SUCCESS) {
45*d4514f0bSApple OSS Distributions 		printf("thread info failed to get current priority of the thread\n");
46*d4514f0bSApple OSS Distributions 	}
47*d4514f0bSApple OSS Distributions 	return extended_info.pth_priority;
48*d4514f0bSApple OSS Distributions }
49*d4514f0bSApple OSS Distributions 
50*d4514f0bSApple OSS Distributions static void
set_thread_name(const char * fn_name)51*d4514f0bSApple OSS Distributions set_thread_name(const char *fn_name)
52*d4514f0bSApple OSS Distributions {
53*d4514f0bSApple OSS Distributions 	char name[50] = "";
54*d4514f0bSApple OSS Distributions 
55*d4514f0bSApple OSS Distributions 	thread_t thread_port = pthread_mach_thread_np(pthread_self());
56*d4514f0bSApple OSS Distributions 
57*d4514f0bSApple OSS Distributions 	int pri = get_pri(thread_port);
58*d4514f0bSApple OSS Distributions 
59*d4514f0bSApple OSS Distributions 	snprintf(name, sizeof(name), "%s at pri %2d", fn_name, pri);
60*d4514f0bSApple OSS Distributions 	pthread_setname_np(name);
61*d4514f0bSApple OSS Distributions }
62*d4514f0bSApple OSS Distributions 
63*d4514f0bSApple OSS Distributions static void
send(mach_port_t send_port,mach_port_t reply_port,mach_port_t msg_port,mach_msg_option_t options,int send_disposition)64*d4514f0bSApple OSS Distributions send(
65*d4514f0bSApple OSS Distributions 	mach_port_t send_port,
66*d4514f0bSApple OSS Distributions 	mach_port_t reply_port,
67*d4514f0bSApple OSS Distributions 	mach_port_t msg_port,
68*d4514f0bSApple OSS Distributions 	mach_msg_option_t options,
69*d4514f0bSApple OSS Distributions 	int send_disposition)
70*d4514f0bSApple OSS Distributions {
71*d4514f0bSApple OSS Distributions 	kern_return_t ret = 0;
72*d4514f0bSApple OSS Distributions 
73*d4514f0bSApple OSS Distributions 	struct {
74*d4514f0bSApple OSS Distributions 		mach_msg_header_t header;
75*d4514f0bSApple OSS Distributions 		mach_msg_body_t body;
76*d4514f0bSApple OSS Distributions 		mach_msg_port_descriptor_t port_descriptor;
77*d4514f0bSApple OSS Distributions 	} send_msg = {
78*d4514f0bSApple OSS Distributions 		.header = {
79*d4514f0bSApple OSS Distributions 			.msgh_remote_port = send_port,
80*d4514f0bSApple OSS Distributions 			.msgh_local_port  = reply_port,
81*d4514f0bSApple OSS Distributions 			.msgh_bits        = MACH_MSGH_BITS_SET(send_disposition,
82*d4514f0bSApple OSS Distributions 	    reply_port ? MACH_MSG_TYPE_MAKE_SEND_ONCE : 0,
83*d4514f0bSApple OSS Distributions 	    MACH_MSG_TYPE_MOVE_SEND,
84*d4514f0bSApple OSS Distributions 	    MACH_MSGH_BITS_COMPLEX),
85*d4514f0bSApple OSS Distributions 			.msgh_id          = 0x100,
86*d4514f0bSApple OSS Distributions 			.msgh_size        = sizeof(send_msg),
87*d4514f0bSApple OSS Distributions 		},
88*d4514f0bSApple OSS Distributions 		.body = {
89*d4514f0bSApple OSS Distributions 			.msgh_descriptor_count = 1,
90*d4514f0bSApple OSS Distributions 		},
91*d4514f0bSApple OSS Distributions 		.port_descriptor = {
92*d4514f0bSApple OSS Distributions 			.name        = msg_port,
93*d4514f0bSApple OSS Distributions 			.disposition = MACH_MSG_TYPE_MOVE_RECEIVE,
94*d4514f0bSApple OSS Distributions 			.type        = MACH_MSG_PORT_DESCRIPTOR,
95*d4514f0bSApple OSS Distributions 		},
96*d4514f0bSApple OSS Distributions 	};
97*d4514f0bSApple OSS Distributions 
98*d4514f0bSApple OSS Distributions 	if (msg_port == MACH_PORT_NULL) {
99*d4514f0bSApple OSS Distributions 		send_msg.body.msgh_descriptor_count = 0;
100*d4514f0bSApple OSS Distributions 	}
101*d4514f0bSApple OSS Distributions 
102*d4514f0bSApple OSS Distributions 	ret = mach_msg(&(send_msg.header),
103*d4514f0bSApple OSS Distributions 	    MACH_SEND_MSG |
104*d4514f0bSApple OSS Distributions 	    MACH_SEND_TIMEOUT |
105*d4514f0bSApple OSS Distributions 	    MACH_SEND_OVERRIDE |
106*d4514f0bSApple OSS Distributions 	    options,
107*d4514f0bSApple OSS Distributions 	    send_msg.header.msgh_size,
108*d4514f0bSApple OSS Distributions 	    0,
109*d4514f0bSApple OSS Distributions 	    MACH_PORT_NULL,
110*d4514f0bSApple OSS Distributions 	    10000,
111*d4514f0bSApple OSS Distributions 	    0);
112*d4514f0bSApple OSS Distributions 
113*d4514f0bSApple OSS Distributions 	if (ret != KERN_SUCCESS) {
114*d4514f0bSApple OSS Distributions 		printf("mach_msg_send failed with error %d\n", ret);
115*d4514f0bSApple OSS Distributions 	}
116*d4514f0bSApple OSS Distributions }
117*d4514f0bSApple OSS Distributions 
118*d4514f0bSApple OSS Distributions mach_port_t
receive(mach_port_t rcv_port,mach_port_t notify_port)119*d4514f0bSApple OSS Distributions receive(
120*d4514f0bSApple OSS Distributions 	mach_port_t rcv_port,
121*d4514f0bSApple OSS Distributions 	mach_port_t notify_port)
122*d4514f0bSApple OSS Distributions {
123*d4514f0bSApple OSS Distributions 	kern_return_t ret = 0;
124*d4514f0bSApple OSS Distributions 	mach_port_t service_port;
125*d4514f0bSApple OSS Distributions 
126*d4514f0bSApple OSS Distributions 	struct {
127*d4514f0bSApple OSS Distributions 		mach_msg_header_t header;
128*d4514f0bSApple OSS Distributions 		mach_msg_body_t body;
129*d4514f0bSApple OSS Distributions 		mach_msg_port_descriptor_t port_descriptor;
130*d4514f0bSApple OSS Distributions 		mach_msg_trailer_t trailer;
131*d4514f0bSApple OSS Distributions 	} rcv_msg = {
132*d4514f0bSApple OSS Distributions 		.header =
133*d4514f0bSApple OSS Distributions 		{
134*d4514f0bSApple OSS Distributions 			.msgh_remote_port = MACH_PORT_NULL,
135*d4514f0bSApple OSS Distributions 			.msgh_local_port  = rcv_port,
136*d4514f0bSApple OSS Distributions 			.msgh_size        = sizeof(rcv_msg),
137*d4514f0bSApple OSS Distributions 		},
138*d4514f0bSApple OSS Distributions 	};
139*d4514f0bSApple OSS Distributions 
140*d4514f0bSApple OSS Distributions 	printf("Client: Starting sync receive\n");
141*d4514f0bSApple OSS Distributions 
142*d4514f0bSApple OSS Distributions 	ret = mach_msg(&(rcv_msg.header),
143*d4514f0bSApple OSS Distributions 	    MACH_RCV_MSG | MACH_RCV_LARGE |
144*d4514f0bSApple OSS Distributions 	    (notify_port ? MACH_RCV_SYNC_WAIT : 0),
145*d4514f0bSApple OSS Distributions 	    0,
146*d4514f0bSApple OSS Distributions 	    rcv_msg.header.msgh_size,
147*d4514f0bSApple OSS Distributions 	    rcv_port,
148*d4514f0bSApple OSS Distributions 	    0,
149*d4514f0bSApple OSS Distributions 	    notify_port);
150*d4514f0bSApple OSS Distributions 
151*d4514f0bSApple OSS Distributions 	printf("mach msg rcv returned %d\n", ret);
152*d4514f0bSApple OSS Distributions 
153*d4514f0bSApple OSS Distributions 
154*d4514f0bSApple OSS Distributions 	if (rcv_msg.body.msgh_descriptor_count != 1) {
155*d4514f0bSApple OSS Distributions 		if (notify_port) {
156*d4514f0bSApple OSS Distributions 			printf("Did not receive a service port in mach msg %d\n", rcv_msg.body.msgh_descriptor_count);
157*d4514f0bSApple OSS Distributions 		}
158*d4514f0bSApple OSS Distributions 		return MACH_PORT_NULL;
159*d4514f0bSApple OSS Distributions 	}
160*d4514f0bSApple OSS Distributions 
161*d4514f0bSApple OSS Distributions 	service_port = rcv_msg.port_descriptor.name;
162*d4514f0bSApple OSS Distributions 	return service_port;
163*d4514f0bSApple OSS Distributions }
164*d4514f0bSApple OSS Distributions 
165*d4514f0bSApple OSS Distributions int
main(int argc,char * argv[])166*d4514f0bSApple OSS Distributions main(int argc __attribute__((unused)), char *argv[])
167*d4514f0bSApple OSS Distributions {
168*d4514f0bSApple OSS Distributions 	int priority;
169*d4514f0bSApple OSS Distributions 	set_thread_name(__FUNCTION__);
170*d4514f0bSApple OSS Distributions 
171*d4514f0bSApple OSS Distributions 	/* Check for priority */
172*d4514f0bSApple OSS Distributions 	priority = get_pri(mach_thread_self());
173*d4514f0bSApple OSS Distributions 	printf("The priority of child is %d\n", priority);
174*d4514f0bSApple OSS Distributions 
175*d4514f0bSApple OSS Distributions 	if (strcmp(argv[1], "EXIT") == 0) {
176*d4514f0bSApple OSS Distributions 		printf("Helper process exiting\n");
177*d4514f0bSApple OSS Distributions 		exit(priority);
178*d4514f0bSApple OSS Distributions 	} else if (strcmp(argv[1], "EXEC") == 0) {
179*d4514f0bSApple OSS Distributions 		int ret;
180*d4514f0bSApple OSS Distributions 
181*d4514f0bSApple OSS Distributions 		printf("Helper process execing\n");
182*d4514f0bSApple OSS Distributions 		/* exec the same binary with EXIT arg */
183*d4514f0bSApple OSS Distributions 		char *binary = "prioritize_process_launch_helper";
184*d4514f0bSApple OSS Distributions 		char *new_argv[] = {binary, "EXIT", NULL};
185*d4514f0bSApple OSS Distributions 		ret = execve(binary, new_argv, NULL);
186*d4514f0bSApple OSS Distributions 		exit(ret);
187*d4514f0bSApple OSS Distributions 	} else if (strcmp(argv[1], "SETEXEC") == 0) {
188*d4514f0bSApple OSS Distributions 		int ret;
189*d4514f0bSApple OSS Distributions 		int child_pid;
190*d4514f0bSApple OSS Distributions 		posix_spawnattr_t attr;
191*d4514f0bSApple OSS Distributions 
192*d4514f0bSApple OSS Distributions 		ret = posix_spawnattr_init(&attr);
193*d4514f0bSApple OSS Distributions 		if (ret != 0) {
194*d4514f0bSApple OSS Distributions 			printf("posix_spawnattr_init failed \n");
195*d4514f0bSApple OSS Distributions 			exit(ret);
196*d4514f0bSApple OSS Distributions 		}
197*d4514f0bSApple OSS Distributions 		ret = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETEXEC);
198*d4514f0bSApple OSS Distributions 		if (ret != 0) {
199*d4514f0bSApple OSS Distributions 			printf("posix_spawnattr_setflags failed \n");
200*d4514f0bSApple OSS Distributions 			exit(ret);
201*d4514f0bSApple OSS Distributions 		}
202*d4514f0bSApple OSS Distributions 
203*d4514f0bSApple OSS Distributions 		printf("Helper process doing posix_spawn set_exec\n");
204*d4514f0bSApple OSS Distributions 		/* set exec the same binary with EXIT arg */
205*d4514f0bSApple OSS Distributions 		char *binary = "prioritize_process_launch_helper";
206*d4514f0bSApple OSS Distributions 		char *new_argv[] = {binary, "EXIT", NULL};
207*d4514f0bSApple OSS Distributions 
208*d4514f0bSApple OSS Distributions 		ret = posix_spawn(&child_pid, binary, NULL, &attr, new_argv, NULL);
209*d4514f0bSApple OSS Distributions 		exit(ret);
210*d4514f0bSApple OSS Distributions 	} else if (strcmp(argv[1], "SETEXEC_PORTS") == 0) {
211*d4514f0bSApple OSS Distributions 		int ret;
212*d4514f0bSApple OSS Distributions 		int child_pid;
213*d4514f0bSApple OSS Distributions 		posix_spawnattr_t attr;
214*d4514f0bSApple OSS Distributions 		mach_port_t port;
215*d4514f0bSApple OSS Distributions 
216*d4514f0bSApple OSS Distributions 		kern_return_t kr =  mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
217*d4514f0bSApple OSS Distributions 		if (kr != KERN_SUCCESS) {
218*d4514f0bSApple OSS Distributions 			printf("mach_port_allocate failed with error %d\n", kr);
219*d4514f0bSApple OSS Distributions 			exit(kr);
220*d4514f0bSApple OSS Distributions 		}
221*d4514f0bSApple OSS Distributions 
222*d4514f0bSApple OSS Distributions 		kr = mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND);
223*d4514f0bSApple OSS Distributions 		if (kr != KERN_SUCCESS) {
224*d4514f0bSApple OSS Distributions 			printf("mach_port_insert_right failed with error %d\n", kr);
225*d4514f0bSApple OSS Distributions 			exit(kr);
226*d4514f0bSApple OSS Distributions 		}
227*d4514f0bSApple OSS Distributions 
228*d4514f0bSApple OSS Distributions 		ret = posix_spawnattr_init(&attr);
229*d4514f0bSApple OSS Distributions 		if (ret != 0) {
230*d4514f0bSApple OSS Distributions 			printf("posix_spawnattr_init failed \n");
231*d4514f0bSApple OSS Distributions 			exit(ret);
232*d4514f0bSApple OSS Distributions 		}
233*d4514f0bSApple OSS Distributions 
234*d4514f0bSApple OSS Distributions 		ret = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETEXEC);
235*d4514f0bSApple OSS Distributions 		if (ret != 0) {
236*d4514f0bSApple OSS Distributions 			printf("posix_spawnattr_setflags failed \n");
237*d4514f0bSApple OSS Distributions 			exit(ret);
238*d4514f0bSApple OSS Distributions 		}
239*d4514f0bSApple OSS Distributions 
240*d4514f0bSApple OSS Distributions 		ret = posix_spawnattr_set_importancewatch_port_np(&attr, 1, &port);
241*d4514f0bSApple OSS Distributions 		if (ret != 0) {
242*d4514f0bSApple OSS Distributions 			printf("posix_spawnattr_set_importance_port_np failed \n");
243*d4514f0bSApple OSS Distributions 			exit(ret);
244*d4514f0bSApple OSS Distributions 		}
245*d4514f0bSApple OSS Distributions 
246*d4514f0bSApple OSS Distributions 		printf("Helper process doing posix_spawn set_exec\n");
247*d4514f0bSApple OSS Distributions 		/* set exec the same binary with EXIT arg */
248*d4514f0bSApple OSS Distributions 		char *binary = "prioritize_process_launch_helper";
249*d4514f0bSApple OSS Distributions 		char *new_argv[] = {binary, "EXIT", NULL};
250*d4514f0bSApple OSS Distributions 
251*d4514f0bSApple OSS Distributions 		ret = posix_spawn(&child_pid, binary, NULL, &attr, new_argv, NULL);
252*d4514f0bSApple OSS Distributions 		printf("spawned failed with error %d\n", ret);
253*d4514f0bSApple OSS Distributions 		exit(ret);
254*d4514f0bSApple OSS Distributions 	} else if (strcmp(argv[1], "WAIT") == 0) {
255*d4514f0bSApple OSS Distributions 		do {
256*d4514f0bSApple OSS Distributions 			sleep(1);
257*d4514f0bSApple OSS Distributions 			priority = get_pri(mach_thread_self());
258*d4514f0bSApple OSS Distributions 		} while (priority == 47);
259*d4514f0bSApple OSS Distributions 		exit(priority);
260*d4514f0bSApple OSS Distributions 	} else if (strcmp(argv[1], "MULTIWAIT") == 0) {
261*d4514f0bSApple OSS Distributions 		do {
262*d4514f0bSApple OSS Distributions 			sleep(1);
263*d4514f0bSApple OSS Distributions 			priority = get_pri(mach_thread_self());
264*d4514f0bSApple OSS Distributions 		} while (priority == 47);
265*d4514f0bSApple OSS Distributions 		printf("The priority came down to %d\n", priority);
266*d4514f0bSApple OSS Distributions 		do {
267*d4514f0bSApple OSS Distributions 			sleep(1);
268*d4514f0bSApple OSS Distributions 			priority = get_pri(mach_thread_self());
269*d4514f0bSApple OSS Distributions 		} while (priority == 37);
270*d4514f0bSApple OSS Distributions 		printf("The priority came down to %d\n", priority);
271*d4514f0bSApple OSS Distributions 		exit(priority);
272*d4514f0bSApple OSS Distributions 	} else if (strcmp(argv[1], "MSGSYNC") == 0) {
273*d4514f0bSApple OSS Distributions 		int ret_val = 31;
274*d4514f0bSApple OSS Distributions 		mach_port_array_t port_array = NULL;
275*d4514f0bSApple OSS Distributions 		unsigned int portCnt = 0;
276*d4514f0bSApple OSS Distributions 		mach_port_t send_port;
277*d4514f0bSApple OSS Distributions 		mach_port_t special_reply_port;
278*d4514f0bSApple OSS Distributions 		mach_port_t service_port;
279*d4514f0bSApple OSS Distributions 		kern_return_t kr;
280*d4514f0bSApple OSS Distributions 
281*d4514f0bSApple OSS Distributions 		priority = get_pri(mach_thread_self());
282*d4514f0bSApple OSS Distributions 		printf("The priority of spawned binary is  to %d\n", priority);
283*d4514f0bSApple OSS Distributions 		if (priority != 47) {
284*d4514f0bSApple OSS Distributions 			ret_val = 0;
285*d4514f0bSApple OSS Distributions 		}
286*d4514f0bSApple OSS Distributions 
287*d4514f0bSApple OSS Distributions 		/* Get the stashed send right using mach_ports_lookup */
288*d4514f0bSApple OSS Distributions 		kr = mach_ports_lookup(mach_task_self(), &port_array, &portCnt);
289*d4514f0bSApple OSS Distributions 		if (kr != KERN_SUCCESS) {
290*d4514f0bSApple OSS Distributions 			printf("mach_ports_lookup failed with return value %d and port count %d\n", kr, portCnt);
291*d4514f0bSApple OSS Distributions 			exit(0);
292*d4514f0bSApple OSS Distributions 		}
293*d4514f0bSApple OSS Distributions 
294*d4514f0bSApple OSS Distributions 		send_port = port_array[0];
295*d4514f0bSApple OSS Distributions 		special_reply_port = thread_get_special_reply_port();
296*d4514f0bSApple OSS Distributions 		if (!MACH_PORT_VALID(special_reply_port)) {
297*d4514f0bSApple OSS Distributions 			printf("Failed to special reply port for thread\n");
298*d4514f0bSApple OSS Distributions 			exit(0);
299*d4514f0bSApple OSS Distributions 		}
300*d4514f0bSApple OSS Distributions 
301*d4514f0bSApple OSS Distributions 		/* Perform a Sync bootstrap checkin */
302*d4514f0bSApple OSS Distributions 		send(send_port, special_reply_port, MACH_PORT_NULL, MACH_SEND_SYNC_BOOTSTRAP_CHECKIN, MACH_MSG_TYPE_COPY_SEND);
303*d4514f0bSApple OSS Distributions 		sleep(2);
304*d4514f0bSApple OSS Distributions 
305*d4514f0bSApple OSS Distributions 		/* Make sure we are still boosted */
306*d4514f0bSApple OSS Distributions 		priority = get_pri(mach_thread_self());
307*d4514f0bSApple OSS Distributions 		printf("The priority of spawned binary is  to %d\n", priority);
308*d4514f0bSApple OSS Distributions 		if (priority != 47) {
309*d4514f0bSApple OSS Distributions 			ret_val = 0;
310*d4514f0bSApple OSS Distributions 		}
311*d4514f0bSApple OSS Distributions 
312*d4514f0bSApple OSS Distributions 		/* Receive the service port */
313*d4514f0bSApple OSS Distributions 		service_port = receive(special_reply_port, send_port);
314*d4514f0bSApple OSS Distributions 
315*d4514f0bSApple OSS Distributions 		/* Make sure we are still boosted */
316*d4514f0bSApple OSS Distributions 		priority = get_pri(mach_thread_self());
317*d4514f0bSApple OSS Distributions 		printf("The priority of spawned binary is  to %d\n", priority);
318*d4514f0bSApple OSS Distributions 		if (priority != 47) {
319*d4514f0bSApple OSS Distributions 			ret_val = 0;
320*d4514f0bSApple OSS Distributions 		}
321*d4514f0bSApple OSS Distributions 
322*d4514f0bSApple OSS Distributions 		/* Try to receive on service port */
323*d4514f0bSApple OSS Distributions 		receive(service_port, MACH_PORT_NULL);
324*d4514f0bSApple OSS Distributions 
325*d4514f0bSApple OSS Distributions 		/* Make sure we are no longer boosted */
326*d4514f0bSApple OSS Distributions 		priority = get_pri(mach_thread_self());
327*d4514f0bSApple OSS Distributions 		printf("The priority of spawned binary is  to %d\n", priority);
328*d4514f0bSApple OSS Distributions 		if (priority != 31) {
329*d4514f0bSApple OSS Distributions 			ret_val = 0;
330*d4514f0bSApple OSS Distributions 		}
331*d4514f0bSApple OSS Distributions 		exit(ret_val);
332*d4514f0bSApple OSS Distributions 	}
333*d4514f0bSApple OSS Distributions 
334*d4514f0bSApple OSS Distributions 	exit(0);
335*d4514f0bSApple OSS Distributions }
336