1 /* 2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (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 {OPT_HELP_STR, 1, '-', " errnum Error number\n"}, 26 {"help", OPT_HELP, '-', "Display this summary"}, 27 {NULL} 28 }; 29 30 int errstr_main(int argc, char **argv) 31 { 32 OPTION_CHOICE o; 33 char buf[256], *prog; 34 int ret = 1; 35 unsigned long l; 36 37 prog = opt_init(argc, argv, errstr_options); 38 while ((o = opt_next()) != OPT_EOF) { 39 switch (o) { 40 case OPT_EOF: 41 case OPT_ERR: 42 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); 43 goto end; 44 case OPT_HELP: 45 opt_help(errstr_options); 46 ret = 0; 47 goto end; 48 } 49 } 50 51 ret = 0; 52 for (argv = opt_rest(); *argv; argv++) { 53 if (sscanf(*argv, "%lx", &l) == 0) { 54 ret++; 55 } else { 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 ERR_error_string_n(l, buf, sizeof(buf)); 62 BIO_printf(bio_out, "%s\n", buf); 63 } 64 } 65 end: 66 return ret; 67 } 68