=pod

=head1 NAME

OPENSSL_VERSION_MAJOR, OPENSSL_VERSION_MINOR, OPENSSL_VERSION_PATCH,
OPENSSL_VERSION_PRE_RELEASE, OPENSSL_VERSION_BUILD_METADATA,
OPENSSL_VERSION_TEXT, OPENSSL_VERSION_PREREQ, OPENSSL_version_major,
OPENSSL_version_minor, OPENSSL_version_patch, OPENSSL_version_pre_release,
OPENSSL_version_build_metadata, OpenSSL_version, OPENSSL_VERSION_NUMBER,
OpenSSL_version_num, OPENSSL_info
- get OpenSSL version number and other information

=head1 SYNOPSIS

 #include <openssl/opensslv.h>

 #define OPENSSL_VERSION_MAJOR  x
 #define OPENSSL_VERSION_MINOR  y
 #define OPENSSL_VERSION_PATCH  z

 /* The definitions here are typical release values */
 #define OPENSSL_VERSION_PRE_RELEASE ""
 #define OPENSSL_VERSION_BUILD_METADATA ""

 #define OPENSSL_VERSION_TEXT "OpenSSL x.y.z xx XXX xxxx"

 #define OPENSSL_VERSION_PREREQ(maj,min)

 #include <openssl/crypto.h>

 unsigned int OPENSSL_version_major(void);
 unsigned int OPENSSL_version_minor(void);
 unsigned int OPENSSL_version_patch(void);
 const char *OPENSSL_version_pre_release(void);
 const char *OPENSSL_version_build_metadata(void);

 const char *OpenSSL_version(int t);

 const char *OPENSSL_info(int t);

 /* from openssl/opensslv.h */
 #define OPENSSL_VERSION_NUMBER 0xnnnnnnnnL

 /* from openssl/crypto.h */
 unsigned long OpenSSL_version_num();

=head1 DESCRIPTION

=head2 Macros

The three macros B<OPENSSL_VERSION_MAJOR>, B<OPENSSL_VERSION_MINOR> and
B<OPENSSL_VERSION_PATCH> represent the three parts of a version
identifier, B<I<MAJOR>.I<MINOR>.I<PATCH>>.

The macro B<OPENSSL_VERSION_PRE_RELEASE> is an added bit of text that
indicates that this is a pre-release version, such as C<"-dev"> for an
ongoing development snapshot or C<"-alpha3"> for an alpha release.
The value must be a string.

The macro B<OPENSSL_VERSION_BUILD_METADATA> is extra information, reserved
for other parties, such as C<"+fips">, or C<"+vendor.1">).
The OpenSSL project will not touch this macro (will leave it an empty string).
The value must be a string.

B<OPENSSL_VERSION_STR> is a convenience macro to get the short version
identifier string, C<"I<MAJOR>.I<MINOR>.I<PATCH>">.

B<OPENSSL_FULL_VERSION_STR> is a convenience macro to get the longer
version identifier string, which combines B<OPENSSL_VERSION_STR>,
B<OPENSSL_VERSION_PRE_RELEASE> and B<OPENSSL_VERSION_BUILD_METADATA>.

B<OPENSSL_VERSION_TEXT> is a convenience macro to get a full descriptive
version text, which includes B<OPENSSL_FULL_VERSION_STR> and the release
date.

B<OPENSSL_VERSION_PREREQ> is a useful macro for checking whether the OpenSSL
version for the headers in use is at least at the given pre-requisite major
(B<maj>) and minor (B<min>) number or not. It will evaluate to true if the
header version number (B<OPENSSL_VERSION_MAJOR>.B<OPENSSL_VERSION_MINOR>) is
greater than or equal to B<maj>.B<min>.

B<OPENSSL_VERSION_NUMBER> is a combination of the major, minor and
patch version into a single integer 0xMNN00PP0L, where:

=over 4

=item M

is the number from B<OPENSSL_VERSION_MAJOR>, in hexadecimal notation

=item NN

is the number from B<OPENSSL_VERSION_MINOR>, in hexadecimal notation

=item PP

is the number from B<OPENSSL_VERSION_PATCH>, in hexadecimal notation

=back

=head2 Functions

OPENSSL_version_major(), OPENSSL_version_minor(), OPENSSL_version_patch(),
OPENSSL_version_pre_release(), and OPENSSL_version_build_metadata() return
the values of the macros above for the build of the library, respectively.

