#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCPrivate.h>
#include "SCPreferencesInternal.h"
#include "SCHelper_client.h"
#include <unistd.h>
#include <pthread.h>
static Boolean
__SCPreferencesUnlock_helper(SCPreferencesRef prefs)
{
Boolean ok;
SCPreferencesPrivateRef prefsPrivate = (SCPreferencesPrivateRef)prefs;
uint32_t status = kSCStatusOK;
if (prefsPrivate->helper == -1) {
goto fail;
}
ok = _SCHelperExec(prefsPrivate->helper,
SCHELPER_MSG_PREFS_UNLOCK,
NULL,
&status,
NULL);
if (!ok) {
goto fail;
}
if (status != kSCStatusOK) {
goto error;
}
prefsPrivate->locked = FALSE;
return TRUE;
fail :
if (prefsPrivate->helper != -1) {
_SCHelperClose(prefsPrivate->helper);
prefsPrivate->helper = -1;
}
status = kSCStatusAccessError;
error :
_SCErrorSet(status);
return FALSE;
}
Boolean
SCPreferencesUnlock(SCPreferencesRef prefs)
{
SCPreferencesPrivateRef prefsPrivate = (SCPreferencesPrivateRef)prefs;
if (prefs == NULL) {
_SCErrorSet(kSCStatusNoPrefsSession);
return FALSE;
}
if (!prefsPrivate->locked) {
_SCErrorSet(kSCStatusNeedLock);
return FALSE;
}
if (prefsPrivate->authorizationData != NULL) {
return __SCPreferencesUnlock_helper(prefs);
}
pthread_mutex_lock(&prefsPrivate->lock);
if (prefsPrivate->lockFD != -1) {
if (prefsPrivate->lockPath != NULL) {
unlink(prefsPrivate->lockPath);
}
close(prefsPrivate->lockFD);
prefsPrivate->lockFD = -1;
}
prefsPrivate->locked = FALSE;
pthread_mutex_unlock(&prefsPrivate->lock);
return TRUE;
}