Coverage Report

Created: 2026-05-16 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/openssl-0.10.62/src/version.rs
Line
Count
Source
1
// Licensed under the Apache License, Version 2.0 (the "License");
2
// you may not use this file except in compliance with the License.
3
// You may obtain a copy of the License at
4
//
5
//     http://www.apache.org/licenses/LICENSE-2.0
6
//
7
// Unless required by applicable law or agreed to in writing, software
8
// distributed under the License is distributed on an "AS IS" BASIS,
9
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
// See the License for the specific language governing permissions and
11
// limitations under the License.
12
//
13
14
//! Build and version information.
15
16
use cfg_if::cfg_if;
17
use openssl_macros::corresponds;
18
use std::ffi::CStr;
19
20
cfg_if! {
21
    if #[cfg(any(ossl110, libressl271))] {
22
        use ffi::{
23
            OPENSSL_VERSION, OPENSSL_CFLAGS, OPENSSL_BUILT_ON, OPENSSL_PLATFORM, OPENSSL_DIR,
24
            OpenSSL_version_num, OpenSSL_version,
25
        };
26
    } else {
27
        use ffi::{
28
            SSLEAY_VERSION as OPENSSL_VERSION, SSLEAY_CFLAGS as OPENSSL_CFLAGS,
29
            SSLEAY_BUILT_ON as OPENSSL_BUILT_ON, SSLEAY_PLATFORM as OPENSSL_PLATFORM,
30
            SSLEAY_DIR as OPENSSL_DIR, SSLeay as OpenSSL_version_num,
31
            SSLeay_version as OpenSSL_version,
32
        };
33
    }
34
}
35
36
/// OPENSSL_VERSION_NUMBER is a numeric release version identifier:
37
///
38
/// `MNNFFPPS: major minor fix patch status`
39
///
40
/// The status nibble has one of the values 0 for development, 1 to e for betas 1 to 14, and f for release.
41
///
42
/// for example
43
///
44
/// `0x000906000 == 0.9.6 dev`
45
/// `0x000906023 == 0.9.6b beta 3`
46
/// `0x00090605f == 0.9.6e release`
47
#[corresponds(OpenSSL_version_num)]
48
0
pub fn number() -> i64 {
49
0
    unsafe { OpenSSL_version_num() as i64 }
50
0
}
51
52
/// The text variant of the version number and the release date. For example, "OpenSSL 0.9.5a 1 Apr 2000".
53
#[corresponds(OpenSSL_version)]
54
0
pub fn version() -> &'static str {
55
    unsafe {
56
0
        CStr::from_ptr(OpenSSL_version(OPENSSL_VERSION))
57
0
            .to_str()
58
0
            .unwrap()
59
    }
60
0
}
61
62
/// The compiler flags set for the compilation process in the form "compiler: ..." if available or
63
/// "compiler: information not available" otherwise.
64
#[corresponds(OpenSSL_version)]
65
0
pub fn c_flags() -> &'static str {
66
    unsafe {
67
0
        CStr::from_ptr(OpenSSL_version(OPENSSL_CFLAGS))
68
0
            .to_str()
69
0
            .unwrap()
70
    }
71
0
}
72
73
/// The date of the build process in the form "built on: ..." if available or "built on: date not available" otherwise.
74
#[corresponds(OpenSSL_version)]
75
0
pub fn built_on() -> &'static str {
76
    unsafe {
77
0
        CStr::from_ptr(OpenSSL_version(OPENSSL_BUILT_ON))
78
0
            .to_str()
79
0
            .unwrap()
80
    }
81
0
}
82
83
/// The "Configure" target of the library build in the form "platform: ..." if available or "platform: information not available" otherwise.
84
#[corresponds(OpenSSL_version)]
85
0
pub fn platform() -> &'static str {
86
    unsafe {
87
0
        CStr::from_ptr(OpenSSL_version(OPENSSL_PLATFORM))
88
0
            .to_str()
89
0
            .unwrap()
90
    }
91
0
}
92
93
/// The "OPENSSLDIR" setting of the library build in the form "OPENSSLDIR: "..."" if available or "OPENSSLDIR: N/A" otherwise.
94
#[corresponds(OpenSSL_version)]
95
0
pub fn dir() -> &'static str {
96
    unsafe {
97
0
        CStr::from_ptr(OpenSSL_version(OPENSSL_DIR))
98
0
            .to_str()
99
0
            .unwrap()
100
    }
101
0
}
102
103
/// This test ensures that we do not segfault when calling the functions of this module
104
/// and that the strings respect a reasonable format.
105
#[test]
106
fn test_versions() {
107
    println!("Number: '{}'", number());
108
    println!("Version: '{}'", version());
109
    println!("C flags: '{}'", c_flags());
110
    println!("Built on: '{}'", built_on());
111
    println!("Platform: '{}'", platform());
112
    println!("Dir: '{}'", dir());
113
114
    #[cfg(not(any(libressl, boringssl)))]
115
    fn expected_name() -> &'static str {
116
        "OpenSSL"
117
    }
118
    #[cfg(libressl)]
119
    fn expected_name() -> &'static str {
120
        "LibreSSL"
121
    }
122
    #[cfg(boringssl)]
123
    fn expected_name() -> &'static str {
124
        "BoringSSL"
125
    }
126
127
    assert!(number() > 0);
128
    assert!(version().starts_with(expected_name()));
129
    assert!(c_flags().starts_with("compiler:"));
130
    // some distributions patch out dates out of openssl so that the builds are reproducible
131
    if !built_on().is_empty() {
132
        assert!(built_on().starts_with("built on:"));
133
    }
134
    assert!(dir().starts_with("OPENSSLDIR:"));
135
}