Commit 8ada6e77 authored by Richard Levitte's avatar Richard Levitte
Browse files

New error printing function that gives the possibility to print the

errors through an arbitrary function.
parent 7f657f34
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -249,6 +249,8 @@ void ERR_error_string_n(unsigned long e, char *buf, size_t len);
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_cb(int (*cb)(const char *str, size_t len, void *u),
			 void *u);
#ifndef OPENSSL_NO_FP_API
void ERR_print_errors_fp(FILE *fp);
#endif
+27 −23
Original line number Diff line number Diff line
@@ -64,11 +64,12 @@
#include <openssl/err.h>
#include <openssl/crypto.h>

#ifndef OPENSSL_NO_FP_API
void ERR_print_errors_fp(FILE *fp)
void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u),
			 void *u)
	{
	unsigned long l;
	char buf[200];
	char buf[256];
	char buf2[4096];
	const char *file,*data;
	int line,flags;
	unsigned long es;
@@ -77,31 +78,34 @@ void ERR_print_errors_fp(FILE *fp)
	while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0)
		{
		ERR_error_string_n(l, buf, sizeof buf);
		fprintf(fp,"%lu:%s:%s:%d:%s\n",es,buf,
		BIO_snprintf(buf2, sizeof(buf2), "%lu:%s:%s:%d:%s\n", es, buf,
			file, line, (flags & ERR_TXT_STRING) ? data : "");
		cb(buf2, strlen(buf2), u);
		}
	}
#endif

void ERR_print_errors(BIO *bp)
#ifndef OPENSSL_NO_FP_API
static int print_fp(const char *str, size_t len, FILE *fp)
	{
	unsigned long l;
	char buf[256];
	char buf2[256];
	const char *file,*data;
	int line,flags;
	unsigned long es;
	return fprintf(fp, "%s", str);
	}
void ERR_print_errors_fp(FILE *fp)
	{
	ERR_print_errors_cb(
		(int (*)(const char *, size_t, void *))print_fp,
		(void *)fp);
	}
#endif

	es=CRYPTO_thread_id();
	while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0)
static int print_bio(const char *str, size_t len, BIO *bp)
	{
		ERR_error_string_n(l, buf, sizeof buf);
		sprintf(buf2,"%lu:%s:%s:%d:",es,buf,
			file,line);
		BIO_write(bp,buf2,strlen(buf2));
		if (flags & ERR_TXT_STRING)
			BIO_write(bp,data,strlen(data));
		BIO_write(bp,"\n",1);
	return BIO_write(bp, str, len);
	}
void ERR_print_errors(BIO *bp)
	{
	ERR_print_errors_cb(
		(int (*)(const char *, size_t, void *))print_bio,
		(void *)bp);
	}