#include <unistd.h>
#include "configd.h"
#include "session.h"
SCDStatus
_SCDNotifierCancel(SCDSessionRef session)
{
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)session;
SCDLog(LOG_DEBUG, CFSTR("_SCDNotifierCancel:"));
if (session == NULL) {
return SCD_NOSESSION;
}
if (sessionPrivate->notifyPort != MACH_PORT_NULL) {
(void) mach_port_destroy(mach_task_self(), sessionPrivate->notifyPort);
sessionPrivate->notifyPort = MACH_PORT_NULL;
}
if (sessionPrivate->notifyFile >= 0) {
SCDLog(LOG_DEBUG, CFSTR(" closing (notification) fd %d"), sessionPrivate->notifyFile);
(void) close(sessionPrivate->notifyFile);
sessionPrivate->notifyFile = -1;
}
if (sessionPrivate->notifySignal > 0) {
(void) mach_port_destroy(mach_task_self(), sessionPrivate->notifySignalTask);
sessionPrivate->notifySignal = 0;
sessionPrivate->notifySignalTask = TASK_NULL;
}
if (needsNotification) {
CFNumberRef num;
num = CFNumberCreate(NULL, kCFNumberIntType, &sessionPrivate->server);
CFSetRemoveValue(needsNotification, num);
CFRelease(num);
if (CFSetGetCount(needsNotification) == 0) {
CFRelease(needsNotification);
needsNotification = NULL;
}
}
sessionPrivate->notifyStatus = NotifierNotRegistered;
return SCD_OK;
}
kern_return_t
_notifycancel(mach_port_t server,
int *scd_status)
{
serverSessionRef mySession = getSession(server);
SCDLog(LOG_DEBUG, CFSTR("Cancel requested notifications."));
SCDLog(LOG_DEBUG, CFSTR(" server = %d"), server);
*scd_status = _SCDNotifierCancel(mySession->session);
if (*scd_status != SCD_OK) {
SCDLog(LOG_DEBUG, CFSTR(" SCDNotifierCancel(): %s"), SCDError(*scd_status));
}
return KERN_SUCCESS;
}