New error printing function that gives the possibility to print the
authorRichard Levitte <levitte@openssl.org>
Sat, 23 Jun 2001 15:06:17 +0000 (15:06 +0000)
committerRichard Levitte <levitte@openssl.org>
Sat, 23 Jun 2001 15:06:17 +0000 (15:06 +0000)
errors through an arbitrary function.

crypto/err/err.h
crypto/err/err_prn.c

index 1de4620632b94b73f896d50d0f9f2405a7ba885f..0fb8e02650584e797e5b548d7bdfe229bc8253e7 100644 (file)
@@ -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
index 19aaa2891fc64d275497dbb6d7887769a886998e..b5895a4c6f9d2ba5420198055f5e811b1aac7fc0 100644 (file)
 #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,
-                       file,line,(flags&ERR_TXT_STRING)?data:"");
+               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);
                }
        }
+
+#ifndef OPENSSL_NO_FP_API
+static int print_fp(const char *str, size_t len, FILE *fp)
+       {
+       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
 
+static int print_bio(const char *str, size_t len, BIO *bp)
+       {
+       return BIO_write(bp, str, len);
+       }
 void ERR_print_errors(BIO *bp)
        {
-       unsigned long l;
-       char buf[256];
-       char buf2[256];
-       const char *file,*data;
-       int line,flags;
-       unsigned long es;
-
-       es=CRYPTO_thread_id();
-       while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0)
-               {
-               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);
-               }
+       ERR_print_errors_cb(
+               (int (*)(const char *, size_t, void *))print_bio,
+               (void *)bp);
        }
 
+