#include "scutil.h"
#include "cache.h"
#include "session.h"
#include "notifications.h"
static void
reconnected(SCDynamicStoreRef store, void *info)
{
SCPrint(TRUE, stdout, CFSTR("SCDynamicStore server restarted, session reconnected\n"));
return;
}
__private_extern__
void
do_open(int argc, char **argv)
{
if (store) {
CFRelease(store);
CFRelease(watchedKeys);
CFRelease(watchedPatterns);
}
if (argc < 1) {
store = SCDynamicStoreCreate(NULL, CFSTR("scutil"), storeCallback, NULL);
} else {
CFMutableDictionaryRef options;
options = CFDictionaryCreateMutable(NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(options, kSCDynamicStoreUseSessionKeys, kCFBooleanTrue);
store = SCDynamicStoreCreateWithOptions(NULL,
CFSTR("scutil"),
options,
storeCallback,
NULL);
CFRelease(options);
}
if (store == NULL) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
return;
}
(void) SCDynamicStoreSetDisconnectCallBack(store, reconnected);
watchedKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
watchedPatterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
cache_close();
return;
}
__private_extern__
void
do_close(int argc, char **argv)
{
if (notifyRls != NULL) {
if (doDispatch) {
(void) SCDynamicStoreSetDispatchQueue(store, NULL);
} else {
CFRunLoopSourceInvalidate(notifyRls);
CFRelease(notifyRls);
}
notifyRls = NULL;
}
if (notifyRl != NULL) {
CFRunLoopStop(notifyRl);
notifyRl = NULL;
}
if (store != NULL) {
CFRelease(store);
store = NULL;
CFRelease(watchedKeys);
watchedKeys = NULL;
CFRelease(watchedPatterns);
watchedPatterns = NULL;
}
cache_close();
return;
}