#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCPrivate.h>
#include "SCPreferencesInternal.h"
#include "SCHelper_client.h"
static Boolean
__SCPreferencesApplyChanges_helper(SCPreferencesRef prefs)
{
Boolean ok;
SCPreferencesPrivateRef prefsPrivate = (SCPreferencesPrivateRef)prefs;
uint32_t status = kSCStatusOK;
if (prefsPrivate->helper_port == MACH_PORT_NULL) {
goto fail;
}
ok = _SCHelperExec(prefsPrivate->helper_port,
SCHELPER_MSG_PREFS_APPLY,
NULL,
&status,
NULL);
if (!ok) {
goto fail;
}
if (status != kSCStatusOK) {
goto error;
}
return TRUE;
fail :
if (prefsPrivate->helper_port != MACH_PORT_NULL) {
_SCHelperClose(&prefsPrivate->helper_port);
}
status = kSCStatusAccessError;
error :
_SCErrorSet(status);
return FALSE;
}
Boolean
SCPreferencesApplyChanges(SCPreferencesRef prefs)
{
Boolean ok = FALSE;
SCPreferencesPrivateRef prefsPrivate = (SCPreferencesPrivateRef)prefs;
Boolean wasLocked;
if (prefs == NULL) {
_SCErrorSet(kSCStatusNoPrefsSession);
return FALSE;
}
wasLocked = prefsPrivate->locked;
if (!wasLocked) {
if (!SCPreferencesLock(prefs, TRUE)) {
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("SCPreferencesApplyChanges SCPreferencesLock() failed"));
return FALSE;
}
}
if (prefsPrivate->authorizationData != NULL) {
ok = __SCPreferencesApplyChanges_helper(prefs);
goto done;
}
if (prefsPrivate->session == NULL) {
ok = TRUE;
} else {
ok = SCDynamicStoreNotifyValue(prefsPrivate->session, prefsPrivate->sessionKeyApply);
if (!ok) {
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("SCPreferencesApplyChanges SCDynamicStoreNotifyValue() failed"));
_SCErrorSet(kSCStatusFailed);
}
}
done :
if (!wasLocked) {
uint32_t status;
status = SCError(); (void) SCPreferencesUnlock(prefs);
_SCErrorSet(status);
}
return ok;
}