/*
- * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2009, 2011 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
__private_extern__ CFMutableDictionaryRef sessionData = NULL;
__private_extern__ CFMutableDictionaryRef storeData = NULL;
-__private_extern__ CFMutableDictionaryRef storeData_s = NULL;
__private_extern__ CFMutableDictionaryRef patternData = NULL;
-__private_extern__ CFMutableDictionaryRef patternData_s = NULL;
__private_extern__ CFMutableSetRef changedKeys = NULL;
-__private_extern__ CFMutableSetRef changedKeys_s = NULL;
__private_extern__ CFMutableSetRef deferredRemovals = NULL;
-__private_extern__ CFMutableSetRef deferredRemovals_s = NULL;
__private_extern__ CFMutableSetRef removedSessionKeys = NULL;
-__private_extern__ CFMutableSetRef removedSessionKeys_s = NULL;
__private_extern__ CFMutableSetRef needsNotification = NULL;
-__private_extern__ int storeLocked = 0; /* > 0 if dynamic store locked */
-
-
-__private_extern__
-void
-_swapLockedStoreData()
-{
- void *temp;
-
- temp = storeData;
- storeData = storeData_s;
- storeData_s = temp;
-
- temp = patternData;
- patternData = patternData_s;
- patternData_s = temp;
-
- temp = changedKeys;
- changedKeys = changedKeys_s;
- changedKeys_s = temp;
-
- temp = deferredRemovals;
- deferredRemovals = deferredRemovals_s;
- deferredRemovals_s = temp;
-
- temp = removedSessionKeys;
- removedSessionKeys = removedSessionKeys_s;
- removedSessionKeys_s = temp;
-
- return;
-}
-
__private_extern__
void
__private_extern__
void
-pushNotifications()
+pushNotifications(FILE *_configd_trace)
{
const void **sessionsToNotify;
CFIndex notifyCnt;
*/
if ((storePrivate->notifyStatus == Using_NotifierInformViaMachPort) &&
(storePrivate->notifyPort != MACH_PORT_NULL)) {
- mach_msg_empty_send_t msg;
- mach_msg_option_t options;
- kern_return_t status;
/*
* Post notification as mach message
*/
-#ifdef DEBUG
- if (_configd_verbose) {
- SCLog(TRUE, LOG_DEBUG, CFSTR("sending mach message notification."));
- SCLog(TRUE, LOG_DEBUG, CFSTR(" port = %d"), storePrivate->notifyPort);
- SCLog(TRUE, LOG_DEBUG, CFSTR(" msgid = %d"), storePrivate->notifyPortIdentifier);
- }
-#endif /* DEBUG */
- msg.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
- msg.header.msgh_size = sizeof(msg);
- msg.header.msgh_remote_port = storePrivate->notifyPort;
- msg.header.msgh_local_port = MACH_PORT_NULL;
- msg.header.msgh_id = storePrivate->notifyPortIdentifier;
- options = MACH_SEND_TIMEOUT;
- status = mach_msg(&msg.header, /* msg */
- MACH_SEND_MSG|options, /* options */
- msg.header.msgh_size, /* send_size */
- 0, /* rcv_size */
- MACH_PORT_NULL, /* rcv_name */
- 0, /* timeout */
- MACH_PORT_NULL); /* notify */
- if (status == MACH_SEND_TIMED_OUT) {
- mach_msg_destroy(&msg.header);
+ if (_configd_trace != NULL) {
+ SCTrace(TRUE, _configd_trace,
+ CFSTR("%s : %5d : port = %d, msgid = %d\n"),
+ "-->port",
+ storePrivate->server,
+ storePrivate->notifyPort,
+ storePrivate->notifyPortIdentifier);
}
+
+ _SC_sendMachMessage(storePrivate->notifyPort, storePrivate->notifyPortIdentifier);
}
if ((storePrivate->notifyStatus == Using_NotifierInformViaFD) &&
(storePrivate->notifyFile >= 0)) {
ssize_t written;
-#ifdef DEBUG
- if (_configd_verbose) {
- SCLog(TRUE, LOG_DEBUG, CFSTR("sending (UNIX domain) socket notification"));
- SCLog(TRUE, LOG_DEBUG, CFSTR(" fd = %d"), storePrivate->notifyFile);
- SCLog(TRUE, LOG_DEBUG, CFSTR(" msgid = %d"), storePrivate->notifyFileIdentifier);
+ if (_configd_trace != NULL) {
+ SCTrace(TRUE, _configd_trace,
+ CFSTR("%s : %5d : fd = %d, msgid = %d\n"),
+ "-->fd ",
+ storePrivate->server,
+ storePrivate->notifyFile,
+ storePrivate->notifyFileIdentifier);
}
-#endif /* DEBUG */
written = write(storePrivate->notifyFile,
&storePrivate->notifyFileIdentifier,
*/
status = pid_for_task(storePrivate->notifySignalTask, &pid);
if (status == KERN_SUCCESS) {
-#ifdef DEBUG
- if (_configd_verbose) {
- SCLog(TRUE, LOG_DEBUG, CFSTR("sending signal notification"));
- SCLog(TRUE, LOG_DEBUG, CFSTR(" pid = %d"), pid);
- SCLog(TRUE, LOG_DEBUG, CFSTR(" signal = %d"), storePrivate->notifySignal);
+ if (_configd_trace != NULL) {
+ SCTrace(TRUE, _configd_trace,
+ CFSTR("%s : %5d : pid = %d, signal = sig%s (%d)\n"),
+ "-->sig ",
+ storePrivate->server,
+ pid,
+ sys_signame[storePrivate->notifySignal],
+ storePrivate->notifySignal);
}
-#endif /* DEBUG */
+
if (kill(pid, storePrivate->notifySignal) != 0) {
-#ifdef DEBUG
- SCLog(_configd_verbose, LOG_DEBUG, CFSTR("could not send signal: %s"), strerror(errno));
-#endif /* DEBUG */
- status = KERN_FAILURE;
+ if (errno != ESRCH) {
+ SCLog(TRUE, LOG_ERR,
+ CFSTR("could not send sig%s to PID %d: %s"),
+ sys_signame[storePrivate->notifySignal],
+ pid,
+ strerror(errno));
+ }
}
} else {
mach_port_type_t pt;
- if ((mach_port_type(mach_task_self(), storePrivate->notifySignalTask, &pt) == KERN_SUCCESS) &&
- (pt & MACH_PORT_TYPE_DEAD_NAME)) {
- SCLog(_configd_verbose, LOG_DEBUG, CFSTR("could not send signal, process died"));
+ __MACH_PORT_DEBUG(TRUE, "*** pushNotifications pid_for_task failed: releasing task", storePrivate->notifySignalTask);
+ if (mach_port_type(mach_task_self(), storePrivate->notifySignalTask, &pt) == KERN_SUCCESS) {
+ if ((pt & MACH_PORT_TYPE_DEAD_NAME) != 0) {
+ SCLog(TRUE, LOG_ERR, CFSTR("pushNotifications pid_for_task() failed: %s"), mach_error_string(status));
+ }
} else {
- SCLog(_configd_verbose, LOG_DEBUG, CFSTR("could not send signal: %s"), mach_error_string(status));
+ SCLog(TRUE, LOG_ERR, CFSTR("pushNotifications mach_port_type() failed: %s"), mach_error_string(status));
}
- }
- if (status != KERN_SUCCESS) {
/* don't bother with any more attempts */
- (void) mach_port_destroy(mach_task_self(), storePrivate->notifySignalTask);
+ (void) mach_port_deallocate(mach_task_self(), storePrivate->notifySignalTask);
storePrivate->notifySignal = 0;
storePrivate->notifySignalTask = TASK_NULL;
}