=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_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"

 #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);

Deprecated:

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

 /* 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.

=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.

=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.

=head1 BACKWARD COMPATIBILITY

For compatibility, some older macros and functions are retained or
synthesised.
They are all considered deprecated.

=head2 Macros

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_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,
with the exception of the L</BACKWARD COMPATIBILITY> ones.

=head1 COPYRIGHT

Copyright 2018-2019 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
