#include "configd.h"
#include "configd_server.h"
#include "session.h"
__private_extern__
int
__SCDynamicStoreLock(SCDynamicStoreRef store, Boolean recursive)
{
serverSessionRef mySession;
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
if ((store == NULL) || (storePrivate->server == MACH_PORT_NULL)) {
return kSCStatusNoStoreSession;
}
if (storeLocked > 0) {
if (storePrivate->locked && recursive) {
storeLocked++;
return kSCStatusOK;
}
return kSCStatusLocked;
}
mySession = getSession(storePrivate->server);
if (!hasWriteAccess(mySession)) {
return kSCStatusAccessError;
}
if (!recursive && _configd_trace) {
SCTrace(TRUE, _configd_trace, CFSTR("lock : %5d\n"), storePrivate->server);
}
storeLocked = 1;
storePrivate->locked = TRUE;
if (storeData_s) {
CFRelease(storeData_s);
CFRelease(patternData_s);
CFRelease(changedKeys_s);
CFRelease(deferredRemovals_s);
CFRelease(removedSessionKeys_s);
}
storeData_s = CFDictionaryCreateMutableCopy(NULL, 0, storeData);
patternData_s = CFDictionaryCreateMutableCopy(NULL, 0, patternData);
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 kSCStatusOK;
}
__private_extern__
kern_return_t
_configlock(mach_port_t server, int *sc_status)
{
serverSessionRef mySession = getSession(server);
if (mySession == NULL) {
*sc_status = kSCStatusNoStoreSession;
return KERN_SUCCESS;
}
*sc_status = __SCDynamicStoreLock(mySession->store, FALSE);
if (*sc_status != kSCStatusOK) {
return KERN_SUCCESS;
}
return KERN_SUCCESS;
}