OpenSSL_version() returns different strings depending on I<t>:

=over 4

=item OPENSSL_VERSION

The value of B<OPENSSL_VERSION_TEXT>

=item OPENSSL_VERSION_STRING

The value of B<OPENSSL_VERSION_STR>

=item OPENSSL_FULL_VERSION_STRING

The value of B<OPENSSL_FULL_VERSION_STR>

=item OPENSSL_CFLAGS

The compiler flags set for the compilation process in the form
C<compiler: ...>  if available, or C<compiler: information not available>
otherwise.

=item OPENSSL_BUILT_ON

The date of the build process in the form C<built on: ...> if available
or C<built on: date not available> otherwise.
The date would not be available in a reproducible build, for example.

=item OPENSSL_PLATFORM

The "Configure" target of the library build in the form C<platform: ...>
if available, or C<platform: information not available> otherwise.

=item OPENSSL_DIR

The B<OPENSSLDIR> setting of the library build in the form C<OPENSSLDIR: "...">
if available, or C<OPENSSLDIR: N/A> otherwise.

=item OPENSSL_ENGINES_DIR

The B<ENGINESDIR> setting of the library build in the form C<ENGINESDIR: "...">
if available, or C<ENGINESDIR: N/A> otherwise. This option is deprecated in
OpenSSL 3.0.

=item OPENSSL_MODULES_DIR

The B<MODULESDIR> setting of the library build in the form C<MODULESDIR: "...">
if available, or C<MODULESDIR: N/A> otherwise.

=item OPENSSL_CPU_INFO

The current OpenSSL cpu settings.
This is the current setting of the cpu capability flags. It is usually
automatically configured but may be set via an environment variable.
The value has the same syntax as the environment variable.
For x86 the string looks like C<CPUINFO: OPENSSL_ia32cap=0x123:0x456>
or C<CPUINFO: N/A> if not available.

=back

For an unknown I<t>, the text C<not available> is returned.

OPENSSL_info() also returns different strings depending on I<t>:

=over 4

=item OPENSSL_INFO_CONFIG_DIR

The configured C<OPENSSLDIR>, which is the default location for
OpenSSL configuration files.

=item OPENSSL_INFO_ENGINES_DIR

The configured C<ENGINESDIR>, which is the default location for
OpenSSL engines.

=item OPENSSL_INFO_MODULES_DIR

The configured C<MODULESDIR>, which is the default location for
dynamically loadable OpenSSL modules other than engines.

=item OPENSSL_INFO_DSO_EXTENSION

The configured dynamically loadable module extension.

=item OPENSSL_INFO_DIR_FILENAME_SEPARATOR

The separator between a directory specification and a filename.
Note that on some operating systems, this is not the same as the
separator between directory elements.

=item OPENSSL_INFO_LIST_SEPARATOR

The OpenSSL list separator.
This is typically used in strings that are lists of items, such as the
value of the environment variable C<$PATH> on Unix (where the
separator is C<:>) or C<%PATH%> on Windows (where the separator is
C<;>).

=item OPENSSL_INFO_CPU_SETTINGS

The current OpenSSL cpu settings.
This is the current setting of the cpu capability flags. It is usually
automatically configured but may be set via an environment variable.
The value has the same syntax as the environment variable.
For x86 the string looks like C<OPENSSL_ia32cap=0x123:0x456>.

=back

For an unknown I<t>, NULL is returned.

OpenSSL_version_num() returns the value of B<OPENSSL_VERSION_NUMBER>.

=head1 RETURN VALUES

OPENSSL_version_major(), OPENSSL_version_minor() and OPENSSL_version_patch()
return the version number parts as integers.

OPENSSL_version_pre_release() and OPENSSL_version_build_metadata() return
the values of B<OPENSSL_VERSION_PRE_RELEASE> and
B<OPENSSL_VERSION_BUILD_METADATA> respectively as constant strings.
For any of them that is undefined, the empty string is returned.

OpenSSL_version() returns constant strings.

=head1 SEE ALSO

L<crypto(7)>

=head1 HISTORY

The macros and functions described here were added in OpenSSL 3.0,
except for OPENSSL_VERSION_NUMBER and OpenSSL_version_num().

=head1 COPYRIGHT

Copyright 2018-2022 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
L<https://www.openssl.org/source/license.html>.

=cut
