X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d7e50217d7adf6e52786a38bcaa4cd698cb9a79e..ff6e181ae92fc6f1e89841290f461d1f2f9badd9:/osfmk/ipc/ipc_notify.c?ds=sidebyside diff --git a/osfmk/ipc/ipc_notify.c b/osfmk/ipc/ipc_notify.c index e00829214..2fc670593 100644 --- a/osfmk/ipc/ipc_notify.c +++ b/osfmk/ipc/ipc_notify.c @@ -1,10 +1,8 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -60,188 +58,13 @@ * Notification-sending functions. */ -#include - #include #include -#include -#include +#include #include -#include -#include #include #include -/* - * Forward declarations - */ -void ipc_notify_init_port_deleted( - mach_port_deleted_notification_t *n); - -void ipc_notify_init_port_destroyed( - mach_port_destroyed_notification_t *n); - -void ipc_notify_init_no_senders( - mach_no_senders_notification_t *n); - -void ipc_notify_init_send_once( - mach_send_once_notification_t *n); - -void ipc_notify_init_dead_name( - mach_dead_name_notification_t *n); - -mach_port_deleted_notification_t ipc_notify_port_deleted_template; -mach_port_destroyed_notification_t ipc_notify_port_destroyed_template; -mach_no_senders_notification_t ipc_notify_no_senders_template; -mach_send_once_notification_t ipc_notify_send_once_template; -mach_dead_name_notification_t ipc_notify_dead_name_template; - -/* - * Routine: ipc_notify_init_port_deleted - * Purpose: - * Initialize a template for port-deleted notifications. - */ - -void -ipc_notify_init_port_deleted( - mach_port_deleted_notification_t *n) -{ - mach_msg_header_t *m = &n->not_header; - - m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0); - m->msgh_local_port = MACH_PORT_NULL; - m->msgh_remote_port = MACH_PORT_NULL; - m->msgh_id = MACH_NOTIFY_PORT_DELETED; - m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t); - - n->not_port = MACH_PORT_NULL; - n->NDR = NDR_record; - n->trailer.msgh_seqno = 0; - n->trailer.msgh_sender = KERNEL_SECURITY_TOKEN; - n->trailer.msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; - n->trailer.msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; -} - -/* - * Routine: ipc_notify_init_port_destroyed - * Purpose: - * Initialize a template for port-destroyed notifications. - */ - -void -ipc_notify_init_port_destroyed( - mach_port_destroyed_notification_t *n) -{ - mach_msg_header_t *m = &n->not_header; - - m->msgh_bits = MACH_MSGH_BITS_COMPLEX | - MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0); - m->msgh_local_port = MACH_PORT_NULL; - m->msgh_remote_port = MACH_PORT_NULL; - m->msgh_id = MACH_NOTIFY_PORT_DESTROYED; - m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t); - - n->not_body.msgh_descriptor_count = 1; - n->not_port.disposition = MACH_MSG_TYPE_PORT_RECEIVE; - n->not_port.name = MACH_PORT_NULL; - n->not_port.type = MACH_MSG_PORT_DESCRIPTOR; - n->trailer.msgh_seqno = 0; - n->trailer.msgh_sender = KERNEL_SECURITY_TOKEN; - n->trailer.msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; - n->trailer.msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; -} - -/* - * Routine: ipc_notify_init_no_senders - * Purpose: - * Initialize a template for no-senders notifications. - */ - -void -ipc_notify_init_no_senders( - mach_no_senders_notification_t *n) -{ - mach_msg_header_t *m = &n->not_header; - - m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0); - m->msgh_local_port = MACH_PORT_NULL; - m->msgh_remote_port = MACH_PORT_NULL; - m->msgh_id = MACH_NOTIFY_NO_SENDERS; - m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t); - - n->NDR = NDR_record; - n->trailer.msgh_seqno = 0; - n->trailer.msgh_sender = KERNEL_SECURITY_TOKEN; - n->trailer.msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; - n->trailer.msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; - n->not_count = 0; -} - -/* - * Routine: ipc_notify_init_send_once - * Purpose: - * Initialize a template for send-once notifications. - */ - -void -ipc_notify_init_send_once( - mach_send_once_notification_t *n) -{ - mach_msg_header_t *m = &n->not_header; - - m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0); - m->msgh_local_port = MACH_PORT_NULL; - m->msgh_remote_port = MACH_PORT_NULL; - m->msgh_id = MACH_NOTIFY_SEND_ONCE; - m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t); - n->trailer.msgh_seqno = 0; - n->trailer.msgh_sender = KERNEL_SECURITY_TOKEN; - n->trailer.msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; - n->trailer.msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; -} - -/* - * Routine: ipc_notify_init_dead_name - * Purpose: - * Initialize a template for dead-name notifications. - */ - -void -ipc_notify_init_dead_name( - mach_dead_name_notification_t *n) -{ - mach_msg_header_t *m = &n->not_header; - - m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0); - m->msgh_local_port = MACH_PORT_NULL; - m->msgh_remote_port = MACH_PORT_NULL; - m->msgh_id = MACH_NOTIFY_DEAD_NAME; - m->msgh_size = ((int)sizeof *n) - sizeof(mach_msg_format_0_trailer_t); - - n->not_port = MACH_PORT_NULL; - n->NDR = NDR_record; - n->trailer.msgh_seqno = 0; - n->trailer.msgh_sender = KERNEL_SECURITY_TOKEN; - n->trailer.msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; - n->trailer.msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; -} - -/* - * Routine: ipc_notify_init - * Purpose: - * Initialize the notification subsystem. - */ - -void -ipc_notify_init(void) -{ - ipc_notify_init_port_deleted(&ipc_notify_port_deleted_template); - ipc_notify_init_port_destroyed(&ipc_notify_port_destroyed_template); - ipc_notify_init_no_senders(&ipc_notify_no_senders_template); - ipc_notify_init_send_once(&ipc_notify_send_once_template); - ipc_notify_init_dead_name(&ipc_notify_dead_name_template); -} - /* * Routine: ipc_notify_port_deleted * Purpose: @@ -256,23 +79,13 @@ ipc_notify_port_deleted( ipc_port_t port, mach_port_name_t name) { - ipc_kmsg_t kmsg; - mach_port_deleted_notification_t *n; + kern_return_t kr; - kmsg = ipc_kmsg_alloc(sizeof *n); - if (kmsg == IKM_NULL) { + kr = mach_notify_port_deleted(port, name); + if (kr != KERN_SUCCESS) { printf("dropped port-deleted (0x%08x, 0x%x)\n", port, name); ipc_port_release_sonce(port); - return; } - - n = (mach_port_deleted_notification_t *) &kmsg->ikm_header; - *n = ipc_notify_port_deleted_template; - - n->not_header.msgh_remote_port = port; - n->not_port = name; - - ipc_kmsg_send_always(kmsg); } /* @@ -292,25 +105,15 @@ ipc_notify_port_destroyed( ipc_port_t port, ipc_port_t right) { - ipc_kmsg_t kmsg; - mach_port_destroyed_notification_t *n; + kern_return_t kr; - kmsg = ipc_kmsg_alloc(sizeof *n); - if (kmsg == IKM_NULL) { + kr = mach_notify_port_destroyed(port, right); + if (kr != KERN_SUCCESS) { printf("dropped port-destroyed (0x%08x, 0x%08x)\n", port, right); ipc_port_release_sonce(port); ipc_port_release_receive(right); - return; } - - n = (mach_port_destroyed_notification_t *) &kmsg->ikm_header; - *n = ipc_notify_port_destroyed_template; - - n->not_header.msgh_remote_port = port; - n->not_port.name = right; - - ipc_kmsg_send_always(kmsg); } /* @@ -327,23 +130,13 @@ ipc_notify_no_senders( ipc_port_t port, mach_port_mscount_t mscount) { - ipc_kmsg_t kmsg; - mach_no_senders_notification_t *n; + kern_return_t kr; - kmsg = ipc_kmsg_alloc(sizeof *n); - if (kmsg == IKM_NULL) { + kr = mach_notify_no_senders(port, mscount); + if (kr != KERN_SUCCESS) { printf("dropped no-senders (0x%08x, %u)\n", port, mscount); ipc_port_release_sonce(port); - return; } - - n = (mach_no_senders_notification_t *) &kmsg->ikm_header; - *n = ipc_notify_no_senders_template; - - n->not_header.msgh_remote_port = port; - n->not_count = mscount; - - ipc_kmsg_send_always(kmsg); } /* @@ -359,22 +152,13 @@ void ipc_notify_send_once( ipc_port_t port) { - ipc_kmsg_t kmsg; - mach_send_once_notification_t *n; + kern_return_t kr; - kmsg = ipc_kmsg_alloc(sizeof *n); - if (kmsg == IKM_NULL) { + kr = mach_notify_send_once(port); + if (kr != KERN_SUCCESS) { printf("dropped send-once (0x%08x)\n", port); ipc_port_release_sonce(port); - return; } - - n = (mach_send_once_notification_t *) &kmsg->ikm_header; - *n = ipc_notify_send_once_template; - - n->not_header.msgh_remote_port = port; - - ipc_kmsg_send_always(kmsg); } /* @@ -391,21 +175,11 @@ ipc_notify_dead_name( ipc_port_t port, mach_port_name_t name) { - ipc_kmsg_t kmsg; - mach_dead_name_notification_t *n; + kern_return_t kr; - kmsg = ipc_kmsg_alloc(sizeof *n); - if (kmsg == IKM_NULL) { + kr = mach_notify_dead_name(port, name); + if (kr != KERN_SUCCESS) { printf("dropped dead-name (0x%08x, 0x%x)\n", port, name); ipc_port_release_sonce(port); - return; } - - n = (mach_dead_name_notification_t *) &kmsg->ikm_header; - *n = ipc_notify_dead_name_template; - - n->not_header.msgh_remote_port = port; - n->not_port = name; - - ipc_kmsg_send_always(kmsg); }