#include <SystemConfiguration/SCP.h>
#include "SCPPrivate.h"
#include <SystemConfiguration/SCD.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/errno.h>
SCPStatus
SCPApply(SCPSessionRef session)
{
SCPSessionPrivateRef sessionPrivate;
SCPStatus scp_status = SCP_OK;
SCDStatus scd_status;
boolean_t wasLocked;
if (session == NULL) {
return SCP_FAILED;
}
sessionPrivate = (SCPSessionPrivateRef)session;
wasLocked = sessionPrivate->locked;
if (!wasLocked) {
scp_status = SCPLock(session, TRUE);
if (scp_status != SCD_OK) {
SCDLog(LOG_DEBUG, CFSTR(" SCPLock(): %s"), SCPError(scp_status));
return scp_status;
}
}
if (!sessionPrivate->isRoot) {
goto notRoot;
}
if (sessionPrivate->sessionKeyApply == NULL) {
sessionPrivate->sessionKeyApply = _SCPNotificationKey(sessionPrivate->prefsID,
sessionPrivate->perUser,
sessionPrivate->user,
kSCPKeyApply);
}
scd_status = SCDLock(sessionPrivate->session);
if (scd_status == SCD_OK) {
(void) SCDTouch (sessionPrivate->session, sessionPrivate->sessionKeyApply);
(void) SCDRemove(sessionPrivate->session, sessionPrivate->sessionKeyApply);
(void) SCDUnlock(sessionPrivate->session);
} else {
SCDLog(LOG_DEBUG, CFSTR(" SCDLock(): %s"), SCDError(scd_status));
scp_status = SCP_FAILED;
}
notRoot:
if (!wasLocked)
(void) SCPUnlock(session);
return scp_status;
}