SCDNotifierCancel.c [plain text]
#include <mach/mach.h>
#include <mach/mach_error.h>
#include <SystemConfiguration/SCD.h>
#include "config.h"
#include "SCDPrivate.h"
SCDStatus
SCDNotifierCancel(SCDSessionRef session)
{
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)session;
kern_return_t status;
SCDStatus scd_status;
SCDLog(LOG_DEBUG, CFSTR("SCDNotifierCancel:"));
if (session == NULL) {
return SCD_NOSESSION;
}
if (sessionPrivate->notifyStatus == NotifierNotRegistered) {
return SCD_OK;
}
if (sessionPrivate->callbackFunction != NULL) {
if (SCDOptionGet(session, kSCDOptionUseCFRunLoop)) {
SCDLog(LOG_DEBUG, CFSTR(" cancel callback runloop source"));
CFRunLoopRemoveSource(CFRunLoopGetCurrent(),
sessionPrivate->callbackRunLoopSource,
kCFRunLoopDefaultMode);
CFRelease(sessionPrivate->callbackRunLoopSource);
CFMachPortInvalidate(sessionPrivate->callbackPort);
CFRelease(sessionPrivate->callbackPort);
} else {
int ts;
SCDLog(LOG_DEBUG, CFSTR(" cancel callback thread"));
ts = pthread_cancel(sessionPrivate->callbackHelper);
if (ts != 0) {
SCDLog(LOG_DEBUG, CFSTR(" pthread_cancel(): %s"), strerror(ts));
}
}
sessionPrivate->callbackFunction = NULL;
sessionPrivate->callbackArgument = NULL;
sessionPrivate->callbackPort = NULL;
sessionPrivate->callbackRunLoopSource = NULL;
sessionPrivate->callbackHelper = NULL;
}
if (sessionPrivate->server == MACH_PORT_NULL) {
return SCD_NOSESSION;
}
status = notifycancel(sessionPrivate->server, (int *)&scd_status);
sessionPrivate->notifyStatus = NotifierNotRegistered;
if (status != KERN_SUCCESS) {
if (status != MACH_SEND_INVALID_DEST)
SCDLog(LOG_DEBUG, CFSTR("notifycancel(): %s"), mach_error_string(status));
(void) mach_port_destroy(mach_task_self(), sessionPrivate->server);
sessionPrivate->server = MACH_PORT_NULL;
return SCD_NOSERVER;
}
return scd_status;
}