/* * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * 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 * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ /* * Modification History * * March 24, 2000 Allan Nathanson * - initial revision */ #include "configd.h" #include "session.h" __private_extern__ boolean_t notify_server(mach_msg_header_t *request, mach_msg_header_t *reply) { mach_no_senders_notification_t *Request = (mach_no_senders_notification_t *)request; mig_reply_error_t *Reply = (mig_reply_error_t *)reply; reply->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(request->msgh_bits), 0); reply->msgh_remote_port = request->msgh_remote_port; reply->msgh_size = sizeof(mig_reply_error_t); /* Minimal size: update as needed */ reply->msgh_local_port = MACH_PORT_NULL; reply->msgh_id = request->msgh_id + 100; if ((Request->not_header.msgh_id > MACH_NOTIFY_LAST) || (Request->not_header.msgh_id < MACH_NOTIFY_FIRST)) { Reply->NDR = NDR_record; Reply->RetCode = MIG_BAD_ID; return FALSE; /* if this is not a notification message */ } switch (Request->not_header.msgh_id) { case MACH_NOTIFY_NO_SENDERS : SCLog(_configd_verbose, LOG_DEBUG, CFSTR("No more senders for port %d, closing."), Request->not_header.msgh_local_port); cleanupSession(Request->not_header.msgh_local_port); (void) mach_port_mod_refs(mach_task_self(), Request->not_header.msgh_local_port, MACH_PORT_RIGHT_RECEIVE, -1); Reply->Head.msgh_bits = 0; Reply->Head.msgh_remote_port = MACH_PORT_NULL; Reply->RetCode = KERN_SUCCESS; return TRUE; default : break; } SCLog(_configd_verbose, LOG_DEBUG, CFSTR("HELP!, Received notification: port=%d, msgh_id=%d"), Request->not_header.msgh_local_port, Request->not_header.msgh_id); Reply->NDR = NDR_record; Reply->RetCode = MIG_BAD_ID; return FALSE; /* if this is not a notification we are handling */ }