#include "SCDynamicStoreInternal.h"
#include "config.h"
Boolean
SCDynamicStoreNotifyValue(SCDynamicStoreRef store,
CFStringRef key)
{
SCDynamicStorePrivateRef storePrivate;
kern_return_t status;
CFDataRef utfKey;
xmlData_t myKeyRef;
CFIndex myKeyLen;
int sc_status;
if (store == NULL) {
store = __SCDynamicStoreNullSession();
if (store == NULL) {
_SCErrorSet(kSCStatusNoStoreSession);
return FALSE;
}
}
storePrivate = (SCDynamicStorePrivateRef)store;
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return FALSE;
}
if (storePrivate->cache_active) {
if (storePrivate->cached_notifys == NULL) {
storePrivate->cached_notifys = CFArrayCreateMutable(NULL,
0,
&kCFTypeArrayCallBacks);
}
if (!CFArrayContainsValue(storePrivate->cached_notifys,
CFRangeMake(0, CFArrayGetCount(storePrivate->cached_notifys)),
key)) {
CFArrayAppendValue(storePrivate->cached_notifys, key);
}
return TRUE;
}
if (!_SCSerializeString(key, &utfKey, (void **)&myKeyRef, &myKeyLen)) {
_SCErrorSet(kSCStatusFailed);
return FALSE;
}
retry :
status = confignotify(storePrivate->server,
myKeyRef,
(mach_msg_type_number_t)myKeyLen,
(int *)&sc_status);
if (__SCDynamicStoreCheckRetryAndHandleError(store,
status,
&sc_status,
"SCDynamicStoreNotifyValue confignotify()")) {
goto retry;
}
CFRelease(utfKey);
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
return TRUE;
}