1 /* status-table.c - Status codes from gnupg.
2 * Copyright (C) 2000 Werner Koch (dd9jn)
3 * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2012 g10 Code GmbH
4 *
5 * This file is part of GPGME.
6 *
7 * GPGME is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as
9 * published by the Free Software Foundation; either version 2.1 of
10 * the License, or (at your option) any later version.
11 *
12 * GPGME is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this program; if not, see <https://gnu.org/licenses/>.
19 * SPDX-License-Identifier: LGPL-2.1-or-later
20 */
21
22 #if HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdlib.h>
27 #include <string.h>
28
29 #include "util.h"
30
31 struct status_table_s {
32 const char *name;
33 gpgme_status_code_t code;
34 };
35
36
37 /* Lexicographically sorted ('_' comes after any letter). You can use
38 the Emacs command M-x sort-lines. But don't sweat it, the table is
39 sorted at start up, too. */
40 static struct status_table_s status_table[] =
41 {
42 { "ABORT", GPGME_STATUS_ABORT },
43 { "ALREADY_SIGNED", GPGME_STATUS_ALREADY_SIGNED },
44 { "ATTRIBUTE", GPGME_STATUS_ATTRIBUTE },
45 { "BACKUP_KEY_CREATED", GPGME_STATUS_BACKUP_KEY_CREATED },
46 { "BADARMOR", GPGME_STATUS_BADARMOR },
47 { "BADMDC", GPGME_STATUS_BADMDC },
48 { "BADSIG", GPGME_STATUS_BADSIG },
49 { "BAD_PASSPHRASE", GPGME_STATUS_BAD_PASSPHRASE },
50 { "BEGIN_DECRYPTION", GPGME_STATUS_BEGIN_DECRYPTION },
51 { "BEGIN_ENCRYPTION", GPGME_STATUS_BEGIN_ENCRYPTION },
52 { "BEGIN_SIGNING", GPGME_STATUS_BEGIN_SIGNING },
53 { "BEGIN_STREAM", GPGME_STATUS_BEGIN_STREAM },
54 { "CANCELED_BY_USER", GPGME_STATUS_CANCELED_BY_USER },
55 { "CARDCTRL", GPGME_STATUS_CARDCTRL },
56 { "DECRYPTION_FAILED", GPGME_STATUS_DECRYPTION_FAILED },
57 { "DECRYPTION_INFO", GPGME_STATUS_DECRYPTION_INFO },
58 { "DECRYPTION_OKAY", GPGME_STATUS_DECRYPTION_OKAY },
59 { "DELETE_PROBLEM", GPGME_STATUS_DELETE_PROBLEM },
60 { "DECRYPTION_COMPLIANCE_MODE", GPGME_STATUS_DECRYPTION_COMPLIANCE_MODE },
61 { "ENC_TO", GPGME_STATUS_ENC_TO },
62 { "END_DECRYPTION", GPGME_STATUS_END_DECRYPTION },
63 { "END_ENCRYPTION", GPGME_STATUS_END_ENCRYPTION },
64 { "END_STREAM", GPGME_STATUS_END_STREAM },
65 { "ENTER", GPGME_STATUS_ENTER },
66 { "ERRMDC", GPGME_STATUS_ERRMDC },
67 { "ERROR", GPGME_STATUS_ERROR },
68 { "ERRSIG", GPGME_STATUS_ERRSIG },
69 { "EXPKEYSIG", GPGME_STATUS_EXPKEYSIG },
70 { "EXPSIG", GPGME_STATUS_EXPSIG },
71 { "FAILURE", GPGME_STATUS_FAILURE },
72 { "FILE_DONE", GPGME_STATUS_FILE_DONE },
73 { "FILE_ERROR", GPGME_STATUS_FILE_ERROR },
74 { "FILE_START", GPGME_STATUS_FILE_START },
75 { "GET_BOOL", GPGME_STATUS_GET_BOOL },
76 { "GET_HIDDEN", GPGME_STATUS_GET_HIDDEN },
77 { "GET_LINE", GPGME_STATUS_GET_LINE },
78 { "GOODMDC", GPGME_STATUS_GOODMDC },
79 { "GOODSIG", GPGME_STATUS_GOODSIG },
80 { "GOOD_PASSPHRASE", GPGME_STATUS_GOOD_PASSPHRASE },
81 { "GOT_IT", GPGME_STATUS_GOT_IT },
82 { "IMPORTED", GPGME_STATUS_IMPORTED },
83 { "IMPORT_OK", GPGME_STATUS_IMPORT_OK },
84 { "IMPORT_PROBLEM", GPGME_STATUS_IMPORT_PROBLEM },
85 { "IMPORT_RES", GPGME_STATUS_IMPORT_RES },
86 { "INQUIRE_MAXLEN", GPGME_STATUS_INQUIRE_MAXLEN },
87 { "INV_RECP", GPGME_STATUS_INV_RECP },
88 { "INV_SGNR", GPGME_STATUS_INV_SGNR },
89 { "KEYEXPIRED", GPGME_STATUS_KEYEXPIRED },
90 { "KEYREVOKED", GPGME_STATUS_KEYREVOKED },
91 { "KEY_CONSIDERED", GPGME_STATUS_KEY_CONSIDERED },
92 { "KEY_CREATED", GPGME_STATUS_KEY_CREATED },
93 { "KEY_NOT_CREATED", GPGME_STATUS_KEY_NOT_CREATED },
94 { "LEAVE", GPGME_STATUS_LEAVE },
95 { "MISSING_PASSPHRASE", GPGME_STATUS_MISSING_PASSPHRASE },
96 { "MOUNTPOINT", GPGME_STATUS_MOUNTPOINT },
97 { "NEED_PASSPHRASE", GPGME_STATUS_NEED_PASSPHRASE },
98 { "NEED_PASSPHRASE_PIN", GPGME_STATUS_NEED_PASSPHRASE_PIN },
99 { "NEED_PASSPHRASE_SYM", GPGME_STATUS_NEED_PASSPHRASE_SYM },
100 { "NEWSIG", GPGME_STATUS_NEWSIG },
101 { "NODATA", GPGME_STATUS_NODATA },
102 { "NOTATION_DATA", GPGME_STATUS_NOTATION_DATA },
103 { "NOTATION_FLAGS", GPGME_STATUS_NOTATION_FLAGS },
104 { "NOTATION_NAME", GPGME_STATUS_NOTATION_NAME },
105 { "NO_PUBKEY", GPGME_STATUS_NO_PUBKEY },
106 { "NO_RECP", GPGME_STATUS_NO_RECP },
107 { "NO_SECKEY", GPGME_STATUS_NO_SECKEY },
108 { "NO_SGNR", GPGME_STATUS_NO_SGNR },
109 { "PINENTRY_LAUNCHED", GPGME_STATUS_PINENTRY_LAUNCHED},
110 { "PKA_TRUST_BAD", GPGME_STATUS_PKA_TRUST_BAD },
111 { "PKA_TRUST_GOOD", GPGME_STATUS_PKA_TRUST_GOOD },
112 { "PLAINTEXT", GPGME_STATUS_PLAINTEXT },
113 { "PLAINTEXT_LENGTH", GPGME_STATUS_PLAINTEXT_LENGTH },
114 { "POLICY_URL", GPGME_STATUS_POLICY_URL },
115 { "PROGRESS", GPGME_STATUS_PROGRESS },
116 { "REVKEYSIG", GPGME_STATUS_REVKEYSIG },
117 { "RSA_OR_IDEA", GPGME_STATUS_RSA_OR_IDEA },
118 { "SC_OP_FAILURE", GPGME_STATUS_SC_OP_FAILURE },
119 { "SC_OP_SUCCESS", GPGME_STATUS_SC_OP_SUCCESS },
120 { "SESSION_KEY", GPGME_STATUS_SESSION_KEY },
121 { "SHM_GET", GPGME_STATUS_SHM_GET },
122 { "SHM_GET_BOOL", GPGME_STATUS_SHM_GET_BOOL },
123 { "SHM_GET_HIDDEN", GPGME_STATUS_SHM_GET_HIDDEN },
124 { "SHM_INFO", GPGME_STATUS_SHM_INFO },
125 { "SIGEXPIRED", GPGME_STATUS_SIGEXPIRED },
126 { "SIG_CREATED", GPGME_STATUS_SIG_CREATED },
127 { "SIG_ID", GPGME_STATUS_SIG_ID },
128 { "SIG_SUBPACKET", GPGME_STATUS_SIG_SUBPACKET },
129 { "SUCCESS", GPGME_STATUS_SUCCESS },
130 { "TOFU_STATS", GPGME_STATUS_TOFU_STATS },
131 { "TOFU_STATS_LONG", GPGME_STATUS_TOFU_STATS_LONG },
132 { "TOFU_USER", GPGME_STATUS_TOFU_USER },
133 { "TRUNCATED", GPGME_STATUS_TRUNCATED },
134 { "TRUST_FULLY", GPGME_STATUS_TRUST_FULLY },
135 { "TRUST_MARGINAL", GPGME_STATUS_TRUST_MARGINAL },
136 { "TRUST_NEVER", GPGME_STATUS_TRUST_NEVER },
137 { "TRUST_ULTIMATE", GPGME_STATUS_TRUST_ULTIMATE },
138 { "TRUST_UNDEFINED", GPGME_STATUS_TRUST_UNDEFINED },
139 { "UNEXPECTED", GPGME_STATUS_UNEXPECTED },
140 { "USERID_HINT", GPGME_STATUS_USERID_HINT },
141 { "VALIDSIG", GPGME_STATUS_VALIDSIG },
142 { "VERIFICATION_COMPLIANCE_MODE", GPGME_STATUS_VERIFICATION_COMPLIANCE_MODE },
143 {NULL, 0}
144 };
145
146
147 static int
status_cmp(const void * ap,const void * bp)148 status_cmp (const void *ap, const void *bp)
149 {
150 const struct status_table_s *a = ap;
151 const struct status_table_s *b = bp;
152
153 return strcmp (a->name, b->name);
154 }
155
156
157 void
_gpgme_status_init(void)158 _gpgme_status_init (void)
159 {
160 qsort (status_table,
161 DIM(status_table) - 1, sizeof (status_table[0]),
162 status_cmp);
163 }
164
165
166 gpgme_status_code_t
_gpgme_parse_status(const char * name)167 _gpgme_parse_status (const char *name)
168 {
169 struct status_table_s t, *r;
170 t.name = name;
171 r = bsearch (&t, status_table, DIM(status_table) - 1,
172 sizeof t, status_cmp);
173 return r ? r->code : -1;
174 }
175
176
177 const char *
_gpgme_status_to_string(gpgme_status_code_t code)178 _gpgme_status_to_string (gpgme_status_code_t code)
179 {
180 int i;
181
182 for (i=0; i < DIM(status_table); i++)
183 if (status_table[i].code == code)
184 return status_table[i].name? status_table[i].name : "";
185 return "status_code_lost";
186 }
187