#include "configd.h"
#include "session.h"
#include "pattern.h"
__private_extern__
int
__SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean isRegex, Boolean internal)
{
CFNumberRef sessionNum;
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
if (_configd_verbose) {
SCLog(TRUE, LOG_DEBUG, CFSTR("__SCDynamicStoreRemoveWatchedKey:"));
SCLog(TRUE, LOG_DEBUG, CFSTR(" key = %@"), key);
SCLog(TRUE, LOG_DEBUG, CFSTR(" isRegex = %s"), isRegex ? "TRUE" : "FALSE");
}
if (!store || (storePrivate->server == MACH_PORT_NULL)) {
return kSCStatusNoStoreSession;
}
if (_configd_trace) {
SCTrace(TRUE, _configd_trace,
CFSTR("%s : %5d : %s : %@\n"),
internal ? "*watch-" : "watch- ",
storePrivate->server,
isRegex ? "pattern" : "key",
key);
}
if (isRegex) {
if (!CFSetContainsValue(storePrivate->patterns, key))
return kSCStatusNoKey;
CFSetRemoveValue(storePrivate->patterns, key);
sessionNum = CFNumberCreate(NULL, kCFNumberIntType, &storePrivate->server);
patternRemoveSession(key, sessionNum);
CFRelease(sessionNum);
} else {
if (!CFSetContainsValue(storePrivate->keys, key))
return kSCStatusNoKey;
CFSetRemoveValue(storePrivate->keys, key);
sessionNum = CFNumberCreate(NULL, kCFNumberIntType, &storePrivate->server);
_removeWatcher(sessionNum, key);
CFRelease(sessionNum);
}
return kSCStatusOK;
}
__private_extern__
kern_return_t
_notifyremove(mach_port_t server,
xmlData_t keyRef,
mach_msg_type_number_t keyLen,
int isRegex,
int *sc_status
)
{
serverSessionRef mySession = getSession(server);
CFStringRef key;
if (_configd_verbose) {
SCLog(TRUE, LOG_DEBUG, CFSTR("Remove notification key for this session."));
SCLog(TRUE, LOG_DEBUG, CFSTR(" server = %d"), server);
}
if (!_SCUnserializeString(&key, NULL, (void *)keyRef, keyLen)) {
*sc_status = kSCStatusFailed;
return KERN_SUCCESS;
}
if (!isA_CFString(key)) {
*sc_status = kSCStatusInvalidArgument;
CFRelease(key);
return KERN_SUCCESS;
}
if (!mySession) {
*sc_status = kSCStatusNoStoreSession;
CFRelease(key);
return KERN_SUCCESS;
}
*sc_status = __SCDynamicStoreRemoveWatchedKey(mySession->store,
key,
isRegex != 0,
FALSE);
CFRelease(key);
return KERN_SUCCESS;
}