]> git.saurik.com Git - apple/configd.git/blobdiff - SystemConfiguration.fproj/SCDNotifierSetKeys.c
configd-1061.40.2.tar.gz
[apple/configd.git] / SystemConfiguration.fproj / SCDNotifierSetKeys.c
index 483e5495f5413546fb409c015732b6ca5f423bcd..4f0c286c49e08802c59c28def5e04a9f9f6d2d91 100644 (file)
@@ -1,17 +1,15 @@
 /*
- * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2009-2011, 2013, 2016, 2017, 2019 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
- * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
- * 
+ *
  * 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,
@@ -19,7 +17,7 @@
  * 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@
  */
 
  * - initial revision
  */
 
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-
-#include <SystemConfiguration/SystemConfiguration.h>
-#include <SystemConfiguration/SCPrivate.h>
 #include "SCDynamicStoreInternal.h"
 #include "config.h"            /* MiG generated file */
 
-
 Boolean
 SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef    store,
                                  CFArrayRef            keys,
@@ -53,14 +45,9 @@ SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef  store,
        xmlData_t                       myPatternsRef   = NULL; /* patterns (serialized) */
        CFIndex                         myPatternsLen   = 0;
        int                             sc_status;
+       CFMutableArrayRef               tmp;
 
-       if (_sc_verbose) {
-               SCLog(TRUE, LOG_DEBUG, CFSTR("SCDynamicStoreSetNotificationKeys:"));
-               SCLog(TRUE, LOG_DEBUG, CFSTR("  keys     = %@"), keys);
-               SCLog(TRUE, LOG_DEBUG, CFSTR("  patterns = %@"), patterns);
-       }
-
-       if (!store) {
+       if (store == NULL) {
                /* sorry, you must provide a session */
                _SCErrorSet(kSCStatusNoStoreSession);
                return FALSE;
@@ -72,7 +59,7 @@ SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef   store,
        }
 
        /* serialize the keys */
-       if (keys) {
+       if (keys != NULL) {
                if (!_SCSerialize(keys, &xmlKeys, (void **)&myKeysRef, &myKeysLen)) {
                        _SCErrorSet(kSCStatusFailed);
                        return FALSE;
@@ -80,39 +67,49 @@ SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef store,
        }
 
        /* serialize the patterns */
-       if (patterns) {
+       if (patterns != NULL) {
                if (!_SCSerialize(patterns, &xmlPatterns, (void **)&myPatternsRef, &myPatternsLen)) {
-                       CFRelease(xmlKeys);
+                       if (xmlKeys != NULL) CFRelease(xmlKeys);
                        _SCErrorSet(kSCStatusFailed);
                        return FALSE;
                }
        }
 
+
+    retry :
+
        /* send the keys and patterns, fetch the associated result from the server */
        status = notifyset(storePrivate->server,
                           myKeysRef,
-                          myKeysLen,
+                          (mach_msg_type_number_t)myKeysLen,
                           myPatternsRef,
-                          myPatternsLen,
+                          (mach_msg_type_number_t)myPatternsLen,
                           (int *)&sc_status);
 
-       /* clean up */
-       if (xmlKeys)            CFRelease(xmlKeys);
-       if (xmlPatterns)        CFRelease(xmlPatterns);
-
-       if (status != KERN_SUCCESS) {
-               if (status != MACH_SEND_INVALID_DEST)
-                       SCLog(_sc_verbose, LOG_DEBUG, CFSTR("notifyset(): %s"), mach_error_string(status));
-               (void) mach_port_destroy(mach_task_self(), storePrivate->server);
-               storePrivate->server = MACH_PORT_NULL;
-               _SCErrorSet(status);
-               return FALSE;
+       if (__SCDynamicStoreCheckRetryAndHandleError(store,
+                                                    status,
+                                                    &sc_status,
+                                                    "SCDynamicStoreSetNotificationKeys notifyset()")) {
+               goto retry;
        }
 
+       /* clean up */
+       if (xmlKeys != NULL)            CFRelease(xmlKeys);
+       if (xmlPatterns != NULL)        CFRelease(xmlPatterns);
+
        if (sc_status != kSCStatusOK) {
                _SCErrorSet(sc_status);
                return FALSE;
        }
 
+       /* in case we need to re-connect, save the keys/patterns */
+       tmp = (keys != NULL) ? CFArrayCreateMutableCopy(NULL, 0, keys) : NULL;
+       if (storePrivate->keys != NULL) CFRelease(storePrivate->keys);
+       storePrivate->keys = tmp;
+
+       tmp = (patterns != NULL) ? CFArrayCreateMutableCopy(NULL, 0, patterns) : NULL;
+       if (storePrivate->patterns != NULL) CFRelease(storePrivate->patterns);
+       storePrivate->patterns = tmp;
+
        return TRUE;
 }