#include <unistd.h>
#include "configd.h"
#include "session.h"
__private_extern__
int
__SCDynamicStoreNotifyCancel(SCDynamicStoreRef store)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
SCLog(_configd_verbose, LOG_DEBUG, CFSTR("__SCDynamicStoreNotifyCancel:"));
if (!store) {
return kSCStatusNoStoreSession;
}
if (storePrivate->notifyPort != MACH_PORT_NULL) {
(void) mach_port_destroy(mach_task_self(), storePrivate->notifyPort);
storePrivate->notifyPort = MACH_PORT_NULL;
}
if (storePrivate->notifyFile >= 0) {
SCLog(_configd_verbose, LOG_DEBUG, CFSTR(" closing (notification) fd %d"), storePrivate->notifyFile);
(void) close(storePrivate->notifyFile);
storePrivate->notifyFile = -1;
}
if (storePrivate->notifySignal > 0) {
(void) mach_port_destroy(mach_task_self(), storePrivate->notifySignalTask);
storePrivate->notifySignal = 0;
storePrivate->notifySignalTask = TASK_NULL;
}
if (needsNotification) {
CFNumberRef num;
num = CFNumberCreate(NULL, kCFNumberIntType, &storePrivate->server);
CFSetRemoveValue(needsNotification, num);
CFRelease(num);
if (CFSetGetCount(needsNotification) == 0) {
CFRelease(needsNotification);
needsNotification = NULL;
}
}
storePrivate->notifyStatus = NotifierNotRegistered;
return kSCStatusOK;
}
__private_extern__
kern_return_t
_notifycancel(mach_port_t server,
int *sc_status)
{
serverSessionRef mySession = getSession(server);
if (_configd_verbose) {
SCLog(TRUE, LOG_DEBUG, CFSTR("Cancel requested notifications."));
SCLog(TRUE, LOG_DEBUG, CFSTR(" server = %d"), server);
}
if (!mySession) {
*sc_status = kSCStatusNoStoreSession;
return KERN_SUCCESS;
}
*sc_status = __SCDynamicStoreNotifyCancel(mySession->store);
if (*sc_status != kSCStatusOK) {
SCLog(_configd_verbose, LOG_DEBUG, CFSTR(" __SCDynamicStoreNotifyCancel(): %s"), SCErrorString(*sc_status));
}
return KERN_SUCCESS;
}