1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <stdio.h> 11e1051a39Sopenharmony_ci#include <stdlib.h> 12e1051a39Sopenharmony_ci#include <string.h> 13e1051a39Sopenharmony_ci#include "apps.h" 14e1051a39Sopenharmony_ci#include "progs.h" 15e1051a39Sopenharmony_ci#include <openssl/evp.h> 16e1051a39Sopenharmony_ci#include <openssl/crypto.h> 17e1051a39Sopenharmony_ci#include <openssl/bn.h> 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_citypedef enum OPTION_choice { 20e1051a39Sopenharmony_ci OPT_COMMON, 21e1051a39Sopenharmony_ci OPT_B, OPT_D, OPT_E, OPT_M, OPT_F, OPT_O, OPT_P, OPT_V, OPT_A, OPT_R, OPT_C 22e1051a39Sopenharmony_ci} OPTION_CHOICE; 23e1051a39Sopenharmony_ci 24e1051a39Sopenharmony_ciconst OPTIONS version_options[] = { 25e1051a39Sopenharmony_ci OPT_SECTION("General"), 26e1051a39Sopenharmony_ci {"help", OPT_HELP, '-', "Display this summary"}, 27e1051a39Sopenharmony_ci 28e1051a39Sopenharmony_ci OPT_SECTION("Output"), 29e1051a39Sopenharmony_ci {"a", OPT_A, '-', "Show all data"}, 30e1051a39Sopenharmony_ci {"b", OPT_B, '-', "Show build date"}, 31e1051a39Sopenharmony_ci {"d", OPT_D, '-', "Show configuration directory"}, 32e1051a39Sopenharmony_ci {"e", OPT_E, '-', "Show engines directory"}, 33e1051a39Sopenharmony_ci {"m", OPT_M, '-', "Show modules directory"}, 34e1051a39Sopenharmony_ci {"f", OPT_F, '-', "Show compiler flags used"}, 35e1051a39Sopenharmony_ci {"o", OPT_O, '-', "Show some internal datatype options"}, 36e1051a39Sopenharmony_ci {"p", OPT_P, '-', "Show target build platform"}, 37e1051a39Sopenharmony_ci {"r", OPT_R, '-', "Show random seeding options"}, 38e1051a39Sopenharmony_ci {"v", OPT_V, '-', "Show library version"}, 39e1051a39Sopenharmony_ci {"c", OPT_C, '-', "Show CPU settings info"}, 40e1051a39Sopenharmony_ci {NULL} 41e1051a39Sopenharmony_ci}; 42e1051a39Sopenharmony_ci 43e1051a39Sopenharmony_ciint version_main(int argc, char **argv) 44e1051a39Sopenharmony_ci{ 45e1051a39Sopenharmony_ci int ret = 1, dirty = 0, seed = 0; 46e1051a39Sopenharmony_ci int cflags = 0, version = 0, date = 0, options = 0, platform = 0, dir = 0; 47e1051a39Sopenharmony_ci int engdir = 0, moddir = 0, cpuinfo = 0; 48e1051a39Sopenharmony_ci char *prog; 49e1051a39Sopenharmony_ci OPTION_CHOICE o; 50e1051a39Sopenharmony_ci 51e1051a39Sopenharmony_ci prog = opt_init(argc, argv, version_options); 52e1051a39Sopenharmony_ci while ((o = opt_next()) != OPT_EOF) { 53e1051a39Sopenharmony_ci switch (o) { 54e1051a39Sopenharmony_ci case OPT_EOF: 55e1051a39Sopenharmony_ci case OPT_ERR: 56e1051a39Sopenharmony_ciopthelp: 57e1051a39Sopenharmony_ci BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); 58e1051a39Sopenharmony_ci goto end; 59e1051a39Sopenharmony_ci case OPT_HELP: 60e1051a39Sopenharmony_ci opt_help(version_options); 61e1051a39Sopenharmony_ci ret = 0; 62e1051a39Sopenharmony_ci goto end; 63e1051a39Sopenharmony_ci case OPT_B: 64e1051a39Sopenharmony_ci dirty = date = 1; 65e1051a39Sopenharmony_ci break; 66e1051a39Sopenharmony_ci case OPT_D: 67e1051a39Sopenharmony_ci dirty = dir = 1; 68e1051a39Sopenharmony_ci break; 69e1051a39Sopenharmony_ci case OPT_E: 70e1051a39Sopenharmony_ci dirty = engdir = 1; 71e1051a39Sopenharmony_ci break; 72e1051a39Sopenharmony_ci case OPT_M: 73e1051a39Sopenharmony_ci dirty = moddir = 1; 74e1051a39Sopenharmony_ci break; 75e1051a39Sopenharmony_ci case OPT_F: 76e1051a39Sopenharmony_ci dirty = cflags = 1; 77e1051a39Sopenharmony_ci break; 78e1051a39Sopenharmony_ci case OPT_O: 79e1051a39Sopenharmony_ci dirty = options = 1; 80e1051a39Sopenharmony_ci break; 81e1051a39Sopenharmony_ci case OPT_P: 82e1051a39Sopenharmony_ci dirty = platform = 1; 83e1051a39Sopenharmony_ci break; 84e1051a39Sopenharmony_ci case OPT_R: 85e1051a39Sopenharmony_ci dirty = seed = 1; 86e1051a39Sopenharmony_ci break; 87e1051a39Sopenharmony_ci case OPT_V: 88e1051a39Sopenharmony_ci dirty = version = 1; 89e1051a39Sopenharmony_ci break; 90e1051a39Sopenharmony_ci case OPT_C: 91e1051a39Sopenharmony_ci dirty = cpuinfo = 1; 92e1051a39Sopenharmony_ci break; 93e1051a39Sopenharmony_ci case OPT_A: 94e1051a39Sopenharmony_ci seed = options = cflags = version = date = platform 95e1051a39Sopenharmony_ci = dir = engdir = moddir = cpuinfo 96e1051a39Sopenharmony_ci = 1; 97e1051a39Sopenharmony_ci break; 98e1051a39Sopenharmony_ci } 99e1051a39Sopenharmony_ci } 100e1051a39Sopenharmony_ci 101e1051a39Sopenharmony_ci /* No extra arguments. */ 102e1051a39Sopenharmony_ci argc = opt_num_rest(); 103e1051a39Sopenharmony_ci if (argc != 0) 104e1051a39Sopenharmony_ci goto opthelp; 105e1051a39Sopenharmony_ci 106e1051a39Sopenharmony_ci if (!dirty) 107e1051a39Sopenharmony_ci version = 1; 108e1051a39Sopenharmony_ci 109e1051a39Sopenharmony_ci if (version) 110e1051a39Sopenharmony_ci printf("%s (Library: %s)\n", 111e1051a39Sopenharmony_ci OPENSSL_VERSION_TEXT, OpenSSL_version(OPENSSL_VERSION)); 112e1051a39Sopenharmony_ci if (date) 113e1051a39Sopenharmony_ci printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON)); 114e1051a39Sopenharmony_ci if (platform) 115e1051a39Sopenharmony_ci printf("%s\n", OpenSSL_version(OPENSSL_PLATFORM)); 116e1051a39Sopenharmony_ci if (options) { 117e1051a39Sopenharmony_ci printf("options: "); 118e1051a39Sopenharmony_ci printf(" %s", BN_options()); 119e1051a39Sopenharmony_ci printf("\n"); 120e1051a39Sopenharmony_ci } 121e1051a39Sopenharmony_ci if (cflags) 122e1051a39Sopenharmony_ci printf("%s\n", OpenSSL_version(OPENSSL_CFLAGS)); 123e1051a39Sopenharmony_ci if (dir) 124e1051a39Sopenharmony_ci printf("%s\n", OpenSSL_version(OPENSSL_DIR)); 125e1051a39Sopenharmony_ci if (engdir) 126e1051a39Sopenharmony_ci printf("%s\n", OpenSSL_version(OPENSSL_ENGINES_DIR)); 127e1051a39Sopenharmony_ci if (moddir) 128e1051a39Sopenharmony_ci printf("%s\n", OpenSSL_version(OPENSSL_MODULES_DIR)); 129e1051a39Sopenharmony_ci if (seed) { 130e1051a39Sopenharmony_ci const char *src = OPENSSL_info(OPENSSL_INFO_SEED_SOURCE); 131e1051a39Sopenharmony_ci printf("Seeding source: %s\n", src ? src : "N/A"); 132e1051a39Sopenharmony_ci } 133e1051a39Sopenharmony_ci if (cpuinfo) 134e1051a39Sopenharmony_ci printf("%s\n", OpenSSL_version(OPENSSL_CPU_INFO)); 135e1051a39Sopenharmony_ci ret = 0; 136e1051a39Sopenharmony_ci end: 137e1051a39Sopenharmony_ci return ret; 138e1051a39Sopenharmony_ci} 139e1051a39Sopenharmony_ci 140e1051a39Sopenharmony_ci 141e1051a39Sopenharmony_ci#if defined(__TANDEM) && defined(OPENSSL_VPROC) 142e1051a39Sopenharmony_ci/* 143e1051a39Sopenharmony_ci * Define a VPROC function for the openssl program. 144e1051a39Sopenharmony_ci * This is used by platform version identification tools. 145e1051a39Sopenharmony_ci * Do not inline this procedure or make it static. 146e1051a39Sopenharmony_ci */ 147e1051a39Sopenharmony_ci# define OPENSSL_VPROC_STRING_(x) x##_OPENSSL 148e1051a39Sopenharmony_ci# define OPENSSL_VPROC_STRING(x) OPENSSL_VPROC_STRING_(x) 149e1051a39Sopenharmony_ci# define OPENSSL_VPROC_FUNC OPENSSL_VPROC_STRING(OPENSSL_VPROC) 150e1051a39Sopenharmony_civoid OPENSSL_VPROC_FUNC(void) {} 151e1051a39Sopenharmony_ci#endif 152