summaryrefslogtreecommitdiffstats
path: root/crypto/cversion.c
blob: 87154645b0f05c581671b6ef80fd65f3aae16d01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <stdio.h>
#include <openssl/bio.h>
#include "internal/e_os.h"
#include "internal/cryptlib.h"
#include "internal/common.h"
#include "internal/thread_once.h"

#include "buildinf.h"

unsigned long OpenSSL_version_num(void)
{
    return OPENSSL_VERSION_NUMBER;
}

unsigned int OPENSSL_version_major(void)
{
    return OPENSSL_VERSION_MAJOR;
}

unsigned int OPENSSL_version_minor(void)
{
    return OPENSSL_VERSION_MINOR;
}

unsigned int OPENSSL_version_patch(void)
{
    return OPENSSL_VERSION_PATCH;
}

const char *OPENSSL_version_pre_release(void)
{
    return OPENSSL_VERSION_PRE_RELEASE;
}

const char *OPENSSL_version_build_metadata(void)
{
    return OPENSSL_VERSION_BUILD_METADATA;
}

extern char ossl_cpu_info_str[];

#if defined(_WIN32) && defined(OSSL_WINCTX)
/* size: MAX_PATH + sizeof("OPENSSLDIR: \"\"") */
static char openssldir[MAX_PATH + 15];

/* size: MAX_PATH + sizeof("ENGINESDIR: \"\"") */
static char enginesdir[MAX_PATH + 15];

/* size: MAX_PATH + sizeof("MODULESDIR: \"\"") */
static char modulesdir[MAX_PATH + 15];

static CRYPTO_ONCE version_strings_once = CRYPTO_ONCE_STATIC_INIT;

DEFINE_RUN_ONCE_STATIC(version_strings_setup)
{
    BIO_snprintf(openssldir, sizeof(openssldir), "OPENSSLDIR: \"%s\"",
                 ossl_get_openssldir());
    BIO_snprintf(enginesdir, sizeof(enginesdir), "ENGINESDIR: \"%s\"",
                 ossl_get_enginesdir());
    BIO_snprintf(modulesdir, sizeof(modulesdir), "MODULESDIR: \"%s\"",
                 ossl_get_modulesdir());
    return 1;
}

# define TOSTR(x) #x
# define OSSL_WINCTX_STRING "OSSL_WINCTX: \"" ## TOSTR(OSSL_WINCTX) ## "\""

#endif

const char *OpenSSL_version(int t)
{
#if defined(_WIN32) && defined(OSSL_WINCTX)
    /* Cannot really fail but we would return empty strings anyway */
    (void)RUN_ONCE(&version_strings_once, version_strings_setup);
#endif

    switch (t) {
    case OPENSSL_VERSION:
        return OPENSSL_VERSION_TEXT;
    case OPENSSL_VERSION_STRING:
        return OPENSSL_VERSION_STR;
    case OPENSSL_FULL_VERSION_STRING:
        return OPENSSL_FULL_VERSION_STR;
    case OPENSSL_BUILT_ON:
        return DATE;
    case OPENSSL_CFLAGS:
        return compiler_flags;
    case OPENSSL_PLATFORM:
        return PLATFORM;
#if defined(_WIN32) && defined(OSSL_WINCTX)
    case OPENSSL_DIR:
        return openssldir;
    case OPENSSL_ENGINES_DIR:
        return enginesdir;
    case OPENSSL_MODULES_DIR:
        return modulesdir;
#else
    case OPENSSL_DIR:
# ifdef OPENSSLDIR
        return "OPENSSLDIR: \"" OPENSSLDIR "\"";
# else
        return "OPENSSLDIR: N/A";
# endif
    case OPENSSL_ENGINES_DIR:
# ifdef ENGINESDIR
        return "ENGINESDIR: \"" ENGINESDIR "\"";
# else
        return "ENGINESDIR: N/A";
# endif
    case OPENSSL_MODULES_DIR:
# ifdef MODULESDIR
        return "MODULESDIR: \"" MODULESDIR "\"";
# else
        return "MODULESDIR: N/A";
# endif
#endif
    case OPENSSL_CPU_INFO:
        if (OPENSSL_info(OPENSSL_INFO_CPU_SETTINGS) != NULL)
            return ossl_cpu_info_str;
        else
            return "CPUINFO: N/A";
    case OPENSSL_WINCTX:
#if defined(_WIN32) && defined(OSSL_WINCTX)
        return OSSL_WINCTX_STRING;
#else
        return "OSSL_WINCTX: Undefined";
#endif
    }
    return "not available";
}