#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)) {
SC_log(LOG_INFO, "SCPreferencesLock() failed");
return FALSE;
}
}
if (prefsPrivate->authorizationData != NULL) {
ok = __SCPreferencesApplyChanges_helper(prefs);
goto done;
}
SC_log(LOG_INFO, "SCPreferences() apply: %s",
prefsPrivate->newPath ? prefsPrivate->newPath : prefsPrivate->path);
ok = SCDynamicStoreNotifyValue(NULL, prefsPrivate->sessionKeyApply);
if (!ok) {
SC_log(LOG_INFO, "SCDynamicStoreNotifyValue() failed");
_SCErrorSet(kSCStatusFailed);
}
done :
if (!wasLocked) {
uint32_t status;
status = SCError(); (void) SCPreferencesUnlock(prefs);
_SCErrorSet(status);
}
return ok;
}