SCDNotifierSetKeys.c [plain text]
#include <mach/mach.h>
#include <mach/mach_error.h>
#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCPrivate.h>
#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;
if (store == NULL) {
_SCErrorSet(kSCStatusNoStoreSession);
return FALSE;
}
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return FALSE;
}
if (keys) {
if (!_SCSerialize(keys, &xmlKeys, (void **)&myKeysRef, &myKeysLen)) {
_SCErrorSet(kSCStatusFailed);
return FALSE;
}
}
if (patterns) {
if (!_SCSerialize(patterns, &xmlPatterns, (void **)&myPatternsRef, &myPatternsLen)) {
CFRelease(xmlKeys);
_SCErrorSet(kSCStatusFailed);
return FALSE;
}
}
status = notifyset(storePrivate->server,
myKeysRef,
myKeysLen,
myPatternsRef,
myPatternsLen,
(int *)&sc_status);
if (xmlKeys) CFRelease(xmlKeys);
if (xmlPatterns) CFRelease(xmlPatterns);
if (status != KERN_SUCCESS) {
#ifdef DEBUG
if (status != MACH_SEND_INVALID_DEST)
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("SCDynamicStoreSetNotificationKeys notifyset(): %s"), mach_error_string(status));
#endif
(void) mach_port_destroy(mach_task_self(), storePrivate->server);
storePrivate->server = MACH_PORT_NULL;
_SCErrorSet(status);
return FALSE;
}
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
return TRUE;
}