1/* 2 * Copyright (c) 2000, 2001, 2004, 2005, 2009-2011 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 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. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24/* 25 * Modification History 26 * 27 * June 1, 2001 Allan Nathanson <ajn@apple.com> 28 * - public API conversion 29 * 30 * March 31, 2000 Allan Nathanson <ajn@apple.com> 31 * - initial revision 32 */ 33 34#include <mach/mach.h> 35#include <mach/mach_error.h> 36 37#include <SystemConfiguration/SystemConfiguration.h> 38#include <SystemConfiguration/SCPrivate.h> 39#include "SCDynamicStoreInternal.h" 40#include "config.h" /* MiG generated file */ 41 42Boolean 43SCDynamicStoreNotifySignal(SCDynamicStoreRef store, pid_t pid, int sig) 44{ 45 SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store; 46 kern_return_t status; 47 int sc_status; 48 task_t task; 49 50 if (store == NULL) { 51 /* sorry, you must provide a session */ 52 _SCErrorSet(kSCStatusNoStoreSession); 53 return FALSE; 54 } 55 56 if (storePrivate->server == MACH_PORT_NULL) { 57 /* sorry, you must have an open session to play */ 58 _SCErrorSet(kSCStatusNoStoreServer); 59 return FALSE; 60 } 61 62 if (storePrivate->notifyStatus != NotifierNotRegistered) { 63 /* sorry, you can only have one notification registered at once */ 64 _SCErrorSet(kSCStatusNotifierActive); 65 return FALSE; 66 } 67 68 status = task_for_pid(mach_task_self(), pid, &task); 69 if (status != KERN_SUCCESS) { 70 SCLog(TRUE, LOG_DEBUG, CFSTR("SCDynamicStoreNotifySignal task_for_pid(): %s"), mach_error_string(status)); 71 _SCErrorSet(status); 72 return FALSE; 73 } 74 75 retry : 76 77 status = notifyviasignal(storePrivate->server, task, sig, (int *)&sc_status); 78 79 if (__SCDynamicStoreCheckRetryAndHandleError(store, 80 status, 81 &sc_status, 82 "SCDynamicStoreNotifySignal notifyviasignal()")) { 83 goto retry; 84 } 85 86 if (status != KERN_SUCCESS) { 87 _SCErrorSet(status); 88 return FALSE; 89 } 90 91 /* set notifier active */ 92 storePrivate->notifyStatus = Using_NotifierInformViaSignal; 93 94 return TRUE; 95} 96