]> git.saurik.com Git - apple/configd.git/blobdiff - configd.tproj/_SCD.c
configd-453.19.tar.gz
[apple/configd.git] / configd.tproj / _SCD.c
index 061b514f8d4ec2806851894ff47d2a474e92d276..bb6449735f6e517f474c85d453ea26773458772e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 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
@@ -271,7 +234,7 @@ _removeWatcher(CFNumberRef sessionNum, CFStringRef watchedKey)
 
 __private_extern__
 void
-pushNotifications()
+pushNotifications(FILE *_configd_trace)
 {
        const void                      **sessionsToNotify;
        CFIndex                         notifyCnt;
@@ -297,48 +260,33 @@ pushNotifications()
                 */
                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,
@@ -375,33 +323,39 @@ pushNotifications()
                         */
                        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;
                        }