=pod

=head1 NAME

ERR_raise, ERR_raise_data,
ERR_put_error, ERR_add_error_data, ERR_add_error_vdata,
ERR_add_error_txt, ERR_add_error_mem_bio
- record an error

=head1 SYNOPSIS

 #include <openssl/err.h>

 void ERR_raise(int lib, int reason);
 void ERR_raise_data(int lib, int reason, const char *fmt, ...);

 void ERR_add_error_data(int num, ...);
 void ERR_add_error_vdata(int num, va_list arg);
 void ERR_add_error_txt(const char *sep, const char *txt);
 void ERR_add_error_mem_bio(const char *sep, BIO *bio);

Deprecated since OpenSSL 3.0:

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

=head1 DESCRIPTION

ERR_raise() adds a new error to the thread's error queue.  The
error occurred in the library B<lib> for the reason given by the
B<reason> code.  Furthermore, the name of the file, the line, and name
of the function where the error occurred is saved with the error
record.

ERR_raise_data() does the same thing as ERR_raise(), but also lets the
caller specify additional information as a format string B<fmt> and an
arbitrary number of values, which are processed with L<BIO_snprintf(3)>.  

ERR_put_error() adds an error code to the thread's error queue. It
signals that the error of reason code B<reason> occurred in function
B<func> of library B<lib>, in line number B<line> of B<file>.
This function is usually called by a macro.

ERR_add_error_data() associates the concatenation of its B<num> string
arguments as additional data with the error code added last.
ERR_add_error_vdata() is similar except the argument is a B<va_list>.
Multiple calls to these functions append to the current top of the error queue.
The total length of the string data per error is limited to 4096 characters.

ERR_add_error_txt() appends the given text string as additional data to the
last error queue entry, after inserting the optional separator string if it is
not NULL and the top error entry does not yet have additional data.
In case the separator is at the end of the text it is not appended to the data.
The B<sep> argument may be for instance "\n" to insert a line break when needed.
If the associated data would become more than 4096 characters long
(which is the limit given above)
it is split over sufficiently many new copies of the last error queue entry.

ERR_add_error_mem_bio() is the same as ERR_add_error_txt() except that
the text string is taken from the given memory BIO.
It appends '\0' to the BIO contents if not already NUL-terminated.

L<ERR_load_strings(3)> can be used to register
error strings so that the application can a generate human-readable
error messages for the error code.

=head2 Reporting errors

=for comment TODO(3.0) should this be internal documentation?

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 uppercase 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 lowercase and underscores changed to spaces.

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.


=head1 RETURN VALUES

ERR_raise(), ERR_put_error(),
ERR_add_error_data(), ERR_add_error_vdata()
ERR_add_error_txt(), and ERR_add_error_mem_bio()
return no values.

=head1 NOTES

ERR_raise() and ERR_put_error() are implemented as macros.

=head1 SEE ALSO

L<ERR_load_strings(3)>

=head1 HISTORY

B<ERR_add_error_txt> and B<ERR_add_error_mem_bio> were added in OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2000-2020 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
