#include "configd.h"
#include "session.h"
__private_extern__
int
__SCDynamicStoreCopyNotifiedKeys(SCDynamicStoreRef store, CFArrayRef *notifierKeys)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
CFStringRef sessionKey;
CFDictionaryRef info;
CFMutableDictionaryRef newInfo;
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;
}
__private_extern__
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;
*listRef = NULL;
*listLen = 0;
if (!mySession) {
*sc_status = kSCStatusNoStoreSession;
return KERN_SUCCESS;
}
*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;
}