1/*
2 * Copyright (c) 2011 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29#include <mach/mach_port_internal.h>
30#include <mach/mach.h>
31#include <mach/mach_vm.h>
32#include <mach/mach_traps.h>
33
34kern_return_t
35mach_port_names(
36	ipc_space_t task,
37	mach_port_name_array_t *names,
38	mach_msg_type_number_t *namesCnt,
39	mach_port_type_array_t *types,
40	mach_msg_type_number_t *typesCnt)
41{
42	kern_return_t rv;
43
44	rv = _kernelrpc_mach_port_names(task, names, namesCnt, types,
45			typesCnt);
46
47	return (rv);
48}
49
50kern_return_t
51mach_port_type(
52	ipc_space_t task,
53	mach_port_name_t name,
54	mach_port_type_t *ptype)
55{
56	kern_return_t rv;
57
58	rv = _kernelrpc_mach_port_type(task, name, ptype);
59
60	return (rv);
61}
62
63kern_return_t
64mach_port_rename(
65	ipc_space_t task,
66	mach_port_name_t old_name,
67	mach_port_name_t new_name)
68{
69	kern_return_t rv;
70
71	rv = _kernelrpc_mach_port_rename(task, old_name, new_name);
72
73	return (rv);
74}
75
76kern_return_t
77mach_port_allocate_name(
78	ipc_space_t task,
79	mach_port_right_t right,
80	mach_port_name_t name)
81{
82	kern_return_t rv;
83
84	rv = _kernelrpc_mach_port_allocate_name(task, right, name);
85
86	return (rv);
87}
88
89kern_return_t
90mach_port_allocate(
91	ipc_space_t task,
92	mach_port_right_t right,
93	mach_port_name_t *name)
94{
95	kern_return_t rv;
96
97	rv = _kernelrpc_mach_port_allocate_trap(task, right, name);
98
99	if (rv == MACH_SEND_INVALID_DEST)
100		rv = _kernelrpc_mach_port_allocate(task, right, name);
101
102	return (rv);
103}
104
105kern_return_t
106mach_port_destroy(
107	ipc_space_t task,
108	mach_port_name_t name)
109{
110	kern_return_t rv;
111
112	rv = _kernelrpc_mach_port_destroy_trap(task, name);
113
114	if (rv == MACH_SEND_INVALID_DEST)
115		rv = _kernelrpc_mach_port_destroy(task, name);
116
117	return (rv);
118}
119
120kern_return_t
121mach_port_deallocate(
122	ipc_space_t task,
123	mach_port_name_t name)
124{
125	kern_return_t rv;
126
127	rv = _kernelrpc_mach_port_deallocate_trap(task, name);
128
129	if (rv == MACH_SEND_INVALID_DEST)
130		rv = _kernelrpc_mach_port_deallocate(task,name);
131
132	return (rv);
133}
134
135kern_return_t
136mach_port_get_refs(
137	ipc_space_t task,
138	mach_port_name_t name,
139	mach_port_right_t right,
140	mach_port_urefs_t *refs)
141{
142	kern_return_t rv;
143
144	rv = _kernelrpc_mach_port_get_refs(task, name, right, refs);
145
146	return (rv);
147}
148
149kern_return_t
150mach_port_mod_refs(
151	ipc_space_t task,
152	mach_port_name_t name,
153	mach_port_right_t right,
154	mach_port_delta_t delta)
155{
156	kern_return_t rv;
157
158	rv = _kernelrpc_mach_port_mod_refs_trap(task, name, right, delta);
159
160	if (rv == MACH_SEND_INVALID_DEST)
161		rv = _kernelrpc_mach_port_mod_refs(task, name, right, delta);
162
163	return (rv);
164}
165
166kern_return_t
167mach_port_set_mscount(
168	ipc_space_t task,
169	mach_port_name_t name,
170	mach_port_mscount_t mscount)
171{
172	kern_return_t rv;
173
174	rv = _kernelrpc_mach_port_set_mscount(task, name, mscount);
175
176	return (rv);
177}
178
179kern_return_t
180mach_port_get_set_status(
181	ipc_space_t task,
182	mach_port_name_t name,
183	mach_port_name_array_t *members,
184	mach_msg_type_number_t *membersCnt)
185{
186	kern_return_t rv;
187
188	rv = _kernelrpc_mach_port_get_set_status(task, name, members,
189			membersCnt);
190
191	return (rv);
192}
193
194kern_return_t
195mach_port_move_member(
196	ipc_space_t task,
197	mach_port_name_t member,
198	mach_port_name_t after)
199{
200	kern_return_t rv;
201
202	rv = _kernelrpc_mach_port_move_member_trap(task, member, after);
203
204	if (rv == MACH_SEND_INVALID_DEST)
205		rv = _kernelrpc_mach_port_move_member(task, member, after);
206
207	return (rv);
208}
209
210kern_return_t
211mach_port_request_notification(
212	ipc_space_t task,
213	mach_port_name_t name,
214	mach_msg_id_t msgid,
215	mach_port_mscount_t sync,
216	mach_port_t notify,
217	mach_msg_type_name_t notifyPoly,
218	mach_port_t *previous)
219{
220	kern_return_t rv;
221
222	rv = _kernelrpc_mach_port_request_notification(task, name, msgid,
223		sync, notify, notifyPoly, previous);
224
225	return (rv);
226}
227
228kern_return_t
229mach_port_insert_right(
230	ipc_space_t task,
231	mach_port_name_t name,
232	mach_port_t poly,
233	mach_msg_type_name_t polyPoly)
234{
235	kern_return_t rv;
236
237	rv = _kernelrpc_mach_port_insert_right_trap(task, name, poly, polyPoly);
238
239	if (rv == MACH_SEND_INVALID_DEST)
240		rv = _kernelrpc_mach_port_insert_right(task, name, poly,
241		    polyPoly);
242
243	return (rv);
244}
245
246kern_return_t
247mach_port_extract_right(
248	ipc_space_t task,
249	mach_port_name_t name,
250	mach_msg_type_name_t msgt_name,
251	mach_port_t *poly,
252	mach_msg_type_name_t *polyPoly)
253{
254	kern_return_t rv;
255
256	rv = _kernelrpc_mach_port_extract_right(task, name, msgt_name,
257		poly, polyPoly);
258
259	return (rv);
260}
261
262kern_return_t
263mach_port_set_seqno(
264	ipc_space_t task,
265	mach_port_name_t name,
266	mach_port_seqno_t seqno)
267{
268	kern_return_t rv;
269
270	rv = _kernelrpc_mach_port_set_seqno(task, name, seqno);
271
272	return (rv);
273}
274
275kern_return_t
276mach_port_get_attributes(
277	ipc_space_t task,
278	mach_port_name_t name,
279	mach_port_flavor_t flavor,
280	mach_port_info_t port_info_out,
281	mach_msg_type_number_t *port_info_outCnt)
282{
283	kern_return_t rv;
284
285	rv = _kernelrpc_mach_port_get_attributes(task, name, flavor,
286			port_info_out, port_info_outCnt);
287
288	return (rv);
289}
290
291kern_return_t
292mach_port_set_attributes(
293	ipc_space_t task,
294	mach_port_name_t name,
295	mach_port_flavor_t flavor,
296	mach_port_info_t port_info,
297	mach_msg_type_number_t port_infoCnt)
298{
299	kern_return_t rv;
300
301	rv = _kernelrpc_mach_port_set_attributes(task, name, flavor,
302			port_info, port_infoCnt);
303
304	return (rv);
305}
306
307kern_return_t
308mach_port_allocate_qos(
309	ipc_space_t task,
310	mach_port_right_t right,
311	mach_port_qos_t *qos,
312	mach_port_name_t *name)
313{
314	kern_return_t rv;
315
316	rv = _kernelrpc_mach_port_allocate_qos(task, right, qos, name);
317
318	return (rv);
319}
320
321kern_return_t
322mach_port_allocate_full(
323	ipc_space_t task,
324	mach_port_right_t right,
325	mach_port_t proto,
326	mach_port_qos_t *qos,
327	mach_port_name_t *name)
328{
329	kern_return_t rv;
330
331	rv = _kernelrpc_mach_port_allocate_full(task, right, proto, qos, name);
332
333	return (rv);
334}
335
336kern_return_t
337task_set_port_space(
338	ipc_space_t task,
339	int table_entries)
340{
341	kern_return_t rv;
342
343	rv = _kernelrpc_task_set_port_space(task, table_entries);
344
345	return (rv);
346}
347
348kern_return_t
349mach_port_get_srights(
350	ipc_space_t task,
351	mach_port_name_t name,
352	mach_port_rights_t *srights)
353{
354	kern_return_t rv;
355
356	rv = _kernelrpc_mach_port_get_srights(task, name, srights);
357
358	return (rv);
359}
360
361kern_return_t
362mach_port_space_info(
363	ipc_space_t task,
364	ipc_info_space_t *space_info,
365	ipc_info_name_array_t *table_info,
366	mach_msg_type_number_t *table_infoCnt,
367	ipc_info_tree_name_array_t *tree_info,
368	mach_msg_type_number_t *tree_infoCnt)
369{
370	kern_return_t rv;
371
372	rv = _kernelrpc_mach_port_space_info(task, space_info, table_info,
373			table_infoCnt, tree_info, tree_infoCnt);
374
375	return (rv);
376}
377
378kern_return_t
379mach_port_dnrequest_info(
380	ipc_space_t task,
381	mach_port_name_t name,
382	unsigned *dnr_total,
383	unsigned *dnr_used)
384{
385	kern_return_t rv;
386
387	rv = _kernelrpc_mach_port_dnrequest_info(task, name, dnr_total,
388			dnr_used);
389
390	return (rv);
391}
392
393kern_return_t
394mach_port_kernel_object(
395	ipc_space_t task,
396	mach_port_name_t name,
397	unsigned *object_type,
398	unsigned *object_addr)
399{
400	kern_return_t rv;
401
402	rv = _kernelrpc_mach_port_kernel_object(task, name,
403			object_type, object_addr);
404
405	return (rv);
406}
407
408kern_return_t
409mach_port_insert_member(
410	ipc_space_t task,
411	mach_port_name_t name,
412	mach_port_name_t pset)
413{
414	kern_return_t rv;
415
416	rv = _kernelrpc_mach_port_insert_member_trap(task, name, pset);
417
418	if (rv == MACH_SEND_INVALID_DEST)
419		rv = _kernelrpc_mach_port_insert_member(task, name, pset);
420
421	return (rv);
422}
423
424kern_return_t
425mach_port_extract_member(
426	ipc_space_t task,
427	mach_port_name_t name,
428	mach_port_name_t pset)
429{
430	kern_return_t rv;
431
432	rv = _kernelrpc_mach_port_extract_member_trap(task, name, pset);
433
434	if (rv == MACH_SEND_INVALID_DEST)
435		rv = _kernelrpc_mach_port_extract_member(task, name, pset);
436
437	return (rv);
438}
439
440kern_return_t
441mach_port_get_context(
442	ipc_space_t task,
443	mach_port_name_t name,
444	mach_port_context_t *context)
445{
446	kern_return_t rv;
447	mach_vm_address_t wide_context;
448
449	rv = _kernelrpc_mach_port_get_context(task, name, &wide_context);
450
451	if (rv == KERN_SUCCESS) {
452		*context = (mach_port_context_t)wide_context;
453	}
454
455	return (rv);
456}
457
458kern_return_t
459mach_port_set_context(
460	ipc_space_t task,
461	mach_port_name_t name,
462	mach_port_context_t context)
463{
464	kern_return_t rv;
465
466	rv = _kernelrpc_mach_port_set_context(task, name, context);
467
468	return (rv);
469}
470
471kern_return_t
472mach_port_kobject(
473	ipc_space_t task,
474	mach_port_name_t name,
475	natural_t *object_type,
476	mach_vm_address_t *object_addr)
477{
478	kern_return_t rv;
479
480	rv = _kernelrpc_mach_port_kobject(task, name, object_type, object_addr);
481
482	return (rv);
483}
484