CSPDLTransaction.cpp [plain text]
#include "CSPDLTransaction.h"
#include <Security/SecBasePriv.h>
#include <syslog.h>
DLTransaction::DLTransaction(CSSM_DL_DB_HANDLE dldbh)
: mDldbh(dldbh), mSuccess(false), mFinalized(false), mAutoCommit(CSSM_TRUE) {
initialize();
}
DLTransaction::DLTransaction()
: mSuccess(false), mFinalized(false), mAutoCommit(CSSM_TRUE) {
}
void DLTransaction::initialize() {
Security::CssmClient::ObjectImpl::check(CSSM_DL_PassThrough(mDldbh,
CSSM_APPLEFILEDL_TOGGLE_AUTOCOMMIT,
NULL, reinterpret_cast<void **>(&mAutoCommit)));
}
DLTransaction::~DLTransaction() {
finalize();
}
void DLTransaction::success() {
mSuccess = true;
}
void DLTransaction::finalize() {
if(mFinalized) {
return;
}
if(mAutoCommit) {
if(mSuccess) {
Security::CssmClient::ObjectImpl::check(CSSM_DL_PassThrough(mDldbh,
CSSM_APPLEFILEDL_COMMIT, NULL, NULL));
CSSM_DL_PassThrough(mDldbh, CSSM_APPLEFILEDL_TOGGLE_AUTOCOMMIT,
reinterpret_cast<const void *>(mAutoCommit), NULL);
} else {
try {
CSSM_DL_PassThrough(mDldbh, CSSM_APPLEFILEDL_ROLLBACK, NULL, NULL);
CSSM_DL_PassThrough(mDldbh, CSSM_APPLEFILEDL_TOGGLE_AUTOCOMMIT,
reinterpret_cast<const void *>(mAutoCommit), NULL);
} catch(CssmError cssme) {
const char* errStr = cssmErrorString(cssme.error);
secdebugfunc("integrity", "caught CssmError during transaction rollback: %d %s", (int) cssme.error, errStr);
syslog(LOG_ERR, "ERROR: failed to rollback keychain transaction: %d %s", (int) cssme.error, errStr);
}
}
}
mFinalized = true;
}
CSPDLTransaction::CSPDLTransaction(Security::CssmClient::Db& db)
: DLTransaction(), mDb(db) {
mDb->passThrough(CSSM_APPLECSPDL_DB_GET_HANDLE, NULL,
reinterpret_cast<void **>(&mDldbh));
initialize();
}
CSPDLTransaction::~CSPDLTransaction() {
finalize();
}