=pod

=head1 NAME

OPENSSL_config, OPENSSL_no_config - simple OpenSSL configuration functions

=head1 SYNOPSIS

 #include <openssl/conf.h>

 void OPENSSL_config(const char *config_name);
 void OPENSSL_no_config(void);

=head1 DESCRIPTION

OPENSSL_config() configures OpenSSL using the standard B<openssl.cnf>
configuration file name using B<config_name>. If B<config_name> is NULL then
the default name B<openssl_conf> will be used. Any errors are ignored. Further
calls to OPENSSL_config() will have no effect. The configuration file format
is documented in the L<conf(5)|conf(5)> manual page.

OPENSSL_no_config() disables configuration. If called before OPENSSL_config()
no configuration takes place.

=head1 NOTES

It is B<strongly> recommended that B<all> new applications call OPENSSL_config()
or the more sophisticated functions such as CONF_modules_load() during
initialization (that is before starting any threads). By doing this
an application does not need to keep track of all configuration options
and some new functionality can be supported automatically.

It is also possible to automatically call OPENSSL_config() when an application
calls OPENSSL_add_all_algorithms() by compiling an application with the
preprocessor symbol B<OPENSSL_LOAD_CONF> #define'd. In this way configuration
can be added without source changes.

The environment variable B<OPENSSL_CONF> can be set to specify the location
of the configuration file.
 
Currently ASN1 OBJECTs and ENGINE configuration can be performed future
versions of OpenSSL will add new configuration options.

There are several reasons why calling the OpenSSL configuration routines is
advisable. For example new ENGINE functionality was added to OpenSSL 0.9.7.
In OpenSSL 0.9.7 control functions can be supported by ENGINEs, this can be
used (among other things) to load dynamic ENGINEs from shared libraries (DSOs).
However very few applications currently support the control interface and so
very few can load and use dynamic ENGINEs. Equally in future more sophisticated
ENGINEs will require certain control operations to customize them. If an
application calls OPENSSL_config() it doesn't need to know or care about
ENGINE control operations because they can be performed by editing a
configuration file.

Applications should free up configuration at application closedown by calling
CONF_modules_free().

=head1 RESTRICTIONS

The OPENSSL_config() function is designed to be a very simple "call it and
forget it" function. As a result its behaviour is somewhat limited. It ignores
all errors silently and it can only load from the standard configuration file
location for example.

It is however B<much> better than nothing. Applications which need finer
control over their configuration functionality should use the configuration
functions such as CONF_load_modules() directly.

=head1 RETURN VALUES

Neither OPENSSL_config() nor OPENSSL_no_config() return a value.

=head1 SEE ALSO

L<conf(5)|conf(5)>, L<CONF_load_modules_file(3)|CONF_load_modules_file(3)>,
L<CONF_modules_free(3),CONF_modules_free(3)>

=head1 HISTORY

OPENSSL_config() and OPENSSL_no_config() first appeared in OpenSSL 0.9.7

=cut
