1/* 2 * Copyright (c) 2000-2004 Apple Computer, 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// Error hierarchy 27// 28#ifndef _H_UTILITIES_ERROR 29#define _H_UTILITIES_ERROR 30 31#include <AvailabilityMacros.h> 32#include <exception> 33#include <errno.h> 34#include <Security/SecBase.h> 35#include <set> 36#undef check 37 38 39namespace Security { 40 41 42// 43// Common base of Security exceptions that represent error conditions. 44// All can yield Unix or OSStatus error codes as needed, though *how* 45// is up to the subclass implementation. 46// CSSM_RETURN conversions are done externally in (???). 47// 48class CommonError : public std::exception { 49protected: 50 CommonError(); 51 CommonError(const CommonError &source); 52public: 53 virtual ~CommonError() throw (); 54 55 virtual OSStatus osStatus() const = 0; 56 virtual int unixError() const = 0; 57}; 58 59 60// 61// Genuine Unix-originated errors identified by an errno value. 62// This includes secondary sources such as pthreads. 63// 64class UnixError : public CommonError { 65protected: 66 UnixError(); 67 UnixError(int err); 68public: 69 const int error; 70 virtual OSStatus osStatus() const; 71 virtual int unixError() const; 72 virtual const char *what () const throw (); 73 74 static void check(int result) { if (result == -1) throwMe(); } 75 static void throwMe(int err = errno) __attribute__((noreturn)); 76 77 // @@@ This is a hack for the Network protocol state machine 78 static UnixError make(int err = errno) DEPRECATED_ATTRIBUTE; 79}; 80 81 82// 83// Genuine MacOS (X) errors identified by an OSStatus value. 84// Don't even think of working with OSErr values; use OSStatus. 85// 86class MacOSError : public CommonError { 87protected: 88 MacOSError(int err); 89public: 90 const int error; 91 virtual OSStatus osStatus() const; 92 virtual int unixError() const; 93 virtual const char *what () const throw (); 94 95 static void check(OSStatus status) { if (status != errSecSuccess) throwMe(status); } 96 static void throwMe(int err) __attribute__((noreturn)); 97}; 98 99typedef std::set<OSStatus> MacOSErrorSet; 100 101 102// 103// CoreFoundation errors. 104// Since CF prefers not to tell us *why* something didn't work, this 105// is not very useful - but it's better than faking it into one of the other 106// error spaces. 107// 108class CFError : public CommonError { 109protected: 110 CFError(); 111public: 112 virtual OSStatus osStatus() const; 113 virtual int unixError() const; 114 virtual const char *what () const throw (); 115 116 template <class T> 117 static void check(const T &p) { if (!p) throwMe(); } 118 119 static void throwMe() __attribute__((noreturn)); 120}; 121 122 123// Something that gets thrown when ModuleNexus creation fails 124class ModuleNexusError : public CommonError { 125protected: 126 ModuleNexusError() {} 127 128public: 129 virtual OSStatus osStatus() const; 130 virtual int unixError() const; 131 static void throwMe() __attribute__((noreturn)); 132}; 133 134} // end namespace Security 135 136 137#endif //_H_UTILITIES_ERROR 138