|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Copyright (c) 1995, 1994, 1993, 1992, 1991, 1990
27: * Open Software Foundation, Inc.
28: *
29: * Permission to use, copy, modify, and distribute this software and
30: * its documentation for any purpose and without fee is hereby granted,
31: * provided that the above copyright notice appears in all copies and
32: * that both the copyright notice and this permission notice appear in
33: * supporting documentation, and that the name of ("OSF") or Open Software
34: * Foundation not be used in advertising or publicity pertaining to
35: * distribution of the software without specific, written prior permission.
36: *
37: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
38: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
39: * FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL OSF BE LIABLE FOR ANY
40: * SPECIAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
41: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
42: * ACTION OF CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING
43: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE
44: */
45: /*
46: * OSF Research Institute MK6.1 (unencumbered) 1/31/1995
47: */
48: /*
49: * Mach Operating System
50: * Copyright (c) 1991,1990,1989 Carnegie Mellon University
51: * All Rights Reserved.
52: *
53: * Permission to use, copy, modify and distribute this software and its
54: * documentation is hereby granted, provided that both the copyright
55: * notice and this permission notice appear in all copies of the
56: * software, derivative works or modified versions, and any portions
57: * thereof, and that both notices appear in supporting documentation.
58: *
59: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
60: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
61: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
62: *
63: * Carnegie Mellon requests users of this software to return to
64: *
65: * Software Distribution Coordinator or [email protected]
66: * School of Computer Science
67: * Carnegie Mellon University
68: * Pittsburgh PA 15213-3890
69: *
70: * any improvements or extensions that they make and grant Carnegie Mellon
71: * the rights to redistribute these changes.
72: */
73: /*
74: * File: ipc/ipc_notify.c
75: * Author: Rich Draves
76: * Date: 1989
77: *
78: * Notification-sending functions.
79: */
80:
81: #import <mach/features.h>
82:
83: #include <mach/port.h>
84: #include <mach/message.h>
85: #include <mach/notify.h>
86: #include <kern/assert.h>
87: #include <ipc/ipc_kmsg.h>
88: #include <ipc/ipc_mqueue.h>
89: #include <ipc/ipc_notify.h>
90: #include <ipc/ipc_port.h>
91:
92: #include <ipc/ipc_machdep.h>
93:
94: /*
95: * Forward declarations
96: */
97: void ipc_notify_init_port_deleted(
98: mach_port_deleted_notification_t *n);
99:
100: void ipc_notify_init_port_destroyed(
101: mach_port_destroyed_notification_t *n);
102:
103: void ipc_notify_init_no_senders(
104: mach_no_senders_notification_t *n);
105:
106: void ipc_notify_init_send_once(
107: mach_send_once_notification_t *n);
108:
109: void ipc_notify_init_dead_name(
110: mach_dead_name_notification_t *n);
111:
112: mach_port_deleted_notification_t ipc_notify_port_deleted_template;
113: mach_port_destroyed_notification_t ipc_notify_port_destroyed_template;
114: mach_no_senders_notification_t ipc_notify_no_senders_template;
115: mach_send_once_notification_t ipc_notify_send_once_template;
116: mach_dead_name_notification_t ipc_notify_dead_name_template;
117:
118: #if MACH_IPC_COMPAT
119: notification_t ipc_notify_port_deleted_compat_template;
120: notification_t ipc_notify_msg_accepted_compat_template;
121: notification_t ipc_notify_port_destroyed_compat_template;
122:
123: /*
124: * When notification messages are received via the old
125: * msg_receive trap, the msg_type field should contain
126: * MSG_TYPE_EMERGENCY. We arrange for this by putting
127: * MSG_TYPE_EMERGENCY into msgh_reserved, which
128: * ipc_kmsg_copyout_compat copies to msg_type.
129: */
130:
131: #define NOTIFY_MSGH_RESERVED MSG_TYPE_EMERGENCY
132: #endif /* MACH_IPC_COMPAT */
133:
134: /*
135: * Routine: ipc_notify_init_port_deleted
136: * Purpose:
137: * Initialize a template for port-deleted notifications.
138: */
139:
140: void
141: ipc_notify_init_port_deleted(
142: mach_port_deleted_notification_t *n)
143: {
144: mach_msg_header_t *m = &n->not_header;
145:
146: m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0);
147: m->msgh_local_port = MACH_PORT_NULL;
148: m->msgh_remote_port = MACH_PORT_NULL;
149: m->msgh_id = MACH_NOTIFY_PORT_DELETED;
150: m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t);
151:
152: n->NDR = NDR_record;
153: n->not_port = MACH_PORT_NULL;
154: }
155:
156: #if MACH_IPC_COMPAT
157: void
158: ipc_notify_init_port_deleted_compat(
159: notification_t *n)
160: {
161: mach_msg_header_t *m = (mach_msg_header_t *)&n->notify_header;
162: mach_msg_type_t *t = (mach_msg_type_t *)&n->notify_type;
163:
164: m->msgh_bits = MACH_MSGH_BITS_OLD_FORMAT |
165: MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND, 0);
166: m->msgh_size = sizeof *n;
167: m->msgh_reserved = NOTIFY_MSGH_RESERVED;
168: m->msgh_local_port = MACH_PORT_NULL;
169: m->msgh_remote_port = MACH_PORT_NULL;
170: m->msgh_id = MACH_NOTIFY_PORT_DELETED;
171:
172: t->msgt_name = MACH_MSG_TYPE_PORT_NAME;
173: t->msgt_size = PORT_T_SIZE_IN_BITS;
174: t->msgt_number = 1;
175: t->msgt_inline = TRUE;
176: t->msgt_longform = FALSE;
177: t->msgt_deallocate = FALSE;
178: t->msgt_unused = 0;
179:
180: n->notify_port = PORT_NULL;
181: }
182: #endif /* MACH_IPC_COMPAT */
183:
184: /*
185: * Routine: ipc_notify_init_msg_accepted
186: * Purpose:
187: * Initialize a template for msg-accepted notifications.
188: */
189:
190: #if MACH_IPC_COMPAT
191: void
192: ipc_notify_init_msg_accepted_compat(
193: notification_t *n)
194: {
195: mach_msg_header_t *m = (mach_msg_header_t *)&n->notify_header;
196: mach_msg_type_t *t = (mach_msg_type_t *)&n->notify_type;
197:
198: m->msgh_bits = MACH_MSGH_BITS_OLD_FORMAT |
199: MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND, 0);
200: m->msgh_size = sizeof *n;
201: m->msgh_reserved = NOTIFY_MSGH_RESERVED;
202: m->msgh_local_port = MACH_PORT_NULL;
203: m->msgh_remote_port = MACH_PORT_NULL;
204: m->msgh_id = MACH_NOTIFY_MSG_ACCEPTED;
205:
206: t->msgt_name = MACH_MSG_TYPE_PORT_NAME;
207: t->msgt_size = PORT_T_SIZE_IN_BITS;
208: t->msgt_number = 1;
209: t->msgt_inline = TRUE;
210: t->msgt_longform = FALSE;
211: t->msgt_deallocate = FALSE;
212: t->msgt_unused = 0;
213:
214: n->notify_port = PORT_NULL;
215: }
216: #endif /* MACH_IPC_COMPAT */
217:
218: /*
219: * Routine: ipc_notify_init_port_destroyed
220: * Purpose:
221: * Initialize a template for port-destroyed notifications.
222: */
223:
224: void
225: ipc_notify_init_port_destroyed(
226: mach_port_destroyed_notification_t *n)
227: {
228: mach_msg_header_t *m = &n->not_header;
229:
230: m->msgh_bits = MACH_MSGH_BITS_COMPLEX |
231: MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0);
232: m->msgh_local_port = MACH_PORT_NULL;
233: m->msgh_remote_port = MACH_PORT_NULL;
234: m->msgh_id = MACH_NOTIFY_PORT_DESTROYED;
235: m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t);
236:
237: n->not_body.msgh_descriptor_count = 1;
238: n->not_port.disposition = MACH_MSG_TYPE_PORT_RECEIVE;
239: n->not_port.name = MACH_PORT_NULL;
240: n->not_port.type = MACH_MSG_PORT_DESCRIPTOR;
241: }
242:
243: #if MACH_IPC_COMPAT
244: void
245: ipc_notify_init_port_destroyed_compat(
246: notification_t *n)
247: {
248: mach_msg_header_t *m = (mach_msg_header_t *)&n->notify_header;
249: mach_msg_type_t *t = (mach_msg_type_t *)&n->notify_type;
250:
251: m->msgh_bits = MACH_MSGH_BITS_OLD_FORMAT | MACH_MSGH_BITS_COMPLEX |
252: MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND, 0);
253: m->msgh_size = sizeof *n;
254: m->msgh_reserved = NOTIFY_MSGH_RESERVED;
255: m->msgh_local_port = MACH_PORT_NULL;
256: m->msgh_remote_port = MACH_PORT_NULL;
257: m->msgh_id = MACH_NOTIFY_PORT_DESTROYED;
258:
259: t->msgt_name = MACH_MSG_TYPE_PORT_RECEIVE;
260: t->msgt_size = PORT_T_SIZE_IN_BITS;
261: t->msgt_number = 1;
262: t->msgt_inline = TRUE;
263: t->msgt_longform = FALSE;
264: t->msgt_deallocate = FALSE;
265: t->msgt_unused = 0;
266:
267: n->notify_port = PORT_NULL;
268: }
269: #endif /* MACH_IPC_COMPAT */
270:
271: /*
272: * Routine: ipc_notify_init_no_senders
273: * Purpose:
274: * Initialize a template for no-senders notifications.
275: */
276:
277: void
278: ipc_notify_init_no_senders(
279: mach_no_senders_notification_t *n)
280: {
281: mach_msg_header_t *m = &n->not_header;
282:
283: m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0);
284: m->msgh_local_port = MACH_PORT_NULL;
285: m->msgh_remote_port = MACH_PORT_NULL;
286: m->msgh_id = MACH_NOTIFY_NO_SENDERS;
287: m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t);
288:
289: n->NDR = NDR_record;
290: n->not_count = 0;
291: }
292:
293: /*
294: * Routine: ipc_notify_init_send_once
295: * Purpose:
296: * Initialize a template for send-once notifications.
297: */
298:
299: void
300: ipc_notify_init_send_once(
301: mach_send_once_notification_t *n)
302: {
303: mach_msg_header_t *m = &n->not_header;
304:
305: m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0);
306: m->msgh_local_port = MACH_PORT_NULL;
307: m->msgh_remote_port = MACH_PORT_NULL;
308: m->msgh_id = MACH_NOTIFY_SEND_ONCE;
309: m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t);
310: }
311:
312: /*
313: * Routine: ipc_notify_init_dead_name
314: * Purpose:
315: * Initialize a template for dead-name notifications.
316: */
317:
318: void
319: ipc_notify_init_dead_name(
320: mach_dead_name_notification_t *n)
321: {
322: mach_msg_header_t *m = &n->not_header;
323:
324: m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0);
325: m->msgh_local_port = MACH_PORT_NULL;
326: m->msgh_remote_port = MACH_PORT_NULL;
327: m->msgh_id = MACH_NOTIFY_DEAD_NAME;
328: m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t);
329:
330: n->NDR = NDR_record;
331: n->not_port = MACH_PORT_NULL;
332: }
333:
334: /*
335: * Routine: ipc_notify_init
336: * Purpose:
337: * Initialize the notification subsystem.
338: */
339:
340: void
341: ipc_notify_init(void)
342: {
343: ipc_notify_init_port_deleted(&ipc_notify_port_deleted_template);
344: ipc_notify_init_port_destroyed(&ipc_notify_port_destroyed_template);
345: ipc_notify_init_no_senders(&ipc_notify_no_senders_template);
346: ipc_notify_init_send_once(&ipc_notify_send_once_template);
347: ipc_notify_init_dead_name(&ipc_notify_dead_name_template);
348: #if MACH_IPC_COMPAT
349: ipc_notify_init_msg_accepted_compat(
350: &ipc_notify_msg_accepted_compat_template);
351: ipc_notify_init_port_deleted_compat(
352: &ipc_notify_port_deleted_compat_template);
353: ipc_notify_init_port_destroyed_compat(
354: &ipc_notify_port_destroyed_compat_template);
355: #endif /* MACH_IPC_COMPAT */
356: }
357:
358: /*
359: * Routine: ipc_notify_port_deleted
360: * Purpose:
361: * Send a port-deleted notification.
362: * Conditions:
363: * Nothing locked.
364: * Consumes a ref/soright for port.
365: */
366:
367: void
368: ipc_notify_port_deleted(
369: ipc_port_t port,
370: mach_port_t name)
371: {
372: ipc_kmsg_t kmsg;
373: mach_port_deleted_notification_t *n;
374:
375: kmsg = ikm_alloc(sizeof *n);
376: if (kmsg == IKM_NULL) {
377: printf("dropped port-deleted (0x%08x, 0x%x)\n", port, name);
378: ipc_port_release_sonce(port);
379: return;
380: }
381:
382: ikm_init(kmsg, sizeof *n);
383: kmsg->ikm_sender = KERNEL_SECURITY_ID_VALUE;
384:
385: n = (mach_port_deleted_notification_t *) &kmsg->ikm_header;
386: *n = ipc_notify_port_deleted_template;
387:
388: n->not_header.msgh_remote_port = (mach_port_t) port;
389: n->not_port = name;
390:
391: ipc_mqueue_send_always(kmsg);
392: }
393:
394: /*
395: * Routine: ipc_notify_port_destroyed
396: * Purpose:
397: * Send a port-destroyed notification.
398: * Conditions:
399: * Nothing locked.
400: * Consumes a ref/soright for port.
401: * Consumes a ref for right, which should be a receive right
402: * prepped for placement into a message. (In-transit,
403: * or in-limbo if a circularity was detected.)
404: */
405:
406: void
407: ipc_notify_port_destroyed(
408: ipc_port_t port,
409: ipc_port_t right)
410: {
411: ipc_kmsg_t kmsg;
412: mach_port_destroyed_notification_t *n;
413:
414: kmsg = ikm_alloc(sizeof *n);
415: if (kmsg == IKM_NULL) {
416: printf("dropped port-destroyed (0x%08x, 0x%08x)\n",
417: port, right);
418: ipc_port_release_sonce(port);
419: ipc_port_release_receive(right);
420: return;
421: }
422:
423: ikm_init(kmsg, sizeof *n);
424: kmsg->ikm_sender = KERNEL_SECURITY_ID_VALUE;
425:
426: n = (mach_port_destroyed_notification_t *) &kmsg->ikm_header;
427: *n = ipc_notify_port_destroyed_template;
428:
429: n->not_header.msgh_remote_port = (mach_port_t) port;
430: n->not_port.name = (mach_port_t)right;
431:
432: ipc_mqueue_send_always(kmsg);
433: }
434:
435: /*
436: * Routine: ipc_notify_no_senders
437: * Purpose:
438: * Send a no-senders notification.
439: * Conditions:
440: * Nothing locked.
441: * Consumes a ref/soright for port.
442: */
443:
444: void
445: ipc_notify_no_senders(
446: ipc_port_t port,
447: mach_port_mscount_t mscount)
448: {
449: ipc_kmsg_t kmsg;
450: mach_no_senders_notification_t *n;
451:
452: kmsg = ikm_alloc(sizeof *n);
453: if (kmsg == IKM_NULL) {
454: printf("dropped no-senders (0x%08x, %u)\n", port, mscount);
455: ipc_port_release_sonce(port);
456: return;
457: }
458:
459: ikm_init(kmsg, sizeof *n);
460: kmsg->ikm_sender = KERNEL_SECURITY_ID_VALUE;
461:
462: n = (mach_no_senders_notification_t *) &kmsg->ikm_header;
463: *n = ipc_notify_no_senders_template;
464:
465: n->not_header.msgh_remote_port = (mach_port_t) port;
466: n->not_count = mscount;
467:
468: ipc_mqueue_send_always(kmsg);
469: }
470:
471: /*
472: * Routine: ipc_notify_send_once
473: * Purpose:
474: * Send a send-once notification.
475: * Conditions:
476: * Nothing locked.
477: * Consumes a ref/soright for port.
478: */
479:
480: void
481: ipc_notify_send_once(
482: ipc_port_t port)
483: {
484: ipc_kmsg_t kmsg;
485: mach_send_once_notification_t *n;
486:
487: kmsg = ikm_alloc(sizeof *n);
488: if (kmsg == IKM_NULL) {
489: printf("dropped send-once (0x%08x)\n", port);
490: ipc_port_release_sonce(port);
491: return;
492: }
493:
494: ikm_init(kmsg, sizeof *n);
495: kmsg->ikm_sender = KERNEL_SECURITY_ID_VALUE;
496:
497: n = (mach_send_once_notification_t *) &kmsg->ikm_header;
498: *n = ipc_notify_send_once_template;
499:
500: n->not_header.msgh_remote_port = (mach_port_t) port;
501:
502: ipc_mqueue_send_always(kmsg);
503: }
504:
505: /*
506: * Routine: ipc_notify_dead_name
507: * Purpose:
508: * Send a dead-name notification.
509: * Conditions:
510: * Nothing locked.
511: * Consumes a ref/soright for port.
512: */
513:
514: void
515: ipc_notify_dead_name(
516: ipc_port_t port,
517: mach_port_t name)
518: {
519: ipc_kmsg_t kmsg;
520: mach_dead_name_notification_t *n;
521:
522: kmsg = ikm_alloc(sizeof *n);
523: if (kmsg == IKM_NULL) {
524: printf("dropped dead-name (0x%08x, 0x%x)\n", port, name);
525: ipc_port_release_sonce(port);
526: return;
527: }
528:
529: ikm_init(kmsg, sizeof *n);
530: kmsg->ikm_sender = KERNEL_SECURITY_ID_VALUE;
531:
532: n = (mach_dead_name_notification_t *) &kmsg->ikm_header;
533: *n = ipc_notify_dead_name_template;
534:
535: n->not_header.msgh_remote_port = (mach_port_t) port;
536: n->not_port = name;
537:
538: ipc_mqueue_send_always(kmsg);
539: }
540:
541: #if MACH_IPC_COMPAT
542:
543: /*
544: * Routine: ipc_notify_port_deleted_compat
545: * Purpose:
546: * Send a port-deleted notification.
547: * Sends it to a send right instead of a send-once right.
548: * Conditions:
549: * Nothing locked.
550: * Consumes a ref/sright for port.
551: */
552:
553: void
554: ipc_notify_port_deleted_compat(
555: ipc_port_t port,
556: mach_port_t name)
557: {
558: ipc_kmsg_t kmsg;
559: notification_t *n;
560:
561: kmsg = ikm_alloc(sizeof *n);
562: if (kmsg == IKM_NULL) {
563: printf("dropped port-deleted-compat (0x%08x, 0x%x)\n",
564: port, name);
565: ipc_port_release_send(port);
566: return;
567: }
568:
569: ikm_init(kmsg, sizeof *n);
570: kmsg->ikm_sender = KERNEL_SECURITY_ID_VALUE;
571:
572: n = (notification_t *) &kmsg->ikm_header;
573: *n = ipc_notify_port_deleted_compat_template;
574:
575: kmsg->ikm_header.msgh_remote_port = (mach_port_t) port;
576:
577: n->notify_port = (port_t)name;
578:
579: ipc_mqueue_send_always(kmsg);
580: }
581:
582: /*
583: * Routine: ipc_notify_msg_accepted_compat
584: * Purpose:
585: * Send a msg-accepted notification.
586: * Sends it to a send right instead of a send-once right.
587: * Conditions:
588: * Nothing locked.
589: * Consumes a ref/sright for port.
590: */
591:
592: void
593: ipc_notify_msg_accepted_compat(
594: ipc_port_t port,
595: mach_port_t name)
596: {
597: ipc_kmsg_t kmsg;
598: notification_t *n;
599:
600: kmsg = ikm_alloc(sizeof *n);
601: if (kmsg == IKM_NULL) {
602: printf("dropped msg-accepted-compat (0x%08x, 0x%x)\n",
603: port, name);
604: ipc_port_release_send(port);
605: return;
606: }
607:
608: ikm_init(kmsg, sizeof *n);
609: kmsg->ikm_sender = KERNEL_SECURITY_ID_VALUE;
610:
611: n = (notification_t *) &kmsg->ikm_header;
612: *n = ipc_notify_msg_accepted_compat_template;
613:
614: kmsg->ikm_header.msgh_remote_port = (mach_port_t) port;
615:
616: n->notify_port = (port_t)name;
617:
618: ipc_mqueue_send_always(kmsg);
619: }
620:
621: /*
622: * Routine: ipc_notify_port_destroyed_compat
623: * Purpose:
624: * Send a port-destroyed notification.
625: * Sends it to a send right instead of a send-once right.
626: * Conditions:
627: * Nothing locked.
628: * Consumes a ref/sright for port.
629: * Consumes a ref for right, which should be a receive right
630: * prepped for placement into a message. (In-transit,
631: * or in-limbo if a circularity was detected.)
632: */
633:
634: void
635: ipc_notify_port_destroyed_compat(
636: ipc_port_t port,
637: ipc_port_t right)
638: {
639: ipc_kmsg_t kmsg;
640: notification_t *n;
641:
642: kmsg = ikm_alloc(sizeof *n);
643: if (kmsg == IKM_NULL) {
644: printf("dropped port-destroyed-compat (0x%08x, 0x%08x)\n",
645: port, right);
646: ipc_port_release_send(port);
647: ipc_port_release_receive(right);
648: return;
649: }
650:
651: ikm_init(kmsg, sizeof *n);
652: kmsg->ikm_sender = KERNEL_SECURITY_ID_VALUE;
653:
654: n = (notification_t *) &kmsg->ikm_header;
655: *n = ipc_notify_port_destroyed_compat_template;
656:
657: kmsg->ikm_header.msgh_remote_port = (mach_port_t) port;
658:
659: n->notify_port = (port_t) right;
660:
661: ipc_mqueue_send_always(kmsg);
662: }
663:
664: #endif /* MACH_IPC_COMPAT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.