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 <openssl/evp.h> 15 #include <openssl/crypto.h> 16 #include <openssl/bn.h> 17 #ifndef OPENSSL_NO_MD2 18 # include <openssl/md2.h> 19 #endif 20 #ifndef OPENSSL_NO_RC4 21 # include <openssl/rc4.h> 22 #endif 23 #ifndef OPENSSL_NO_DES 24 # include <openssl/des.h> 25 #endif 26 #ifndef OPENSSL_NO_IDEA 27 # include <openssl/idea.h> 28 #endif 29 #ifndef OPENSSL_NO_BF 30 # include <openssl/blowfish.h> 31 #endif 32 33 typedef enum OPTION_choice { 34 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, 35 OPT_B, OPT_D, OPT_E, OPT_F, OPT_O, OPT_P, OPT_V, OPT_A 36 } OPTION_CHOICE; 37 38 OPTIONS version_options[] = { 39 {"help", OPT_HELP, '-', "Display this summary"}, 40 {"a", OPT_A, '-', "Show all data"}, 41 {"b", OPT_B, '-', "Show build date"}, 42 {"d", OPT_D, '-', "Show configuration directory"}, 43 {"e", OPT_E, '-', "Show engines directory"}, 44 {"f", OPT_F, '-', "Show compiler flags used"}, 45 {"o", OPT_O, '-', "Show some internal datatype options"}, 46 {"p", OPT_P, '-', "Show target build platform"}, 47 {"v", OPT_V, '-', "Show library version"}, 48 {NULL} 49 }; 50 51 int version_main(int argc, char **argv) 52 { 53 int ret = 1, dirty = 0; 54 int cflags = 0, version = 0, date = 0, options = 0, platform = 0, dir = 0; 55 int engdir = 0; 56 char *prog; 57 OPTION_CHOICE o; 58 59 prog = opt_init(argc, argv, version_options); 60 while ((o = opt_next()) != OPT_EOF) { 61 switch (o) { 62 case OPT_EOF: 63 case OPT_ERR: 64 opthelp: 65 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); 66 goto end; 67 case OPT_HELP: 68 opt_help(version_options); 69 ret = 0; 70 goto end; 71 case OPT_B: 72 dirty = date = 1; 73 break; 74 case OPT_D: 75 dirty = dir = 1; 76 break; 77 case OPT_E: 78 dirty = engdir = 1; 79 break; 80 case OPT_F: 81 dirty = cflags = 1; 82 break; 83 case OPT_O: 84 dirty = options = 1; 85 break; 86 case OPT_P: 87 dirty = platform = 1; 88 break; 89 case OPT_V: 90 dirty = version = 1; 91 break; 92 case OPT_A: 93 options = cflags = version = date = platform = dir = engdir = 1; 94 break; 95 } 96 } 97 if (opt_num_rest() != 0) { 98 BIO_printf(bio_err, "Extra parameters given.\n"); 99 goto opthelp; 100 } 101 if (!dirty) 102 version = 1; 103 104 if (version) { 105 if (OpenSSL_version_num() == OPENSSL_VERSION_NUMBER) { 106 printf("%s\n", OpenSSL_version(OPENSSL_VERSION)); 107 } else { 108 printf("%s (Library: %s)\n", 109 OPENSSL_VERSION_TEXT, OpenSSL_version(OPENSSL_VERSION)); 110 } 111 } 112 if (date) 113 printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON)); 114 if (platform) 115 printf("%s\n", OpenSSL_version(OPENSSL_PLATFORM)); 116 if (options) { 117 printf("options: "); 118 printf("%s ", BN_options()); 119 #ifndef OPENSSL_NO_MD2 120 printf("%s ", MD2_options()); 121 #endif 122 #ifndef OPENSSL_NO_RC4 123 printf("%s ", RC4_options()); 124 #endif 125 #ifndef OPENSSL_NO_DES 126 printf("%s ", DES_options()); 127 #endif 128 #ifndef OPENSSL_NO_IDEA 129 printf("%s ", IDEA_options()); 130 #endif 131 #ifndef OPENSSL_NO_BF 132 printf("%s ", BF_options()); 133 #endif 134 printf("\n"); 135 } 136 if (cflags) 137 printf("%s\n", OpenSSL_version(OPENSSL_CFLAGS)); 138 if (dir) 139 printf("%s\n", OpenSSL_version(OPENSSL_DIR)); 140 if (engdir) 141 printf("%s\n", OpenSSL_version(OPENSSL_ENGINES_DIR)); 142 ret = 0; 143 end: 144 return (ret); 145 } 146