#include "configd.h"
#include "session.h"
SCDStatus
_SCDNotifierInformViaMachPort(SCDSessionRef session, mach_msg_id_t identifier, mach_port_t *port)
{
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)session;
CFStringRef sessionKey;
CFDictionaryRef info;
SCDLog(LOG_DEBUG, CFSTR("_SCDNotifierInformViaMachPort:"));
if ((session == NULL) || (sessionPrivate->server == MACH_PORT_NULL)) {
return SCD_NOSESSION;
}
if (sessionPrivate->notifyStatus != NotifierNotRegistered) {
return SCD_NOTIFIERACTIVE;
}
if (*port == MACH_PORT_NULL) {
return SCD_INVALIDARGUMENT;
}
sessionKey = CFStringCreateWithFormat(NULL, NULL, CFSTR("%d"), sessionPrivate->server);
info = CFDictionaryGetValue(sessionData, sessionKey);
CFRelease(sessionKey);
if (info && CFDictionaryContainsKey(info, kSCDChangedKeys)) {
CFNumberRef sessionNum;
if (needsNotification == NULL)
needsNotification = CFSetCreateMutable(NULL,
0,
&kCFTypeSetCallBacks);
sessionNum = CFNumberCreate(NULL, kCFNumberIntType, &sessionPrivate->server);
CFSetAddValue(needsNotification, sessionNum);
CFRelease(sessionNum);
}
return SCD_OK;
}
kern_return_t
_notifyviaport(mach_port_t server,
mach_port_t port,
mach_msg_id_t identifier,
int *scd_status
)
{
serverSessionRef mySession = getSession(server);
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)mySession->session;
SCDLog(LOG_DEBUG, CFSTR("Send mach message when a notification key changes."));
SCDLog(LOG_DEBUG, CFSTR(" server = %d"), server);
SCDLog(LOG_DEBUG, CFSTR(" port = %d"), port);
SCDLog(LOG_DEBUG, CFSTR(" message id = %d"), identifier);
if (sessionPrivate->notifyPort != MACH_PORT_NULL) {
SCDLog(LOG_DEBUG, CFSTR(" destroying old callback mach port %d"), sessionPrivate->notifyPort);
(void) mach_port_destroy(mach_task_self(), sessionPrivate->notifyPort);
}
*scd_status = _SCDNotifierInformViaMachPort(mySession->session, identifier, &port);
if (*scd_status == SCD_OK) {
sessionPrivate->notifyStatus = Using_NotifierInformViaMachPort;
sessionPrivate->notifyPort = port;
sessionPrivate->notifyPortIdentifier = identifier;
}
return KERN_SUCCESS;
}