#include "configd.h"
#include "configd_server.h"
#include "session.h"
static serverSessionRef *sessions = NULL;
static int nSessions = 0;
serverSessionRef
getSession(mach_port_t server)
{
int i;
if (server == MACH_PORT_NULL) {
SCLog(_configd_verbose, LOG_NOTICE, CFSTR("Excuse me, why is getSession() being called with an invalid port?"));
return NULL;
}
if (nSessions > 0) {
for (i=0; i<nSessions; i++) {
serverSessionRef thisSession = sessions[i];
if (thisSession == NULL) {
continue;
} else if (thisSession->key == server) {
return thisSession;
} else if (thisSession->store &&
(((SCDynamicStorePrivateRef)thisSession->store)->notifySignalTask == server)) {
return thisSession;
}
}
}
return NULL;
}
serverSessionRef
addSession(CFMachPortRef server)
{
int i;
int n = -1;
if (nSessions <= 0) {
sessions = malloc(sizeof(serverSessionRef));
n = 0;
nSessions = 1;
} else {
for (i=0; i<nSessions; i++) {
if (sessions[i] == NULL) {
n = i;
}
}
if (n < 0) {
n = nSessions++;
sessions = realloc(sessions, ((nSessions) * sizeof(serverSessionRef)));
}
}
SCLog(_configd_verbose, LOG_DEBUG, CFSTR("Allocating new session for port %d"), CFMachPortGetPort(server));
sessions[n] = malloc(sizeof(serverSession));
sessions[n]->key = CFMachPortGetPort(server);
sessions[n]->serverPort = server;
sessions[n]->serverRunLoopSource = NULL;
sessions[n]->store = NULL;
sessions[n]->callerEUID = 1;
sessions[n]->callerEGID = 1;
return sessions[n];
}
void
removeSession(mach_port_t server)
{
int i;
serverSessionRef thisSession;
CFStringRef sessionKey;
for (i=0; i<nSessions; i++) {
thisSession = sessions[i];
if (thisSession == NULL) {
continue;
} else if (thisSession->key == server) {
sessionKey = CFStringCreateWithFormat(NULL, NULL, CFSTR("%d"), server);
CFDictionaryRemoveValue(sessionData, sessionKey);
CFRelease(sessionKey);
free(thisSession);
sessions[i] = NULL;
return;
}
}
return;
}
void
cleanupSession(mach_port_t server)
{
int i;
for (i=0; i<nSessions; i++) {
serverSessionRef thisSession = sessions[i];
if ((thisSession != NULL) && (thisSession->key == server)) {
if ((storeLocked > 0) &&
((SCDynamicStorePrivateRef)thisSession->store)->locked) {
_swapLockedStoreData();
}
(void) __SCDynamicStoreClose(&thisSession->store);
removeSession(server);
return;
}
}
return;
}
void
listSessions()
{
int i;
fprintf(stderr, "Current sessions:");
for (i=0; i<nSessions; i++) {
serverSessionRef thisSession = sessions[i];
if (thisSession == NULL) {
continue;
}
fprintf(stderr, " %d", thisSession->key);
if (thisSession->store) {
task_t task = ((SCDynamicStorePrivateRef)thisSession->store)->notifySignalTask;
if (task != TASK_NULL) {
fprintf(stderr, "/%d", task);
}
}
}
fprintf(stderr, "\n");
}