X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/de355530ae67247cbd0da700edb3a2a1dae884c2..21362eb3e66fd2c787aee132bce100a44d71a99c:/osfmk/UserNotification/KUNCUserNotifications.c diff --git a/osfmk/UserNotification/KUNCUserNotifications.c b/osfmk/UserNotification/KUNCUserNotifications.c index a4baa980e..f3a831af5 100644 --- a/osfmk/UserNotification/KUNCUserNotifications.c +++ b/osfmk/UserNotification/KUNCUserNotifications.c @@ -1,34 +1,43 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * 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. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * 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 OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * 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@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #include #include #include -#include +#include +#include +#include #include -#include #include +#include + #include #include #include @@ -44,9 +53,6 @@ * DEFINES AND STRUCTURES */ -UNDServerRef gUNDServer = UND_SERVER_NULL; - - struct UNDReply { decl_mutex_data(,lock) /* UNDReply lock */ int userLandNotificationKey; @@ -59,22 +65,48 @@ struct UNDReply { #define UNDReply_lock_try(reply) mutex_lock_try(&(reply)->lock) #define UNDReply_unlock(reply) mutex_unlock(&(reply)->lock) +/* forward declarations */ +void UNDReply_deallocate( + UNDReplyRef reply); + + void UNDReply_deallocate( UNDReplyRef reply) { ipc_port_t port; + UNDReply_lock(reply); port = reply->self_port; + assert(IP_VALID(port)); ipc_kobject_set(port, IKO_NULL, IKOT_NONE); reply->self_port = IP_NULL; UNDReply_unlock(reply); ipc_port_dealloc_kernel(port); - kfree((vm_offset_t)reply, sizeof(struct UNDReply)); + kfree(reply, sizeof(struct UNDReply)); return; } +static UNDServerRef +UNDServer_reference(void) +{ + UNDServerRef UNDServer; + kern_return_t kr; + + kr = host_get_user_notification_port(host_priv_self(), &UNDServer); + assert(kr == KERN_SUCCESS); + return UNDServer; +} + +static void +UNDServer_deallocate( + UNDServerRef UNDServer) +{ + if (IP_VALID(UNDServer)) + ipc_port_release_send(UNDServer); +} + /* * UND Mig Callbacks */ @@ -90,7 +122,7 @@ UNDAlertCompletedWithResult_rpc ( CFStringRef xmlError = NULL; CFDictionaryRef dict = NULL; #else - void *dict = (void *)keyRef; + const void *dict = (const void *)keyRef; #endif if (reply == UND_REPLY_NULL || !reply->inprogress) @@ -164,10 +196,10 @@ KUNCGetNotificationID() if (reply != UND_REPLY_NULL) { reply->self_port = ipc_port_alloc_kernel(); if (reply->self_port == IP_NULL) { - kfree((vm_offset_t)reply, sizeof(struct UNDReply)); + kfree(reply, sizeof(struct UNDReply)); reply = UND_REPLY_NULL; } else { - mutex_init(&reply->lock, ETAP_IO_UNDREPLY); + mutex_init(&reply->lock, 0); reply->userLandNotificationKey = -1; reply->inprogress = FALSE; ipc_kobject_set(reply->self_port, @@ -181,7 +213,17 @@ KUNCGetNotificationID() kern_return_t KUNCExecute(char executionPath[1024], int uid, int gid) { - return UNDExecute_rpc(gUNDServer, executionPath, uid, gid); + + UNDServerRef UNDServer; + + UNDServer = UNDServer_reference(); + if (IP_VALID(UNDServer)) { + kern_return_t kr; + kr = UNDExecute_rpc(UNDServer, executionPath, uid, gid); + UNDServer_deallocate(UNDServer); + return kr; + } + return MACH_SEND_INVALID_DEST; } kern_return_t KUNCUserNotificationCancel( @@ -201,10 +243,18 @@ kern_return_t KUNCUserNotificationCancel( } reply->inprogress = FALSE; - if (ulkey = reply->userLandNotificationKey) { + if ((ulkey = reply->userLandNotificationKey) != 0) { + UNDServerRef UNDServer; + reply->userLandNotificationKey = 0; UNDReply_unlock(reply); - kr = UNDCancelNotification_rpc(gUNDServer,ulkey); + + UNDServer = UNDServer_reference(); + if (IP_VALID(UNDServer)) { + kr = UNDCancelNotification_rpc(UNDServer,ulkey); + UNDServer_deallocate(UNDServer); + } else + kr = MACH_SEND_INVALID_DEST; } else { UNDReply_unlock(reply); kr = KERN_SUCCESS; @@ -215,7 +265,7 @@ kern_return_t KUNCUserNotificationCancel( kern_return_t KUNCUserNotificationDisplayNotice( - int timeout, + int noticeTimeout, unsigned flags, char *iconPath, char *soundPath, @@ -224,9 +274,13 @@ KUNCUserNotificationDisplayNotice( char *alertMessage, char *defaultButtonTitle) { - kern_return_t kr; - kr = UNDDisplayNoticeSimple_rpc(gUNDServer, - timeout, + UNDServerRef UNDServer; + + UNDServer = UNDServer_reference(); + if (IP_VALID(UNDServer)) { + kern_return_t kr; + kr = UNDDisplayNoticeSimple_rpc(UNDServer, + noticeTimeout, flags, iconPath, soundPath, @@ -234,12 +288,15 @@ KUNCUserNotificationDisplayNotice( alertHeader, alertMessage, defaultButtonTitle); - return kr; + UNDServer_deallocate(UNDServer); + return kr; + } + return MACH_SEND_INVALID_DEST; } kern_return_t KUNCUserNotificationDisplayAlert( - int timeout, + int alertTimeout, unsigned flags, char *iconPath, char *soundPath, @@ -251,10 +308,13 @@ KUNCUserNotificationDisplayAlert( char *otherButtonTitle, unsigned *responseFlags) { - kern_return_t kr; + UNDServerRef UNDServer; - kr = UNDDisplayAlertSimple_rpc(gUNDServer, - timeout, + UNDServer = UNDServer_reference(); + if (IP_VALID(UNDServer)) { + kern_return_t kr; + kr = UNDDisplayAlertSimple_rpc(UNDServer, + alertTimeout, flags, iconPath, soundPath, @@ -265,7 +325,10 @@ KUNCUserNotificationDisplayAlert( alternateButtonTitle, otherButtonTitle, responseFlags); - return kr; + UNDServer_deallocate(UNDServer); + return kr; + } + return MACH_SEND_INVALID_DEST; } kern_return_t @@ -277,11 +340,11 @@ KUNCUserNotificationDisplayFromBundle( char *messageKey, char *tokenString, KUNCUserNotificationCallBack callback, - int contextKey) + __unused int contextKey) { UNDReplyRef reply = (UNDReplyRef)id; + UNDServerRef UNDServer; ipc_port_t reply_port; - kern_return_t kr; if (reply == UND_REPLY_NULL) return KERN_INVALID_ARGUMENT; @@ -290,19 +353,26 @@ KUNCUserNotificationDisplayFromBundle( UNDReply_unlock(reply); return KERN_INVALID_ARGUMENT; } - reply->inprogress == TRUE; + reply->inprogress = TRUE; reply->callback = callback; reply_port = ipc_port_make_send(reply->self_port); UNDReply_unlock(reply); - kr = UNDDisplayCustomFromBundle_rpc(gUNDServer, + UNDServer = UNDServer_reference(); + if (IP_VALID(UNDServer)) { + kern_return_t kr; + + kr = UNDDisplayCustomFromBundle_rpc(UNDServer, reply_port, bundlePath, fileName, fileExtension, messageKey, tokenString); - return kr; + UNDServer_deallocate(UNDServer); + return kr; + } + return MACH_SEND_INVALID_DEST; } /* @@ -329,6 +399,7 @@ convert_port_to_UNDReply( reply = (UNDReplyRef) port->ip_kobject; assert(reply != UND_REPLY_NULL); ip_unlock(port); + return reply; } return UND_REPLY_NULL; } @@ -342,13 +413,7 @@ host_set_UNDServer( host_priv_t host_priv, UNDServerRef server) { - - if (host_priv == HOST_PRIV_NULL || server == UND_SERVER_NULL) - return KERN_INVALID_ARGUMENT; - if (gUNDServer != UND_SERVER_NULL) - ipc_port_dealloc_kernel(gUNDServer); - gUNDServer = server; - return KERN_SUCCESS; + return (host_set_user_notification_port(host_priv, server)); } /* @@ -358,11 +423,7 @@ host_set_UNDServer( kern_return_t host_get_UNDServer( host_priv_t host_priv, - UNDServerRef *server) + UNDServerRef *serverp) { - if (host_priv == HOST_PRIV_NULL) - return KERN_INVALID_ARGUMENT; - *server = gUNDServer; - return KERN_SUCCESS; + return (host_get_user_notification_port(host_priv, serverp)); } -