]> git.saurik.com Git - apple/xnu.git/blame - libsyscall/mach/mach_port.c
xnu-7195.101.1.tar.gz
[apple/xnu.git] / libsyscall / mach / mach_port.c
CommitLineData
316670eb
A
1/*
2 * Copyright (c) 2011 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
0a7de745 5 *
316670eb
A
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.
0a7de745 14 *
316670eb
A
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
0a7de745 17 *
316670eb
A
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.
0a7de745 25 *
316670eb
A
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>
d9a64523
A
33#include <mach/mach_sync_ipc.h>
34#include "tsd.h"
316670eb 35
cb323159 36
316670eb
A
37kern_return_t
38mach_port_names(
39 ipc_space_t task,
40 mach_port_name_array_t *names,
41 mach_msg_type_number_t *namesCnt,
42 mach_port_type_array_t *types,
43 mach_msg_type_number_t *typesCnt)
44{
45 kern_return_t rv;
46
47 rv = _kernelrpc_mach_port_names(task, names, namesCnt, types,
0a7de745 48 typesCnt);
316670eb 49
0a7de745 50 return rv;
316670eb
A
51}
52
53kern_return_t
54mach_port_type(
55 ipc_space_t task,
56 mach_port_name_t name,
57 mach_port_type_t *ptype)
58{
59 kern_return_t rv;
60
cb323159
A
61 rv = _kernelrpc_mach_port_type_trap(task, name, ptype);
62
63 if (rv == MACH_SEND_INVALID_DEST) {
64 rv = _kernelrpc_mach_port_type(task, name, ptype);
65 }
316670eb 66
0a7de745 67 return rv;
316670eb
A
68}
69
70kern_return_t
71mach_port_rename(
72 ipc_space_t task,
73 mach_port_name_t old_name,
74 mach_port_name_t new_name)
75{
76 kern_return_t rv;
77
78 rv = _kernelrpc_mach_port_rename(task, old_name, new_name);
79
0a7de745 80 return rv;
316670eb
A
81}
82
83kern_return_t
84mach_port_allocate_name(
85 ipc_space_t task,
86 mach_port_right_t right,
87 mach_port_name_t name)
88{
89 kern_return_t rv;
90
91 rv = _kernelrpc_mach_port_allocate_name(task, right, name);
92
0a7de745 93 return rv;
316670eb
A
94}
95
96kern_return_t
97mach_port_allocate(
98 ipc_space_t task,
99 mach_port_right_t right,
100 mach_port_name_t *name)
101{
102 kern_return_t rv;
103
104 rv = _kernelrpc_mach_port_allocate_trap(task, right, name);
105
0a7de745 106 if (rv == MACH_SEND_INVALID_DEST) {
316670eb 107 rv = _kernelrpc_mach_port_allocate(task, right, name);
0a7de745 108 }
316670eb 109
0a7de745 110 return rv;
316670eb
A
111}
112
113kern_return_t
114mach_port_destroy(
115 ipc_space_t task,
116 mach_port_name_t name)
117{
118 kern_return_t rv;
119
f427ee49 120 rv = _kernelrpc_mach_port_destroy(task, name);
316670eb 121
0a7de745 122 return rv;
316670eb
A
123}
124
125kern_return_t
126mach_port_deallocate(
127 ipc_space_t task,
128 mach_port_name_t name)
129{
130 kern_return_t rv;
131
0a7de745 132 rv = _kernelrpc_mach_port_deallocate_trap(task, name);
316670eb 133
0a7de745
A
134 if (rv == MACH_SEND_INVALID_DEST) {
135 rv = _kernelrpc_mach_port_deallocate(task, name);
136 }
316670eb 137
0a7de745 138 return rv;
316670eb
A
139}
140
141kern_return_t
142mach_port_get_refs(
143 ipc_space_t task,
144 mach_port_name_t name,
145 mach_port_right_t right,
146 mach_port_urefs_t *refs)
147{
148 kern_return_t rv;
149
150 rv = _kernelrpc_mach_port_get_refs(task, name, right, refs);
151
0a7de745 152 return rv;
316670eb
A
153}
154
155kern_return_t
156mach_port_mod_refs(
157 ipc_space_t task,
158 mach_port_name_t name,
159 mach_port_right_t right,
160 mach_port_delta_t delta)
161{
162 kern_return_t rv;
163
0a7de745 164 rv = _kernelrpc_mach_port_mod_refs_trap(task, name, right, delta);
316670eb 165
0a7de745 166 if (rv == MACH_SEND_INVALID_DEST) {
316670eb 167 rv = _kernelrpc_mach_port_mod_refs(task, name, right, delta);
0a7de745 168 }
316670eb 169
0a7de745 170 return rv;
316670eb
A
171}
172
39236c6e
A
173kern_return_t
174mach_port_peek(
0a7de745
A
175 ipc_space_t task,
176 mach_port_name_t name,
39236c6e 177 mach_msg_trailer_type_t trailer_type,
0a7de745
A
178 mach_port_seqno_t *seqnop,
179 mach_msg_size_t *msg_sizep,
180 mach_msg_id_t *msg_idp,
39236c6e 181 mach_msg_trailer_info_t trailer_infop,
0a7de745 182 mach_msg_type_number_t *trailer_sizep)
39236c6e
A
183{
184 kern_return_t rv;
185
0a7de745
A
186 rv = _kernelrpc_mach_port_peek(task, name, trailer_type,
187 seqnop, msg_sizep, msg_idp,
188 trailer_infop, trailer_sizep);
39236c6e 189
0a7de745 190 return rv;
39236c6e
A
191}
192
316670eb
A
193kern_return_t
194mach_port_set_mscount(
195 ipc_space_t task,
196 mach_port_name_t name,
197 mach_port_mscount_t mscount)
198{
199 kern_return_t rv;
200
201 rv = _kernelrpc_mach_port_set_mscount(task, name, mscount);
202
0a7de745 203 return rv;
316670eb
A
204}
205
206kern_return_t
207mach_port_get_set_status(
208 ipc_space_t task,
209 mach_port_name_t name,
210 mach_port_name_array_t *members,
211 mach_msg_type_number_t *membersCnt)
212{
213 kern_return_t rv;
214
215 rv = _kernelrpc_mach_port_get_set_status(task, name, members,
0a7de745 216 membersCnt);
316670eb 217
0a7de745 218 return rv;
316670eb
A
219}
220
221kern_return_t
222mach_port_move_member(
223 ipc_space_t task,
224 mach_port_name_t member,
225 mach_port_name_t after)
226{
227 kern_return_t rv;
228
229 rv = _kernelrpc_mach_port_move_member_trap(task, member, after);
230
0a7de745 231 if (rv == MACH_SEND_INVALID_DEST) {
316670eb 232 rv = _kernelrpc_mach_port_move_member(task, member, after);
0a7de745 233 }
316670eb 234
0a7de745 235 return rv;
316670eb
A
236}
237
238kern_return_t
239mach_port_request_notification(
240 ipc_space_t task,
241 mach_port_name_t name,
242 mach_msg_id_t msgid,
243 mach_port_mscount_t sync,
244 mach_port_t notify,
245 mach_msg_type_name_t notifyPoly,
246 mach_port_t *previous)
247{
248 kern_return_t rv;
249
cb323159 250 rv = _kernelrpc_mach_port_request_notification_trap(task, name, msgid,
0a7de745 251 sync, notify, notifyPoly, previous);
316670eb 252
cb323159
A
253 if (rv == MACH_SEND_INVALID_DEST) {
254 rv = _kernelrpc_mach_port_request_notification(task, name, msgid,
255 sync, notify, notifyPoly, previous);
256 }
257
0a7de745 258 return rv;
316670eb
A
259}
260
261kern_return_t
262mach_port_insert_right(
263 ipc_space_t task,
264 mach_port_name_t name,
265 mach_port_t poly,
266 mach_msg_type_name_t polyPoly)
267{
268 kern_return_t rv;
269
0a7de745 270 rv = _kernelrpc_mach_port_insert_right_trap(task, name, poly, polyPoly);
316670eb 271
0a7de745 272 if (rv == MACH_SEND_INVALID_DEST) {
316670eb
A
273 rv = _kernelrpc_mach_port_insert_right(task, name, poly,
274 polyPoly);
0a7de745 275 }
316670eb 276
0a7de745 277 return rv;
316670eb
A
278}
279
280kern_return_t
281mach_port_extract_right(
282 ipc_space_t task,
283 mach_port_name_t name,
284 mach_msg_type_name_t msgt_name,
285 mach_port_t *poly,
286 mach_msg_type_name_t *polyPoly)
287{
288 kern_return_t rv;
289
290 rv = _kernelrpc_mach_port_extract_right(task, name, msgt_name,
0a7de745 291 poly, polyPoly);
316670eb 292
0a7de745 293 return rv;
316670eb
A
294}
295
296kern_return_t
297mach_port_set_seqno(
298 ipc_space_t task,
299 mach_port_name_t name,
300 mach_port_seqno_t seqno)
301{
302 kern_return_t rv;
303
304 rv = _kernelrpc_mach_port_set_seqno(task, name, seqno);
305
0a7de745 306 return rv;
316670eb
A
307}
308
309kern_return_t
310mach_port_get_attributes(
311 ipc_space_t task,
312 mach_port_name_t name,
313 mach_port_flavor_t flavor,
314 mach_port_info_t port_info_out,
315 mach_msg_type_number_t *port_info_outCnt)
316{
317 kern_return_t rv;
318
d9a64523 319 rv = _kernelrpc_mach_port_get_attributes_trap(task, name, flavor,
0a7de745 320 port_info_out, port_info_outCnt);
316670eb 321
d9a64523
A
322#ifdef __x86_64__
323 /* REMOVE once XBS kernel has new trap */
0a7de745 324 if (rv == ((1 << 24) | 40)) { /* see mach/i386/syscall_sw.h */
d9a64523 325 rv = MACH_SEND_INVALID_DEST;
0a7de745 326 }
d9a64523
A
327#elif defined(__i386__)
328 /* REMOVE once XBS kernel has new trap */
0a7de745 329 if (rv == (kern_return_t)(-40)) {
d9a64523 330 rv = MACH_SEND_INVALID_DEST;
0a7de745 331 }
d9a64523
A
332#endif
333
0a7de745 334 if (rv == MACH_SEND_INVALID_DEST) {
d9a64523 335 rv = _kernelrpc_mach_port_get_attributes(task, name, flavor,
0a7de745
A
336 port_info_out, port_info_outCnt);
337 }
d9a64523 338
0a7de745 339 return rv;
316670eb
A
340}
341
342kern_return_t
343mach_port_set_attributes(
344 ipc_space_t task,
345 mach_port_name_t name,
346 mach_port_flavor_t flavor,
347 mach_port_info_t port_info,
348 mach_msg_type_number_t port_infoCnt)
349{
350 kern_return_t rv;
351
352 rv = _kernelrpc_mach_port_set_attributes(task, name, flavor,
0a7de745 353 port_info, port_infoCnt);
316670eb 354
0a7de745 355 return rv;
316670eb
A
356}
357
358kern_return_t
359mach_port_allocate_qos(
360 ipc_space_t task,
361 mach_port_right_t right,
362 mach_port_qos_t *qos,
363 mach_port_name_t *name)
364{
365 kern_return_t rv;
366
367 rv = _kernelrpc_mach_port_allocate_qos(task, right, qos, name);
368
0a7de745 369 return rv;
316670eb
A
370}
371
372kern_return_t
373mach_port_allocate_full(
374 ipc_space_t task,
375 mach_port_right_t right,
376 mach_port_t proto,
377 mach_port_qos_t *qos,
378 mach_port_name_t *name)
379{
380 kern_return_t rv;
381
382 rv = _kernelrpc_mach_port_allocate_full(task, right, proto, qos, name);
383
0a7de745 384 return rv;
316670eb
A
385}
386
387kern_return_t
388task_set_port_space(
389 ipc_space_t task,
390 int table_entries)
391{
392 kern_return_t rv;
393
394 rv = _kernelrpc_task_set_port_space(task, table_entries);
395
0a7de745 396 return rv;
316670eb
A
397}
398
399kern_return_t
400mach_port_get_srights(
401 ipc_space_t task,
402 mach_port_name_t name,
403 mach_port_rights_t *srights)
404{
405 kern_return_t rv;
406
407 rv = _kernelrpc_mach_port_get_srights(task, name, srights);
408
0a7de745 409 return rv;
316670eb
A
410}
411
412kern_return_t
413mach_port_space_info(
414 ipc_space_t task,
415 ipc_info_space_t *space_info,
416 ipc_info_name_array_t *table_info,
417 mach_msg_type_number_t *table_infoCnt,
418 ipc_info_tree_name_array_t *tree_info,
419 mach_msg_type_number_t *tree_infoCnt)
420{
421 kern_return_t rv;
422
423 rv = _kernelrpc_mach_port_space_info(task, space_info, table_info,
0a7de745 424 table_infoCnt, tree_info, tree_infoCnt);
316670eb 425
0a7de745 426 return rv;
316670eb
A
427}
428
fe8ab488
A
429kern_return_t
430mach_port_space_basic_info(
431 ipc_space_t task,
432 ipc_info_space_basic_t *space_basic_info)
433{
434 kern_return_t rv;
435
436 rv = _kernelrpc_mach_port_space_basic_info(task, space_basic_info);
437
0a7de745 438 return rv;
fe8ab488
A
439}
440
d9a64523 441static inline mach_port_t
c3c9b80d 442_tsd_get_special_reply_port(void)
d9a64523
A
443{
444 return (mach_port_t)(uintptr_t)_os_tsd_get_direct(__TSD_MACH_SPECIAL_REPLY);
445}
446
447static inline void
448_tsd_set_special_reply_port(mach_port_t port)
449{
450 _os_tsd_set_direct(__TSD_MACH_SPECIAL_REPLY, (void *)(uintptr_t)port);
451}
452
453mach_port_t
454mig_get_special_reply_port(void)
455{
456 mach_port_t srp;
457
458 srp = _tsd_get_special_reply_port();
459 if (!MACH_PORT_VALID(srp)) {
460 srp = thread_get_special_reply_port();
461 _tsd_set_special_reply_port(srp);
462 }
463
464 return srp;
465}
466
467void
468mig_dealloc_special_reply_port(mach_port_t migport)
469{
470 mach_port_t srp = _tsd_get_special_reply_port();
471 if (MACH_PORT_VALID(srp)) {
472 thread_destruct_special_reply_port(srp, THREAD_SPECIAL_REPLY_PORT_ALL);
473 if (migport != srp) {
474 mach_port_deallocate(mach_task_self(), migport);
475 }
476 _tsd_set_special_reply_port(MACH_PORT_NULL);
477 }
478}
479
480kern_return_t
481mach_sync_ipc_link_monitoring_start(mach_port_t *special_reply_port)
482{
483 mach_port_t srp;
484 boolean_t link_broken;
485 kern_return_t kr;
486
487 *special_reply_port = MACH_PORT_DEAD;
488
489 srp = mig_get_special_reply_port();
490
491 kr = mach_port_mod_refs(mach_task_self(), srp, MACH_PORT_RIGHT_SEND, 1);
492
493 if (kr != KERN_SUCCESS) {
494 return kr;
495 }
496
497 kr = _kernelrpc_mach_port_special_reply_port_reset_link(mach_task_self(), srp, &link_broken);
498 if (kr != KERN_SUCCESS) {
499 mach_port_deallocate(mach_task_self(), srp);
500 return kr;
501 }
502
503 *special_reply_port = srp;
504
505 return kr;
506}
507
508kern_return_t
509mach_sync_ipc_link_monitoring_stop(mach_port_t srp, boolean_t* in_effect)
510{
511 kern_return_t kr;
512 boolean_t link_broken = TRUE;
513
514 kr = _kernelrpc_mach_port_special_reply_port_reset_link(mach_task_self(), srp, &link_broken);
515
516 /*
517 * We return if the sync IPC priority inversion avoidance facility took
518 * effect, so if the link was broken it didn't take effect.
519 * Flip the return.
520 */
521 *in_effect = !link_broken;
522
523 mach_port_deallocate(mach_task_self(), srp);
524
525 return kr;
526}
527
316670eb
A
528kern_return_t
529mach_port_dnrequest_info(
530 ipc_space_t task,
531 mach_port_name_t name,
532 unsigned *dnr_total,
533 unsigned *dnr_used)
534{
535 kern_return_t rv;
536
537 rv = _kernelrpc_mach_port_dnrequest_info(task, name, dnr_total,
0a7de745 538 dnr_used);
316670eb 539
0a7de745 540 return rv;
316670eb
A
541}
542
543kern_return_t
544mach_port_kernel_object(
545 ipc_space_t task,
546 mach_port_name_t name,
547 unsigned *object_type,
548 unsigned *object_addr)
549{
550 kern_return_t rv;
551
552 rv = _kernelrpc_mach_port_kernel_object(task, name,
0a7de745 553 object_type, object_addr);
316670eb 554
0a7de745 555 return rv;
316670eb
A
556}
557
558kern_return_t
559mach_port_insert_member(
560 ipc_space_t task,
561 mach_port_name_t name,
562 mach_port_name_t pset)
563{
564 kern_return_t rv;
565
566 rv = _kernelrpc_mach_port_insert_member_trap(task, name, pset);
567
0a7de745 568 if (rv == MACH_SEND_INVALID_DEST) {
316670eb 569 rv = _kernelrpc_mach_port_insert_member(task, name, pset);
0a7de745 570 }
316670eb 571
0a7de745 572 return rv;
316670eb
A
573}
574
575kern_return_t
576mach_port_extract_member(
577 ipc_space_t task,
578 mach_port_name_t name,
579 mach_port_name_t pset)
580{
581 kern_return_t rv;
582
0a7de745 583 rv = _kernelrpc_mach_port_extract_member_trap(task, name, pset);
316670eb 584
0a7de745 585 if (rv == MACH_SEND_INVALID_DEST) {
316670eb 586 rv = _kernelrpc_mach_port_extract_member(task, name, pset);
0a7de745 587 }
316670eb 588
0a7de745 589 return rv;
316670eb
A
590}
591
592kern_return_t
593mach_port_get_context(
594 ipc_space_t task,
595 mach_port_name_t name,
596 mach_port_context_t *context)
597{
598 kern_return_t rv;
599 mach_vm_address_t wide_context;
600
601 rv = _kernelrpc_mach_port_get_context(task, name, &wide_context);
602
603 if (rv == KERN_SUCCESS) {
604 *context = (mach_port_context_t)wide_context;
605 }
606
0a7de745 607 return rv;
316670eb
A
608}
609
610kern_return_t
611mach_port_set_context(
612 ipc_space_t task,
613 mach_port_name_t name,
614 mach_port_context_t context)
615{
616 kern_return_t rv;
617
618 rv = _kernelrpc_mach_port_set_context(task, name, context);
619
0a7de745 620 return rv;
316670eb
A
621}
622
623kern_return_t
624mach_port_kobject(
625 ipc_space_t task,
626 mach_port_name_t name,
627 natural_t *object_type,
628 mach_vm_address_t *object_addr)
629{
630 kern_return_t rv;
631
632 rv = _kernelrpc_mach_port_kobject(task, name, object_type, object_addr);
633
0a7de745 634 return rv;
316670eb 635}
39236c6e 636
ea3f0419
A
637kern_return_t
638mach_port_kobject_description(
639 ipc_space_t task,
640 mach_port_name_t name,
641 natural_t *object_type,
642 mach_vm_address_t *object_addr,
643 kobject_description_t desc)
644{
645 kern_return_t rv;
646
647 rv = _kernelrpc_mach_port_kobject_description(task, name, object_type, object_addr, desc);
648
649 return rv;
650}
651
39236c6e
A
652kern_return_t
653mach_port_construct(
0a7de745
A
654 ipc_space_t task,
655 mach_port_options_t *options,
656 mach_port_context_t context,
657 mach_port_name_t *name)
39236c6e
A
658{
659 kern_return_t rv;
660
661 rv = _kernelrpc_mach_port_construct_trap(task, options, (uint64_t) context, name);
662
0a7de745 663 if (rv == MACH_SEND_INVALID_DEST) {
39236c6e 664 rv = _kernelrpc_mach_port_construct(task, options, (uint64_t) context, name);
0a7de745 665 }
39236c6e 666
0a7de745 667 return rv;
39236c6e
A
668}
669
670kern_return_t
671mach_port_destruct(
0a7de745
A
672 ipc_space_t task,
673 mach_port_name_t name,
674 mach_port_delta_t srdelta,
675 mach_port_context_t guard)
39236c6e
A
676{
677 kern_return_t rv;
678
679 rv = _kernelrpc_mach_port_destruct_trap(task, name, srdelta, (uint64_t) guard);
680
0a7de745 681 if (rv == MACH_SEND_INVALID_DEST) {
39236c6e 682 rv = _kernelrpc_mach_port_destruct(task, name, srdelta, (uint64_t) guard);
0a7de745 683 }
39236c6e 684
0a7de745 685 return rv;
39236c6e
A
686}
687
688kern_return_t
689mach_port_guard(
0a7de745
A
690 ipc_space_t task,
691 mach_port_name_t name,
692 mach_port_context_t guard,
693 boolean_t strict)
39236c6e
A
694{
695 kern_return_t rv;
696
697 rv = _kernelrpc_mach_port_guard_trap(task, name, (uint64_t) guard, strict);
698
0a7de745 699 if (rv == MACH_SEND_INVALID_DEST) {
39236c6e 700 rv = _kernelrpc_mach_port_guard(task, name, (uint64_t) guard, strict);
0a7de745 701 }
39236c6e 702
0a7de745 703 return rv;
39236c6e
A
704}
705
706kern_return_t
707mach_port_unguard(
0a7de745
A
708 ipc_space_t task,
709 mach_port_name_t name,
710 mach_port_context_t guard)
39236c6e
A
711{
712 kern_return_t rv;
713
714 rv = _kernelrpc_mach_port_unguard_trap(task, name, (uint64_t) guard);
715
0a7de745 716 if (rv == MACH_SEND_INVALID_DEST) {
39236c6e 717 rv = _kernelrpc_mach_port_unguard(task, name, (uint64_t) guard);
0a7de745 718 }
39236c6e 719
0a7de745 720 return rv;
39236c6e
A
721}
722
39037602
A
723extern kern_return_t
724_kernelrpc_mach_voucher_extract_attr_recipe(
0a7de745
A
725 mach_port_name_t voucher,
726 mach_voucher_attr_key_t key,
727 mach_voucher_attr_raw_recipe_t recipe,
728 mach_msg_type_number_t *recipe_size);
39037602
A
729
730kern_return_t
731mach_voucher_extract_attr_recipe(
732 mach_port_name_t voucher,
733 mach_voucher_attr_key_t key,
734 mach_voucher_attr_raw_recipe_t recipe,
735 mach_msg_type_number_t *recipe_size)
736{
737 kern_return_t rv;
738
739 rv = mach_voucher_extract_attr_recipe_trap(voucher, key, recipe, recipe_size);
740
0a7de745 741 if (rv == MACH_SEND_INVALID_DEST) {
39037602 742 rv = _kernelrpc_mach_voucher_extract_attr_recipe(voucher, key, recipe, recipe_size);
0a7de745 743 }
39037602
A
744
745 return rv;
746}
d9a64523
A
747
748
749kern_return_t
750thread_destruct_special_reply_port(
0a7de745
A
751 mach_port_name_t port,
752 thread_destruct_special_reply_port_rights_t rights)
d9a64523
A
753{
754 switch (rights) {
755 case THREAD_SPECIAL_REPLY_PORT_ALL:
756 return mach_port_destruct(mach_task_self(), port, -1, 0);
757
758 case THREAD_SPECIAL_REPLY_PORT_RECEIVE_ONLY:
759 return mach_port_destruct(mach_task_self(), port, 0, 0);
760
761 case THREAD_SPECIAL_REPLY_PORT_SEND_ONLY:
762 return mach_port_deallocate(mach_task_self(), port);
763
764 default:
765 return KERN_INVALID_ARGUMENT;
766 }
767}
cb323159
A
768
769kern_return_t
770mach_port_guard_with_flags(
771 ipc_space_t task,
772 mach_port_name_t name,
773 mach_port_context_t guard,
774 uint64_t flags)
775{
776 kern_return_t rv;
777
778 rv = _kernelrpc_mach_port_guard_with_flags(task, name, (uint64_t) guard, flags);
779
780 return rv;
781}
782
783kern_return_t
784mach_port_swap_guard(
785 ipc_space_t task,
786 mach_port_name_t name,
787 mach_port_context_t old_guard,
788 mach_port_context_t new_guard)
789{
790 kern_return_t rv;
791
792 rv = _kernelrpc_mach_port_swap_guard(task, name, (uint64_t)old_guard, (uint64_t)new_guard);
793
794 return rv;
795}