]> git.saurik.com Git - apple/security.git/blob - cdsa/cdsa_utilities/cssmerrno.cpp
Security-179.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 #include <Security/cssmerrno.h>
23 #include <Security/SecBase.h>
24 #include <Security/Authorization.h>
25 #include <Security/globalizer.h>
26 #include <stdio.h>
27 #include <map>
28
29
30 namespace Security {
31
32
33 //
34 // The compiled database of error codes
35 //
36 struct ErrorMap : public map<CSSM_RETURN, const char *> {
37 ErrorMap();
38 };
39 static ModuleNexus<ErrorMap> errorMap;
40
41 struct Mapping {
42 CSSM_RETURN error;
43 const char *name;
44 };
45
46 #include "errorcodes.gen" // include generated error tables
47
48
49 //
50 // Create the error map (the first time)
51 //
52 ErrorMap::ErrorMap()
53 {
54 for (unsigned n = 0; n < sizeof(errorList) / sizeof(errorList[0]); n++)
55 (*this)[errorList[n].error] = errorList[n].name;
56 }
57
58
59 //
60 // A perror-like form usable from C (and C++)
61 //
62 extern "C"
63 void cssmPerror(const char *how, CSSM_RETURN error)
64 {
65 if (how)
66 fprintf(stderr, "%s: %s\n", how, cssmErrorString(error).c_str());
67 else
68 fprintf(stderr, "%s\n", cssmErrorString(error).c_str());
69 }
70
71
72 //
73 // Produce a diagnostic string from a CSSM error number or exception.
74 // Small numbers are tried as convertible errors first.
75 // Unknown errors are output numerically with a note.
76 //
77 string cssmErrorString(CSSM_RETURN error)
78 {
79 if (error == CSSM_OK) {
80 return "[ok]";
81 } else if (error >= errSecErrnoBase && error <= errSecErrnoLimit) {
82 return string("UNIX[") + strerror(error - errSecErrnoBase) + "]";
83 } else if (error > 0 &&
84 int(error) < int(sizeof(convErrorList) / sizeof(convErrorList[0])) &&
85 convErrorList[error]) {
86 return string("COMMON[") + convErrorList[error] + "]";
87 } else {
88 ErrorMap::const_iterator it = errorMap().find(error);
89 if (it == errorMap().end()) {
90 char msg[80];
91 snprintf(msg, sizeof(msg), "[UNKNOWN:0x%lx=%ld]", error, error);
92 return msg;
93 } else {
94 return it->second;
95 }
96 }
97 }
98
99 string cssmErrorString(const CssmCommonError &error)
100 { return cssmErrorString(error.cssmError()); }
101
102 } // end namespace Security