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