#include "configd.h"
#include "session.h"
int
__SCDynamicStoreCopyNotifiedKeys(SCDynamicStoreRef store, CFArrayRef *notifierKeys)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
CFStringRef sessionKey;
CFDictionaryRef info;
CFMutableDictionaryRef newInfo;
SCLog(_configd_verbose, LOG_DEBUG, CFSTR("__SCDynamicStoreCopyNotifiedKeys:"));
if (!store || (storePrivate->server == MACH_PORT_NULL)) {
return kSCStatusNoStoreSession;
}
sessionKey = CFStringCreateWithFormat(NULL, NULL, CFSTR("%d"), storePrivate->server);
info = CFDictionaryGetValue(sessionData, sessionKey);
if ((info == NULL) ||
(CFDictionaryContainsKey(info, kSCDChangedKeys) == FALSE)) {
CFRelease(sessionKey);
*notifierKeys = CFArrayCreate(NULL, NULL, 0, &kCFTypeArrayCallBacks);;
return kSCStatusOK;
}
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 kSCStatusOK;
}
kern_return_t
_notifychanges(mach_port_t server,
xmlDataOut_t *listRef,
mach_msg_type_number_t *listLen,
int *sc_status
)
{
serverSessionRef mySession = getSession(server);
CFArrayRef notifierKeys;
Boolean ok;
SCLog(_configd_verbose, LOG_DEBUG, CFSTR("List notification keys which have changed."));
SCLog(_configd_verbose, LOG_DEBUG, CFSTR(" server = %d"), server);
*listRef = NULL;
*listLen = 0;
*sc_status = __SCDynamicStoreCopyNotifiedKeys(mySession->store, ¬ifierKeys);
if (*sc_status != kSCStatusOK) {
return KERN_SUCCESS;
}
ok = _SCSerialize(notifierKeys, NULL, (void **)listRef, (CFIndex *)listLen);
CFRelease(notifierKeys);
if (!ok) {
*sc_status = kSCStatusFailed;
return KERN_SUCCESS;
}
return KERN_SUCCESS;
}