/*
- * 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;
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;
}