#include "configd.h"
#include "configd_server.h"
#include "session.h"
SCDStatus
_SCDLock(SCDSessionRef session)
{
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)session;
serverSessionRef mySession;
SCDLog(LOG_DEBUG, CFSTR("_SCDLock:"));
if ((session == NULL) || (sessionPrivate->server == MACH_PORT_NULL)) {
return SCD_NOSESSION;
}
if (SCDOptionGet(NULL, kSCDOptionIsLocked)) {
return SCD_LOCKED;
}
mySession = getSession(sessionPrivate->server);
if (mySession->callerEUID != 0) {
#ifdef DEBUG
if (!SCDOptionGet(NULL, kSCDOptionDebug)) {
#endif
return SCD_EACCESS;
#ifdef DEBUG
} else {
SCDLog(LOG_DEBUG, CFSTR(" non-root access granted while debugging"));
}
#endif
}
SCDOptionSet(NULL, kSCDOptionIsLocked, TRUE);
SCDOptionSet(session, kSCDOptionIsLocked, TRUE);
if (cacheData_s) {
CFRelease(cacheData_s);
CFRelease(changedKeys_s);
CFRelease(deferredRemovals_s);
CFRelease(removedSessionKeys_s);
}
cacheData_s = CFDictionaryCreateMutableCopy(NULL, 0, cacheData);
changedKeys_s = CFSetCreateMutableCopy(NULL, 0, changedKeys);
deferredRemovals_s = CFSetCreateMutableCopy(NULL, 0, deferredRemovals);
removedSessionKeys_s = CFSetCreateMutableCopy(NULL, 0, removedSessionKeys);
CFRunLoopAddSource(CFRunLoopGetCurrent(), mySession->serverRunLoopSource, CFSTR("locked"));
return SCD_OK;
}
kern_return_t
_configlock(mach_port_t server, int *scd_status)
{
serverSessionRef mySession = getSession(server);
SCDLog(LOG_DEBUG, CFSTR("Lock configuration database."));
SCDLog(LOG_DEBUG, CFSTR(" server = %d"), server);
*scd_status = _SCDLock(mySession->session);
if (*scd_status != SCD_OK) {
SCDLog(LOG_DEBUG, CFSTR(" SCDLock(): %s"), SCDError(*scd_status));
return KERN_SUCCESS;
}
return KERN_SUCCESS;
}