1 /* 2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <string.h> 13 #include "apps.h" 14 #include "progs.h" 15 #include <openssl/bio.h> 16 #include <openssl/err.h> 17 #include <openssl/ssl.h> 18 19 typedef enum OPTION_choice { 20 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP 21 } OPTION_CHOICE; 22 23 const OPTIONS errstr_options[] = { 24 {OPT_HELP_STR, 1, '-', "Usage: %s [options] errnum...\n"}, 25 26 OPT_SECTION("General"), 27 {"help", OPT_HELP, '-', "Display this summary"}, 28 29 OPT_PARAMETERS(), 30 {"errnum", 0, 0, "Error number(s) to decode"}, 31 {NULL} 32 }; 33 34 int errstr_main(int argc, char **argv) 35 { 36 OPTION_CHOICE o; 37 char buf[256], *prog; 38 int ret = 1; 39 unsigned long l; 40 41 prog = opt_init(argc, argv, errstr_options); 42 while ((o = opt_next()) != OPT_EOF) { 43 switch (o) { 44 case OPT_EOF: 45 case OPT_ERR: 46 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); 47 goto end; 48 case OPT_HELP: 49 opt_help(errstr_options); 50 ret = 0; 51 goto end; 52 } 53 } 54 55 /* 56 * We're not really an SSL application so this won't auto-init, but 57 * we're still interested in SSL error strings 58 */ 59 OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS 60 | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); 61 62 /* All remaining arg are error code. */ 63 ret = 0; 64 for (argv = opt_rest(); *argv != NULL; argv++) { 65 if (sscanf(*argv, "%lx", &l) == 0) { 66 ret++; 67 } else { 68 ERR_error_string_n(l, buf, sizeof(buf)); 69 BIO_printf(bio_out, "%s\n", buf); 70 } 71 } 72 end: 73 return ret; 74 } 75