]> git.saurik.com Git - apple/configd.git/blobdiff - SystemConfiguration.fproj/SCDList.c
configd-699.1.5.tar.gz
[apple/configd.git] / SystemConfiguration.fproj / SCDList.c
index f193b7c2dbd91d4b0933ba2890e45cf9bdb5b9da..154c93554962ef6082afe76c28cb5a4eb80d4261 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009-2011, 2013 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
 CFArrayRef
 SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern)
 {
-       SCDynamicStorePrivateRef        storePrivate = (SCDynamicStorePrivateRef)store;
+       SCDynamicStorePrivateRef        storePrivate;
        kern_return_t                   status;
-       CFDataRef                       utfPattern;     /* serialized pattern */
+       CFDataRef                       utfPattern;             /* serialized pattern */
        xmlData_t                       myPatternRef;
        CFIndex                         myPatternLen;
-       xmlDataOut_t                    xmlDataRef;     /* serialized data */
-       mach_msg_type_number_t          xmlDataLen;
+       xmlDataOut_t                    xmlDataRef      = NULL;         /* serialized data */
+       mach_msg_type_number_t          xmlDataLen      = 0;
        int                             sc_status;
        CFArrayRef                      allKeys;
 
        if (store == NULL) {
-               /* sorry, you must provide a session */
-               _SCErrorSet(kSCStatusNoStoreSession);
-               return NULL;
+               store = __SCDynamicStoreNullSession();
+               if (store == NULL) {
+                       /* sorry, you must provide a session */
+                       _SCErrorSet(kSCStatusNoStoreSession);
+                       return NULL;
+               }
        }
 
+       storePrivate = (SCDynamicStorePrivateRef)store;
        if (storePrivate->server == MACH_PORT_NULL) {
                _SCErrorSet(kSCStatusNoStoreServer);
                return NULL;
@@ -69,37 +73,31 @@ SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern)
                return NULL;
        }
 
+    retry :
+
        /* send the pattern & fetch the associated data from the server */
        status = configlist(storePrivate->server,
                            myPatternRef,
-                           myPatternLen,
+                           (mach_msg_type_number_t)myPatternLen,
                            TRUE,               /* isRegex == TRUE */
                            &xmlDataRef,
                            &xmlDataLen,
                            (int *)&sc_status);
 
+       if (__SCDynamicStoreCheckRetryAndHandleError(store,
+                                                    status,
+                                                    &sc_status,
+                                                    "SCDynamicStoreCopyKeyList configlist()")) {
+               goto retry;
+       }
+
        /* clean up */
        CFRelease(utfPattern);
 
-       if (status != KERN_SUCCESS) {
-#ifdef DEBUG
-               if (status != MACH_SEND_INVALID_DEST)
-                       SCLog(_sc_verbose, LOG_DEBUG, CFSTR("SCDynamicStoreCopyKeyList configlist(): %s"), mach_error_string(status));
-#endif /* DEBUG */
-               (void) mach_port_destroy(mach_task_self(), storePrivate->server);
-               storePrivate->server = MACH_PORT_NULL;
-               _SCErrorSet(status);
-               return NULL;
-       }
-
        if (sc_status != kSCStatusOK) {
-               status = vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
-#ifdef DEBUG
-               if (status != KERN_SUCCESS) {
-                       SCLog(TRUE, LOG_DEBUG, CFSTR("SCDynamicStoreCopyKeyList vm_deallocate(): %s"), mach_error_string(status));
-                       /* non-fatal???, proceed */
+               if (xmlDataRef != NULL) {
+                       (void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
                }
-#endif /* DEBUG */
                _SCErrorSet(sc_status);
                return NULL;
        }