#include "SCDynamicStoreInternal.h"
#include "config.h"
CFArrayRef
SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern)
{
SCDynamicStorePrivateRef storePrivate;
kern_return_t status;
CFDataRef utfPattern;
xmlData_t myPatternRef;
CFIndex myPatternLen;
xmlDataOut_t xmlDataRef = NULL;
mach_msg_type_number_t xmlDataLen = 0;
int sc_status;
CFArrayRef allKeys;
if (store == NULL) {
store = __SCDynamicStoreNullSession();
if (store == NULL) {
_SCErrorSet(kSCStatusNoStoreSession);
return NULL;
}
}
storePrivate = (SCDynamicStorePrivateRef)store;
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return NULL;
}
if (!_SCSerializeString(pattern, &utfPattern, (void **)&myPatternRef, &myPatternLen)) {
_SCErrorSet(kSCStatusFailed);
return NULL;
}
#ifdef VERBOSE_ACTIVITY_LOGGING
os_activity_scope(storePrivate->activity);
#endif // VERBOSE_ACTIVITY_LOGGING
retry :
status = configlist(storePrivate->server,
myPatternRef,
(mach_msg_type_number_t)myPatternLen,
TRUE,
&xmlDataRef,
&xmlDataLen,
(int *)&sc_status);
if (__SCDynamicStoreCheckRetryAndHandleError(store,
status,
&sc_status,
"SCDynamicStoreCopyKeyList configlist()")) {
goto retry;
}
CFRelease(utfPattern);
if (sc_status != kSCStatusOK) {
if (xmlDataRef != NULL) {
(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
}
_SCErrorSet(sc_status);
return NULL;
}
if (!_SCUnserialize((CFPropertyListRef *)&allKeys, NULL, xmlDataRef, xmlDataLen)) {
_SCErrorSet(kSCStatusFailed);
return NULL;
}
return allKeys;
}