1/* 2 * Copyright (c) 2000-2004,2006,2011,2013-2014 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 25// 26// cssmerrors 27// 28#include <security_cdsa_utilities/cssmerrors.h> 29#include <security_utilities/mach++.h> 30#include <Security/cssmapple.h> 31#include <Security/SecBase.h> 32 33namespace Security { 34 35 36CssmError::CssmError(CSSM_RETURN err) : error(err) 37{ 38 SECURITY_EXCEPTION_THROW_CSSM(this, err); 39} 40 41 42const char *CssmError::what() const throw () 43{ 44 return "CSSM exception"; 45} 46 47 48OSStatus CssmError::osStatus() const 49{ 50 if (error == CSSM_ERRCODE_INVALID_POINTER) 51 { 52 return errSecParam; 53 } 54 55 return error; 56} 57 58 59int CssmError::unixError() const 60{ 61 OSStatus err = osStatus(); 62 63 // embedded UNIX errno values are returned verbatim 64 if (err >= errSecErrnoBase && err <= errSecErrnoLimit) 65 return err - errSecErrnoBase; 66 67 // re-map certain CSSM errors 68 switch (err) { 69 case CSSM_ERRCODE_MEMORY_ERROR: 70 return ENOMEM; 71 case CSSMERR_APPLEDL_DISK_FULL: 72 return ENOSPC; 73 case CSSMERR_APPLEDL_QUOTA_EXCEEDED: 74 return EDQUOT; 75 case CSSMERR_APPLEDL_FILE_TOO_BIG: 76 return EFBIG; 77 default: 78 // cannot map this to errno space 79 return -1; 80 } 81} 82 83 84void CssmError::throwMe(CSSM_RETURN err) 85{ 86 throw CssmError(err); 87} 88 89 90CSSM_RETURN CssmError::merge(CSSM_RETURN error, CSSM_RETURN base) 91{ 92 if (0 < error && error < CSSM_ERRORCODE_COMMON_EXTENT) { 93 return base + error; 94 } else { 95 return error; 96 } 97} 98 99// 100// Get a CSSM_RETURN from a CommonError 101// 102CSSM_RETURN CssmError::cssmError(const CommonError &error, CSSM_RETURN base) 103{ 104 if (const CssmError *cssm = dynamic_cast<const CssmError *>(&error)) { 105 return cssmError(cssm->error, base); 106 } else if (const MachPlusPlus::Error *mach = dynamic_cast<const MachPlusPlus::Error *>(&error)) { 107 switch (mach->error) { 108 case BOOTSTRAP_UNKNOWN_SERVICE: 109 case MIG_SERVER_DIED: 110 return CSSM_ERRCODE_SERVICE_NOT_AVAILABLE; 111 default: 112 return CSSM_ERRCODE_INTERNAL_ERROR; 113 } 114 } else { 115 return error.osStatus(); 116 } 117} 118 119CSSM_RETURN CssmError::cssmError(CSSM_RETURN error, CSSM_RETURN base) 120{ 121 if (0 < error && error < CSSM_ERRORCODE_COMMON_EXTENT) { 122 return base + error; 123 } else { 124 return error; 125 } 126} 127 128 129} // namespace Security 130