#include "configd.h"
#include "session.h"
SCDStatus
_SCDNotifierGetChanges(SCDSessionRef session, CFArrayRef *notifierKeys)
{
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)session;
CFStringRef sessionKey;
CFDictionaryRef info;
CFMutableDictionaryRef newInfo;
SCDLog(LOG_DEBUG, CFSTR("_SCDNotifierGetChanges:"));
if ((session == NULL) || (sessionPrivate->server == MACH_PORT_NULL)) {
return SCD_NOSESSION;
}
sessionKey = CFStringCreateWithFormat(NULL, NULL, CFSTR("%d"), sessionPrivate->server);
info = CFDictionaryGetValue(sessionData, sessionKey);
if ((info == NULL) ||
(CFDictionaryContainsKey(info, kSCDChangedKeys) == FALSE)) {
CFRelease(sessionKey);
*notifierKeys = CFArrayCreate(NULL, NULL, 0, &kCFTypeArrayCallBacks);;
return SCD_OK;
}
newInfo = CFDictionaryCreateMutableCopy(NULL, 0, info);
*notifierKeys = CFDictionaryGetValue(newInfo, kSCDChangedKeys);
CFRetain(*notifierKeys);
CFDictionaryRemoveValue(newInfo, kSCDChangedKeys);
if (CFDictionaryGetCount(newInfo) > 0) {
CFDictionarySetValue(sessionData, sessionKey, newInfo);
} else {
CFDictionaryRemoveValue(sessionData, sessionKey);
}
CFRelease(newInfo);
CFRelease(sessionKey);
return SCD_OK;
}
kern_return_t
_notifychanges(mach_port_t server,
xmlDataOut_t *listRef,
mach_msg_type_number_t *listLen,
int *scd_status
)
{
kern_return_t status;
serverSessionRef mySession = getSession(server);
CFArrayRef notifierKeys;
CFDataRef xmlList;
SCDLog(LOG_DEBUG, CFSTR("List notification keys which have changed."));
SCDLog(LOG_DEBUG, CFSTR(" server = %d"), server);
*scd_status = _SCDNotifierGetChanges(mySession->session, ¬ifierKeys);
if (*scd_status != SCD_OK) {
*listRef = NULL;
*listLen = 0;
return KERN_SUCCESS;
}
xmlList = CFPropertyListCreateXMLData(NULL, notifierKeys);
CFRelease(notifierKeys);
*listLen = CFDataGetLength(xmlList);
status = vm_allocate(mach_task_self(), (void *)listRef, *listLen, TRUE);
if (status != KERN_SUCCESS) {
SCDLog(LOG_DEBUG, CFSTR("vm_allocate(): %s"), mach_error_string(status));
CFRelease(xmlList);
*listRef = NULL;
*listLen = 0;
*scd_status = SCD_FAILED;
return KERN_SUCCESS;
}
bcopy((char *)CFDataGetBytePtr(xmlList), *listRef, *listLen);
CFRelease(xmlList);
return KERN_SUCCESS;
}