#include "SCDynamicStoreInternal.h"
#include "config.h"
static void
addKey(CFMutableArrayRef *keysP, CFStringRef key)
{
if (*keysP == NULL) {
*keysP = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
}
CFArrayAppendValue(*keysP, key);
return;
}
Boolean
SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean isRegex)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
kern_return_t status;
CFDataRef utfKey;
xmlData_t myKeyRef;
CFIndex myKeyLen;
int sc_status;
if (store == NULL) {
_SCErrorSet(kSCStatusNoStoreSession);
return FALSE;
}
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return FALSE;
}
if (!_SCSerializeString(key, &utfKey, (void **)&myKeyRef, &myKeyLen)) {
_SCErrorSet(kSCStatusFailed);
return FALSE;
}
#ifdef VERBOSE_ACTIVITY_LOGGING
os_activity_scope(storePrivate->activity);
#endif // VERBOSE_ACTIVITY_LOGGING
retry :
status = notifyadd(storePrivate->server,
myKeyRef,
(mach_msg_type_number_t)myKeyLen,
isRegex,
(int *)&sc_status);
if (__SCDynamicStoreCheckRetryAndHandleError(store,
status,
&sc_status,
"SCDynamicStoreAddWatchedKey notifyadd()")) {
goto retry;
}
CFRelease(utfKey);
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
if (isRegex) {
addKey(&storePrivate->patterns, key);
} else {
addKey(&storePrivate->keys, key);
}
return TRUE;
}