#include <security_cdsa_utilities/cssmerrors.h>
#include <security_utilities/mach++.h>
#include <Security/cssmapple.h>
#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacErrors.h>
namespace Security {
CssmError::CssmError(CSSM_RETURN err) : error(err)
{
SECURITY_EXCEPTION_THROW_CSSM(this, err);
}
const char *CssmError::what() const throw ()
{
return "CSSM exception";
}
OSStatus CssmError::osStatus() const
{
if (error == CSSM_ERRCODE_INVALID_POINTER)
{
return paramErr;
}
return error;
}
int CssmError::unixError() const
{
OSStatus err = osStatus();
if (err >= errSecErrnoBase && err <= errSecErrnoLimit)
return err - errSecErrnoBase;
switch (err) {
case CSSM_ERRCODE_MEMORY_ERROR:
return ENOMEM;
case CSSMERR_APPLEDL_DISK_FULL:
return ENOSPC;
case CSSMERR_APPLEDL_QUOTA_EXCEEDED:
return EDQUOT;
case CSSMERR_APPLEDL_FILE_TOO_BIG:
return EFBIG;
default:
return -1;
}
}
void CssmError::throwMe(CSSM_RETURN err)
{
throw CssmError(err);
}
CSSM_RETURN CssmError::merge(CSSM_RETURN error, CSSM_RETURN base)
{
if (0 < error && error < CSSM_ERRORCODE_COMMON_EXTENT) {
return base + error;
} else {
return error;
}
}
CSSM_RETURN CssmError::cssmError(const CommonError &error, CSSM_RETURN base)
{
if (const CssmError *cssm = dynamic_cast<const CssmError *>(&error)) {
return cssmError(cssm->error, base);
} else if (const MachPlusPlus::Error *mach = dynamic_cast<const MachPlusPlus::Error *>(&error)) {
switch (mach->error) {
case BOOTSTRAP_UNKNOWN_SERVICE:
case MIG_SERVER_DIED:
return CSSM_ERRCODE_SERVICE_NOT_AVAILABLE;
default:
return CSSM_ERRCODE_INTERNAL_ERROR;
}
} else {
return error.osStatus();
}
}
CSSM_RETURN CssmError::cssmError(CSSM_RETURN error, CSSM_RETURN base)
{
if (0 < error && error < CSSM_ERRORCODE_COMMON_EXTENT) {
return base + error;
} else {
return error;
}
}
}