=pod

=for openssl foreign manual errno(3)

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

The following function has been deprecated since OpenSSL 3.0, and can be
hidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value,
see L<openssl_user_macros(7)>:

 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

=head3 OpenSSL library reports

Each OpenSSL sub-library has library code B<ERR_LIB_XXX> and has its own set
of reason codes B<XXX_R_...>.  These are both passed in combination to
ERR_raise() and ERR_raise_data(), and the combination ultimately produces
the correct error text for the reported error.

All these macros and the numbers they have as values are specific to
OpenSSL's libraries.  OpenSSL reason codes normally consist of textual error
descriptions. For example, the function ssl3_read_bytes() reports a
"handshake failure" as follows:

 ERR_raise(ERR_LIB_SSL, SSL_R_SSL_HANDSHAKE_FAILURE);

There are two exceptions:

=over 4

=item B<ERR_LIB_SYS>

This "library code" indicates that a system error is being reported.  In
this case, the reason code given to ERR_raise() and ERR_raise_data() I<must>
be L<errno(3)>.

 ERR_raise(ERR_LIB_SYS, errno);

=item B<ERR_R_XXX>

This set of error codes is considered global, and may be used in combination
with any sub-library code.

 ERR_raise(ERR_LIB_RSA, ERR_R_PASSED_INVALID_ARGUMENT);

=back

=head3 Other pieces of software

Other pieces of software that may want to use OpenSSL's error reporting
system, such as engines or applications, must normally get their own
numbers.

=over 4

=item *

To get a "library" code, call L<ERR_get_next_error_library(3)>; this gives
the calling code a dynamic number, usable for the duration of the process.

=item *

Reason codes for each such "library" are determined or generated by the
authors of that code.  They must be numbers in the range 1 to 524287 (in
other words, they must be nonzero unsigned 18 bit integers).

=back

The exceptions mentioned in L</OpenSSL library reports> above are valid for
other pieces of software, i.e. they may use B<ERR_LIB_SYS> to report system
errors:

 ERR_raise(ERR_LIB_SYS, errno);

... and they may use B<ERR_R_XXX> macros together with their own "library"
code.

 int app_lib_code = ERR_get_next_error_library();

 /* ... */

 ERR_raise(app_lib_code, ERR_R_PASSED_INVALID_ARGUMENT);

=begin comment

[These are OpenSSL specific recommendations]

Reason codes should consist of uppercase characters, numbers and underscores
only. The error file generation script translates the trailing section of a
reason code (after the "_R_") into lowercase with underscores changed to
spaces.

Although a library will normally report errors using its own specific
B<ERR_LIB_XXX> macro, another library's macro can be used, together with
that other library's reason codes. This is normally only done when a library
wants to include ASN1 code which must be combined with B<ERR_LIB_ASN1>
macro.

=end comment

=head1 RETURN VALUES

ERR_raise(), ERR_raise_data(), 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(), ERR_raise() and ERR_put_error() are implemented as macros.

=head1 SEE ALSO

L<ERR_load_strings(3)>, L<ERR_get_next_error_library(3)>

=head1 HISTORY

ERR_raise, ERR_raise_data, ERR_add_error_txt() and 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
