SCDNotifierSetKeys.c [plain text]
#include "SCDynamicStoreInternal.h"
#include "config.h"
Boolean
SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef store,
CFArrayRef keys,
CFArrayRef patterns)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
kern_return_t status;
CFDataRef xmlKeys = NULL;
xmlData_t myKeysRef = NULL;
CFIndex myKeysLen = 0;
CFDataRef xmlPatterns = NULL;
xmlData_t myPatternsRef = NULL;
CFIndex myPatternsLen = 0;
int sc_status;
CFMutableArrayRef tmp;
if (store == NULL) {
_SCErrorSet(kSCStatusNoStoreSession);
return FALSE;
}
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return FALSE;
}
if (keys != NULL) {
if (!_SCSerialize(keys, &xmlKeys, (void **)&myKeysRef, &myKeysLen)) {
_SCErrorSet(kSCStatusFailed);
return FALSE;
}
}
if (patterns != NULL) {
if (!_SCSerialize(patterns, &xmlPatterns, (void **)&myPatternsRef, &myPatternsLen)) {
if (xmlKeys != NULL) CFRelease(xmlKeys);
_SCErrorSet(kSCStatusFailed);
return FALSE;
}
}
#ifdef VERBOSE_ACTIVITY_LOGGING
os_activity_scope(storePrivate->activity);
#endif // VERBOSE_ACTIVITY_LOGGING
retry :
status = notifyset(storePrivate->server,
myKeysRef,
(mach_msg_type_number_t)myKeysLen,
myPatternsRef,
(mach_msg_type_number_t)myPatternsLen,
(int *)&sc_status);
if (__SCDynamicStoreCheckRetryAndHandleError(store,
status,
&sc_status,
"SCDynamicStoreSetNotificationKeys notifyset()")) {
goto retry;
}
if (xmlKeys != NULL) CFRelease(xmlKeys);
if (xmlPatterns != NULL) CFRelease(xmlPatterns);
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
tmp = (keys != NULL) ? CFArrayCreateMutableCopy(NULL, 0, keys) : NULL;
if (storePrivate->keys != NULL) CFRelease(storePrivate->keys);
storePrivate->keys = tmp;
tmp = (patterns != NULL) ? CFArrayCreateMutableCopy(NULL, 0, patterns) : NULL;
if (storePrivate->patterns != NULL) CFRelease(storePrivate->patterns);
storePrivate->patterns = tmp;
return TRUE;
}