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

Deprecated since OpenSSL 3.0:

 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
