=pod

=head1 NAME

err - error codes

=head1 SYNOPSIS

 #include <openssl/err.h>

 unsigned long ERR_get_error(void);
 unsigned long ERR_peek_error(void);
 unsigned long ERR_get_error_line(const char **file, int *line);
 unsigned long ERR_peek_error_line(const char **file, int *line);
 unsigned long ERR_get_error_line_data(const char **file, int *line,
         const char **data, int *flags);
 unsigned long ERR_peek_error_line_data(const char **file, int *line,
         const char **data, int *flags);

 int ERR_GET_LIB(unsigned long e);
 int ERR_GET_FUNC(unsigned long e);
 int ERR_GET_REASON(unsigned long e);

 void ERR_clear_error(void);

 char *ERR_error_string(unsigned long e, char *buf);
 const char *ERR_lib_error_string(unsigned long e);
 const char *ERR_func_error_string(unsigned long e);
 const char *ERR_reason_error_string(unsigned long e);

 void ERR_print_errors(BIO *bp);
 void ERR_print_errors_fp(FILE *fp);

 void ERR_load_crypto_strings(void);

 void ERR_put_error(int lib, int func, int reason, const char *file,
         int line);
 void ERR_add_error_data(int num, ...);

 void ERR_load_strings(int lib,ERR_STRING_DATA str[]);
 unsigned long ERR_PACK(int lib, int func, int reason);
 int ERR_get_next_error_library(void);

Deprecated:

 #if OPENSSL_API_COMPAT < 0x10000000L
 void ERR_remove_state(unsigned long pid);
 #endif

 #if OPENSSL_API_COMPAT < 0x10100000L
 void ERR_remove_thread_state(void *);
 #endif

 #if OPENSSL_API_COMPAT < 0x10100000L
 void ERR_free_strings(void)
 #endif


=head1 DESCRIPTION

When a call to the OpenSSL library fails, this is usually signaled
by the return value, and an error code is stored in an error queue
associated with the current thread. The B<err> library provides
functions to obtain these error codes and textual error messages.

The L<ERR_get_error(3)> manpage describes how to
access error codes.

Error codes contain information about where the error occurred, and
what went wrong. L<ERR_GET_LIB(3)> describes how to
extract this information. A method to obtain human-readable error
messages is described in L<ERR_error_string(3)>.

L<ERR_clear_error(3)> can be used to clear the
error queue.

=head1 ADDING NEW ERROR CODES TO OPENSSL

See L<ERR_put_error(3)> if you want to record error codes in the
OpenSSL error system from within your application.

The remainder of this section is of interest only if you want to add
new error codes to OpenSSL or add error codes from external libraries.

=head2 Reporting errors

Each sub-library has a specific macro XXXerr() that is used to report
errors. Its first argument is a function code B<XXX_F_...>, the second
argument is a reason code B<XXX_R_...>. Function codes are derived
from the function names; reason codes consist of textual error
descriptions. For example, the function ssl3_read_bytes() reports a
"handshake failure" as follows:

 SSLerr(SSL_F_SSL3_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE);

Function and reason codes should consist of upper case characters,
numbers and underscores only. The error file generation script translates
function codes into function names by looking in the header files
for an appropriate function name, if none is found it just uses
the capitalized form such as "SSL3_READ_BYTES" in the above example.

The trailing section of a reason code (after the "_R_") is translated
into lower case and underscores changed to spaces.

When you are using new function or reason codes, run B<make errors>.
The necessary B<#define>s will then automatically be added to the
sub-library's header file.

Although a library will normally report errors using its own specific
XXXerr macro, another library's macro can be used. This is normally
only done when a library wants to include ASN1 code which must use
the ASN1err() macro.

=head2 Adding new libraries

When adding a new sub-library to OpenSSL, assign it a library number
B<ERR_LIB_XXX>, define a macro XXXerr() (both in B<err.h>), add its
name to B<ERR_str_libraries[]> (in B<crypto/err/err.c>), and add
C<ERR_load_XXX_strings()> to the ERR_load_crypto_strings() function
(in B<crypto/err/err_all.c>). Finally, add an entry

 L      XXX     xxx.h   xxx_err.c

to B<crypto/err/openssl.ec>, and add B<xxx_err.c> to the Makefile.
Running B<make errors> will then generate a file B<xxx_err.c>, and
add all error codes used in the library to B<xxx.h>.

Additionally the library include file must have a certain form.
Typically it will initially look like this:

 #ifndef HEADER_XXX_H
 #define HEADER_XXX_H

 #ifdef __cplusplus
 extern "C" {
 #endif

 /* Include files */

 #include <openssl/bio.h>
 #include <openssl/x509.h>

 /* Macros, structures and function prototypes */


 /* BEGIN ERROR CODES */

The B<BEGIN ERROR CODES> sequence is used by the error code
generation script as the point to place new error codes, any text
after this point will be overwritten when B<make errors> is run.
The closing #endif etc will be automatically added by the script.

The generated C error code file B<xxx_err.c> will load the header
files B<stdio.h>, B<openssl/err.h> and B<openssl/xxx.h> so the
header file must load any additional header files containing any
definitions it uses.

=head1 USING ERROR CODES IN EXTERNAL LIBRARIES

It is also possible to use OpenSSL's error code scheme in external
libraries. The library needs to load its own codes and call the OpenSSL
error code insertion script B<mkerr.pl> explicitly to add codes to
the header file and generate the C error code file. This will normally
be done if the external library needs to generate new ASN1 structures
but it can also be used to add more general purpose error code handling.

=head1 INTERNALS

The error queues are stored in a thread-local storage with one B<ERR_STATE>
entry for each thread. ERR_get_state() returns the current thread's
B<ERR_STATE>. An B<ERR_STATE> can hold up to B<ERR_NUM_ERRORS> error
codes. When more error codes are added, the old ones are overwritten,
on the assumption that the most recent errors are most important.

Error strings are also stored in a hash table that can be obtained
by calling ERR_get_string_table(void).

=head1 SEE ALSO

L<CRYPTO_set_locking_callback(3)>,
L<ERR_get_error(3)>,
L<ERR_GET_LIB(3)>,
L<ERR_clear_error(3)>,
L<ERR_error_string(3)>,
L<ERR_print_errors(3)>,
L<ERR_load_crypto_strings(3)>,
L<ERR_put_error(3)>,
L<ERR_load_strings(3)>,
L<SSL_get_error(3)>

=head1 HISTORY

The ERR_load_crypto_strings() function was deprecated in OpenSSL 1.1.0 by
OPENSSL_init_crypto().

=head1 COPYRIGHT

Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the OpenSSL license (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
