#include "configd.h"
#include "session.h"
SCDStatus
_SCDGet(SCDSessionRef session, CFStringRef key, SCDHandleRef *handle)
{
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)session;
CFDictionaryRef dict;
CFNumberRef num;
int dictInstance;
SCDLog(LOG_DEBUG, CFSTR("_SCDGet:"));
SCDLog(LOG_DEBUG, CFSTR(" key = %@"), key);
if ((session == NULL) || (sessionPrivate->server == MACH_PORT_NULL)) {
return SCD_NOSESSION;
}
dict = CFDictionaryGetValue(cacheData, key);
if ((dict == NULL) || (CFDictionaryContainsKey(dict, kSCDData) == FALSE)) {
return SCD_NOKEY;
}
*handle = SCDHandleInit();
SCDHandleSetData(*handle, CFDictionaryGetValue(dict, kSCDData));
num = CFDictionaryGetValue(dict, kSCDInstance);
(void) CFNumberGetValue(num, kCFNumberIntType, &dictInstance);
_SCDHandleSetInstance(*handle, dictInstance);
SCDLog(LOG_DEBUG, CFSTR(" data = %@"), SCDHandleGetData(*handle));
SCDLog(LOG_DEBUG, CFSTR(" instance = %d"), SCDHandleGetInstance(*handle));
return SCD_OK;
}
kern_return_t
_configget(mach_port_t server,
xmlData_t keyRef,
mach_msg_type_number_t keyLen,
xmlDataOut_t *dataRef,
mach_msg_type_number_t *dataLen,
int *newInstance,
int *scd_status
)
{
kern_return_t status;
serverSessionRef mySession = getSession(server);
CFDataRef xmlKey;
CFStringRef key;
CFDataRef xmlData;
SCDHandleRef handle;
CFStringRef xmlError;
SCDLog(LOG_DEBUG, CFSTR("Get key from configuration database."));
SCDLog(LOG_DEBUG, CFSTR(" server = %d"), server);
xmlKey = CFDataCreate(NULL, keyRef, keyLen);
status = vm_deallocate(mach_task_self(), (vm_address_t)keyRef, keyLen);
if (status != KERN_SUCCESS) {
SCDLog(LOG_DEBUG, CFSTR("vm_deallocate(): %s"), mach_error_string(status));
}
key = CFPropertyListCreateFromXMLData(NULL,
xmlKey,
kCFPropertyListImmutable,
&xmlError);
CFRelease(xmlKey);
if (xmlError) {
SCDLog(LOG_DEBUG, CFSTR("CFPropertyListCreateFromXMLData() key: %s"), xmlError);
*scd_status = SCD_FAILED;
return KERN_SUCCESS;
}
*scd_status = _SCDGet(mySession->session, key, &handle);
CFRelease(key);
if (*scd_status != SCD_OK) {
*dataRef = NULL;
*dataLen = 0;
return KERN_SUCCESS;
}
xmlData = CFPropertyListCreateXMLData(NULL, SCDHandleGetData(handle));
*dataLen = CFDataGetLength(xmlData);
status = vm_allocate(mach_task_self(), (void *)dataRef, *dataLen, TRUE);
if (status != KERN_SUCCESS) {
SCDLog(LOG_DEBUG, CFSTR("vm_allocate(): %s"), mach_error_string(status));
*scd_status = SCD_FAILED;
CFRelease(xmlData);
*dataRef = NULL;
*dataLen = 0;
return KERN_SUCCESS;
}
bcopy((char *)CFDataGetBytePtr(xmlData), *dataRef, *dataLen);
CFRelease(xmlData);
*newInstance = SCDHandleGetInstance(handle);
SCDHandleRelease(handle);
return KERN_SUCCESS;
}