]> git.saurik.com Git - apple/security.git/blob - cdsa/cdsa_utilities/cssmerrno.cpp
Security-54.1.tar.gz
[apple/security.git] / cdsa / cdsa_utilities / cssmerrno.cpp
1 /*
2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
3 *
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
8 * using this file.
9 *
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
16 */
17
18
19 //
20 // cssmerrno - number-to-string translation for CSSM error codes
21 //
22 #ifdef __MWERKS__
23 #define _CPP_CSSMERRNO
24 #endif
25 #include <Security/cssmerrno.h>
26 #include <Security/globalizer.h>
27 #include <stdio.h>
28 #include <map>
29
30
31 namespace Security {
32
33
34 //
35 // The compiled database of error codes
36 //
37 struct ErrorMap : public map<CSSM_RETURN, const char *> {
38 ErrorMap();
39 };
40 static ModuleNexus<ErrorMap> errorMap;
41
42 struct Mapping {
43 CSSM_RETURN error;
44 const char *name;
45 };
46
47 #include "errorcodes.gen" // include generated error tables
48
49
50 //
51 // Create the error map (the first time)
52 //
53 ErrorMap::ErrorMap()
54 {
55 for (unsigned n = 0; n < sizeof(errorList) / sizeof(errorList[0]); n++)
56 (*this)[errorList[n].error] = errorList[n].name;
57 }
58
59
60 //
61 // A perror-like form usable from C (and C++)
62 //
63 extern "C"
64 void cssmPerror(const char *how, CSSM_RETURN error)
65 {
66 if (how)
67 fprintf(stderr, "%s: %s\n", how, cssmErrorString(error).c_str());
68 else
69 fprintf(stderr, "%s\n", cssmErrorString(error).c_str());
70 }
71
72
73 //
74 // Produce a diagnostic string from a CSSM error number or exception
75 //
76 string cssmErrorString(CSSM_RETURN error)
77 {
78 if (error == CSSM_OK) {
79 return "[ok]";
80 } else if (error > 0 &&
81 int(error) < int(sizeof(convErrorList) / sizeof(convErrorList[0]))) {
82 return string("COMMON[") + convErrorList[error] + "]";
83 } else {
84 ErrorMap::const_iterator it = errorMap().find(error);
85 if (it == errorMap().end())
86 return "[UNKNOWN]";
87 else
88 return it->second;
89 }
90 }
91
92 string cssmErrorString(const CssmCommonError &error)
93 { return cssmErrorString(error.cssmError()); }
94
95 } // end namespace Security