SCDNotifierCancel.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
SCDynamicStoreNotifyCancel(SCDynamicStoreRef store)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
kern_return_t status;
int sc_status;
if (store == NULL) {
_SCErrorSet(kSCStatusNoStoreSession);
return FALSE;
}
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return FALSE;
}
switch (storePrivate->notifyStatus) {
case NotifierNotRegistered :
return TRUE;
case Using_NotifierInformViaRunLoop :
CFRunLoopSourceInvalidate(storePrivate->rls);
return TRUE;
case Using_NotifierInformViaCallback :
if (storePrivate->callbackRLS != NULL) {
CFRunLoopSourceInvalidate(storePrivate->callbackRLS);
CFRelease(storePrivate->callbackRLS);
storePrivate->callbackRLS = NULL;
}
if (storePrivate->callbackPort != NULL) {
__MACH_PORT_DEBUG(TRUE, "*** SCDynamicStoreNotifyCancel", CFMachPortGetPort(storePrivate->callbackPort));
CFMachPortInvalidate(storePrivate->callbackPort);
CFRelease(storePrivate->callbackPort);
storePrivate->callbackPort = NULL;
}
storePrivate->callbackArgument = NULL;
storePrivate->callbackFunction = NULL;
break;
default :
break;
}
status = notifycancel(storePrivate->server, (int *)&sc_status);
storePrivate->notifyStatus = NotifierNotRegistered;
if (status != KERN_SUCCESS) {
if (status == MACH_SEND_INVALID_DEST) {
(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
} else {
SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyCancel notifycancel(): %s"), mach_error_string(status));
}
storePrivate->server = MACH_PORT_NULL;
_SCErrorSet(status);
return FALSE;
}
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
return TRUE;
}