#include <mach/mach.h>
#include <mach/mach_error.h>
#include <SystemConfiguration/SCD.h>
#include "config.h"
#include "SCDPrivate.h"
SCDStatus
SCDGet(SCDSessionRef session, CFStringRef key, SCDHandleRef *handle)
{
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)session;
kern_return_t status;
CFDataRef xmlKey;
xmlData_t myKeyRef;
CFIndex myKeyLen;
xmlDataOut_t xmlDataRef;
CFIndex xmlDataLen;
CFDataRef xmlData;
CFPropertyListRef data;
int newInstance;
SCDStatus scd_status;
CFStringRef xmlError;
SCDLog(LOG_DEBUG, CFSTR("SCDGet:"));
SCDLog(LOG_DEBUG, CFSTR(" key = %@"), key);
if (key == NULL) {
return SCD_INVALIDARGUMENT;
}
if ((session == NULL) || (sessionPrivate->server == MACH_PORT_NULL)) {
return SCD_NOSESSION;
}
xmlKey = CFPropertyListCreateXMLData(NULL, key);
myKeyRef = (xmlData_t)CFDataGetBytePtr(xmlKey);
myKeyLen = CFDataGetLength(xmlKey);
status = configget(sessionPrivate->server,
myKeyRef,
myKeyLen,
&xmlDataRef,
(int *)&xmlDataLen,
&newInstance,
(int *)&scd_status);
CFRelease(xmlKey);
if (status != KERN_SUCCESS) {
if (status != MACH_SEND_INVALID_DEST)
SCDLog(LOG_DEBUG, CFSTR("configget(): %s"), mach_error_string(status));
(void) mach_port_destroy(mach_task_self(), sessionPrivate->server);
sessionPrivate->server = MACH_PORT_NULL;
return SCD_NOSERVER;
}
if (scd_status != SCD_OK) {
status = vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
if (status != KERN_SUCCESS) {
SCDLog(LOG_DEBUG, CFSTR("vm_deallocate(): %s"), mach_error_string(status));
}
*handle = NULL;
return scd_status;
}
*handle = SCDHandleInit();
xmlData = CFDataCreate(NULL, xmlDataRef, xmlDataLen);
status = vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
if (status != KERN_SUCCESS) {
SCDLog(LOG_DEBUG, CFSTR("vm_deallocate(): %s"), mach_error_string(status));
}
data = CFPropertyListCreateFromXMLData(NULL,
xmlData,
kCFPropertyListImmutable,
&xmlError);
CFRelease(xmlData);
if (xmlError) {
SCDLog(LOG_DEBUG, CFSTR("CFPropertyListCreateFromXMLData() data: %s"), xmlError);
SCDHandleRelease(*handle);
return SCD_FAILED;
}
SCDHandleSetData(*handle, data);
CFRelease(data);
_SCDHandleSetInstance(*handle, newInstance);
SCDLog(LOG_DEBUG, CFSTR(" data = %@"), SCDHandleGetData(*handle));
SCDLog(LOG_DEBUG, CFSTR(" instance = %d"), SCDHandleGetInstance(*handle));
return scd_status;
}