=pod

=head1 NAME

ERR_get_error, ERR_peek_error, ERR_peek_last_error,
ERR_get_error_line, ERR_peek_error_line, ERR_peek_last_error_line,
ERR_peek_error_func, ERR_peek_last_error_func,
ERR_peek_error_data, ERR_peek_last_error_data,
ERR_get_error_all, ERR_peek_error_all, ERR_peek_last_error_all,
ERR_get_error_line_data, ERR_peek_error_line_data, ERR_peek_last_error_line_data
- obtain error code and data

=head1 SYNOPSIS

 #include <openssl/err.h>

 unsigned long ERR_get_error(void);
 unsigned long ERR_peek_error(void);
 unsigned long ERR_peek_last_error(void);

 unsigned long ERR_peek_error_line(const char **file, int *line);
 unsigned long ERR_peek_last_error_line(const char **file, int *line);

 unsigned long ERR_peek_error_func(const char **func);
 unsigned long ERR_peek_last_error_func(const char **func);

 unsigned long ERR_peek_error_data(const char **data, int *flags);
 unsigned long ERR_peek_last_error_data(const char **data, int *flags);

 unsigned long ERR_get_error_all(const char **file, int *line,
                                 const char **func,
                                 const char **data, int *flags);
 unsigned long ERR_peek_error_all(const char **file, int *line,
                                  const char **func,
                                  const char **data, int *flags);
 unsigned long ERR_peek_last_error_all(const char **file, int *line,
                                       const char *func,
                                       const char **data, int *flags);

The following functions have 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)>:

 unsigned long ERR_get_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);
 unsigned long ERR_peek_last_error_line_data(const char **file, int *line,
                                             const char **data, int *flags);

=head1 DESCRIPTION

ERR_get_error() returns the earliest error code from the thread's error
queue and removes the entry.  This function can be called repeatedly
until there are no more error codes to return.

ERR_peek_error() returns the earliest error code from the thread's
error queue without modifying it.

ERR_peek_last_error() returns the latest error code from the thread's
error queue without modifying it.

See L<ERR_GET_LIB(3)> for obtaining further specific information
such as the reason of the error,
and L<ERR_error_string(3)> for human-readable error messages.

ERR_get_error_all() is the same as ERR_get_error(), but on success it
additionally stores the filename, line number and function where the error
occurred in *I<file>, *I<line> and *I<func>, and also extra text and flags
in *I<data>, *I<flags>.  If any of those parameters are NULL, it will not
be changed.
An unset filename is indicated as "", i.e. an empty string.
An unset line number is indicated as 0.
An unset function name is indicated as "", i.e. an empty string.

A pointer returned this way by these functions and the ones below
is valid until the respective entry is overwritten in the error queue.

ERR_peek_error_line() and ERR_peek_last_error_line() are the same as
ERR_peek_error() and ERR_peek_last_error(), but on success they additionally
store the filename and line number where the error occurred in *I<file> and
*I<line>, as far as they are not NULL.
An unset filename is indicated as "", i.e., an empty string.
An unset line number is indicated as 0.

ERR_peek_error_func() and ERR_peek_last_error_func() are the same as
ERR_peek_error() and ERR_peek_last_error(), but on success they additionally
store the name of the function where the error occurred in *I<func>, unless
it is NULL.
An unset function name is indicated as "".

ERR_peek_error_data() and ERR_peek_last_error_data() are the same as
ERR_peek_error() and ERR_peek_last_error(), but on success they additionally
store additional data and flags associated with the error code in *I<data>
and *I<flags>, as far as they are not NULL.
Unset data is indicated as "".
In this case the value given for the flag is irrelevant (and equals 0).
*I<data> contains a string if *I<flags>&B<ERR_TXT_STRING> is true.

ERR_peek_error_all() and ERR_peek_last_error_all() are combinations of all
of the above.

ERR_get_error_line(), ERR_get_error_line_data(), ERR_peek_error_line_data()
and ERR_peek_last_error_line_data() are older variants of ERR_get_error_all(),
ERR_peek_error_all() and ERR_peek_last_error_all(), and may give confusing
results.  They should no longer be used and are therefore deprecated.

An application B<MUST NOT> free the *I<data> pointer (or any other pointers
returned by these functions) with OPENSSL_free() as freeing is handled
automatically by the error library.

=head1 RETURN VALUES

The error code, or 0 if there is no error in the queue.

=head1 SEE ALSO

L<ERR_error_string(3)>,
L<ERR_GET_LIB(3)>

=head1 HISTORY

ERR_peek_error_func(), ERR_peek_last_error_func(),
ERR_peek_error_data(), ERR_peek_last_error_data(),
ERR_peek_error_all() and ERR_peek_last_error_all()
were added in OpenSSL 3.0.

ERR_get_error_line(), ERR_get_error_line_data(), ERR_peek_error_line_data()
and ERR_peek_last_error_line_data() became deprecated 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
