Home | History | Annotate | Line # | Download | only in apps
      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