#include <mach/mach.h>
#include <mach/mach_error.h>
#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCPrivate.h>
#include "SCDynamicStoreInternal.h"
#include "config.h"
CFArrayRef
SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
kern_return_t status;
CFDataRef xmlPattern;
xmlData_t myPatternRef;
CFIndex myPatternLen;
CFDataRef xmlData;
xmlDataOut_t xmlDataRef;
int xmlDataLen;
int sc_status;
CFArrayRef allKeys;
CFStringRef xmlError;
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("SCDynamicStoreCopyKeyList:"));
SCLog(_sc_verbose, LOG_DEBUG, CFSTR(" pattern = %@"), pattern);
if (!store) {
_SCErrorSet(kSCStatusNoStoreSession);
return NULL;
}
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return NULL;
}
xmlPattern = CFPropertyListCreateXMLData(NULL, pattern);
myPatternRef = (xmlData_t)CFDataGetBytePtr(xmlPattern);
myPatternLen = CFDataGetLength(xmlPattern);
status = configlist(storePrivate->server,
myPatternRef,
myPatternLen,
TRUE,
&xmlDataRef,
&xmlDataLen,
(int *)&sc_status);
CFRelease(xmlPattern);
if (status != KERN_SUCCESS) {
if (status != MACH_SEND_INVALID_DEST)
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("configlist(): %s"), mach_error_string(status));
(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);
if (status != KERN_SUCCESS) {
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("vm_deallocate(): %s"), mach_error_string(status));
}
_SCErrorSet(sc_status);
return NULL;
}
xmlData = CFDataCreate(NULL, xmlDataRef, xmlDataLen);
status = vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
if (status != KERN_SUCCESS) {
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("vm_deallocate(): %s"), mach_error_string(status));
}
allKeys = CFPropertyListCreateFromXMLData(NULL,
xmlData,
kCFPropertyListImmutable,
&xmlError);
CFRelease(xmlData);
if (!allKeys) {
if (xmlError) {
SCLog(_sc_verbose, LOG_DEBUG,
CFSTR("CFPropertyListCreateFromXMLData() list: %@"),
xmlError);
CFRelease(xmlError);
}
_SCErrorSet(kSCStatusFailed);
return NULL;
}
return allKeys;
}