summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/err
diff options
context:
space:
mode:
authorryker <>1998-10-05 20:13:14 +0000
committerryker <>1998-10-05 20:13:14 +0000
commitaeeae06a79815dc190061534d47236cec09f9e32 (patch)
tree851692b9c2f9c04f077666855641900f19fdb217 /src/lib/libcrypto/err
parenta4f79641824cbf9f60ca9d1168d1fcc46717a82a (diff)
downloadopenbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.gz
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.bz2
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.zip
Import of SSLeay-0.9.0b with RSA and IDEA stubbed + OpenBSD build
functionality for shared libs. Note that routines such as sslv2_init and friends that use RSA will not work due to lack of RSA in this library. Needs documentation and help from ports for easy upgrade to full functionality where legally possible.
Diffstat (limited to 'src/lib/libcrypto/err')
-rw-r--r--src/lib/libcrypto/err/err.c642
-rw-r--r--src/lib/libcrypto/err/err.h287
-rw-r--r--src/lib/libcrypto/err/err_all.c116
-rw-r--r--src/lib/libcrypto/err/err_prn.c107
4 files changed, 1152 insertions, 0 deletions
diff --git a/src/lib/libcrypto/err/err.c b/src/lib/libcrypto/err/err.c
new file mode 100644
index 0000000000..5aef6a1259
--- /dev/null
+++ b/src/lib/libcrypto/err/err.c
@@ -0,0 +1,642 @@
1/* crypto/err/err.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "lhash.h"
61#include "crypto.h"
62#include "cryptlib.h"
63#include "buffer.h"
64#include "err.h"
65#include "crypto.h"
66
67
68static LHASH *error_hash=NULL;
69static LHASH *thread_hash=NULL;
70
71#ifndef NOPROTO
72static unsigned long err_hash(ERR_STRING_DATA *a);
73static int err_cmp(ERR_STRING_DATA *a, ERR_STRING_DATA *b);
74static unsigned long pid_hash(ERR_STATE *pid);
75static int pid_cmp(ERR_STATE *a,ERR_STATE *pid);
76static unsigned long get_error_values(int inc,char **file,int *line,
77 char **data,int *flags);
78static void ERR_STATE_free(ERR_STATE *s);
79#else
80static unsigned long err_hash();
81static int err_cmp();
82static unsigned long pid_hash();
83static int pid_cmp();
84static void ERR_STATE_free();
85ERR_STATE *s;
86#endif
87
88#ifndef NO_ERR
89static ERR_STRING_DATA ERR_str_libraries[]=
90 {
91{ERR_PACK(ERR_LIB_NONE,0,0) ,"unknown library"},
92{ERR_PACK(ERR_LIB_SYS,0,0) ,"system library"},
93{ERR_PACK(ERR_LIB_BN,0,0) ,"bignum routines"},
94{ERR_PACK(ERR_LIB_RSA,0,0) ,"rsa routines"},
95{ERR_PACK(ERR_LIB_DH,0,0) ,"Diffie-Hellman routines"},
96{ERR_PACK(ERR_LIB_EVP,0,0) ,"digital envelope routines"},
97{ERR_PACK(ERR_LIB_BUF,0,0) ,"memory buffer routines"},
98{ERR_PACK(ERR_LIB_BIO,0,0) ,"BIO routines"},
99{ERR_PACK(ERR_LIB_OBJ,0,0) ,"object identifier routines"},
100{ERR_PACK(ERR_LIB_PEM,0,0) ,"PEM routines"},
101{ERR_PACK(ERR_LIB_ASN1,0,0) ,"asn1 encoding routines"},
102{ERR_PACK(ERR_LIB_X509,0,0) ,"x509 certificate routines"},
103{ERR_PACK(ERR_LIB_CONF,0,0) ,"configuation file routines"},
104{ERR_PACK(ERR_LIB_METH,0,0) ,"X509 lookup 'method' routines"},
105{ERR_PACK(ERR_LIB_SSL,0,0) ,"SSL routines"},
106{ERR_PACK(ERR_LIB_RSAREF,0,0) ,"RSAref routines"},
107{ERR_PACK(ERR_LIB_PROXY,0,0) ,"Proxy routines"},
108{ERR_PACK(ERR_LIB_BIO,0,0) ,"BIO routines"},
109{ERR_PACK(ERR_LIB_PKCS7,0,0) ,"PKCS7 routines"},
110{0,NULL},
111 };
112
113static ERR_STRING_DATA ERR_str_functs[]=
114 {
115 {ERR_PACK(0,SYS_F_FOPEN,0), "fopen"},
116 {ERR_PACK(0,SYS_F_CONNECT,0), "connect"},
117 {ERR_PACK(0,SYS_F_GETSERVBYNAME,0), "getservbyname"},
118 {ERR_PACK(0,SYS_F_SOCKET,0), "socket"},
119 {ERR_PACK(0,SYS_F_IOCTLSOCKET,0), "ioctlsocket"},
120 {ERR_PACK(0,SYS_F_BIND,0), "bind"},
121 {ERR_PACK(0,SYS_F_LISTEN,0), "listen"},
122 {ERR_PACK(0,SYS_F_ACCEPT,0), "accept"},
123#ifdef WINDOWS
124 {ERR_PACK(0,SYS_F_WSASTARTUP,0), "WSAstartup"},
125#endif
126 {0,NULL},
127 };
128
129static ERR_STRING_DATA ERR_str_reasons[]=
130 {
131{ERR_R_FATAL ,"fatal"},
132{ERR_R_SYS_LIB ,"system lib"},
133{ERR_R_BN_LIB ,"BN lib"},
134{ERR_R_RSA_LIB ,"RSA lib"},
135{ERR_R_DH_LIB ,"DH lib"},
136{ERR_R_EVP_LIB ,"EVP lib"},
137{ERR_R_BUF_LIB ,"BUF lib"},
138{ERR_R_BIO_LIB ,"BIO lib"},
139{ERR_R_OBJ_LIB ,"OBJ lib"},
140{ERR_R_PEM_LIB ,"PEM lib"},
141{ERR_R_X509_LIB ,"X509 lib"},
142{ERR_R_METH_LIB ,"METH lib"},
143{ERR_R_ASN1_LIB ,"ASN1 lib"},
144{ERR_R_CONF_LIB ,"CONF lib"},
145{ERR_R_SSL_LIB ,"SSL lib"},
146{ERR_R_PROXY_LIB ,"PROXY lib"},
147{ERR_R_BIO_LIB ,"BIO lib"},
148{ERR_R_PKCS7_LIB ,"PKCS7 lib"},
149{ERR_R_MALLOC_FAILURE ,"Malloc failure"},
150{ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED ,"called a fuction you should not call"},
151{0,NULL},
152 };
153#endif
154
155#define err_clear_data(p,i) \
156 if (((p)->err_data[i] != NULL) && \
157 (p)->err_data_flags[i] & ERR_TXT_MALLOCED) \
158 { \
159 Free((p)->err_data[i]); \
160 (p)->err_data[i]=NULL; \
161 } \
162 (p)->err_data_flags[i]=0;
163
164static void ERR_STATE_free(s)
165ERR_STATE *s;
166 {
167 int i;
168
169 for (i=0; i<ERR_NUM_ERRORS; i++)
170 {
171 err_clear_data(s,i);
172 }
173 Free(s);
174 }
175
176void ERR_load_ERR_strings()
177 {
178 static int init=1;
179
180 if (init)
181 {
182 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
183 if (init == 0)
184 {
185 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
186 return;
187 }
188 init=0;
189 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
190
191#ifndef NO_ERR
192 ERR_load_strings(0,ERR_str_libraries);
193 ERR_load_strings(0,ERR_str_reasons);
194 ERR_load_strings(ERR_LIB_SYS,ERR_str_functs);
195#endif
196 }
197 }
198
199void ERR_load_strings(lib,str)
200int lib;
201ERR_STRING_DATA *str;
202 {
203 if (error_hash == NULL)
204 {
205 CRYPTO_w_lock(CRYPTO_LOCK_ERR_HASH);
206 error_hash=lh_new(err_hash,err_cmp);
207 if (error_hash == NULL)
208 {
209 CRYPTO_w_unlock(CRYPTO_LOCK_ERR_HASH);
210 return;
211 }
212 CRYPTO_w_unlock(CRYPTO_LOCK_ERR_HASH);
213
214 ERR_load_ERR_strings();
215 }
216
217 CRYPTO_w_lock(CRYPTO_LOCK_ERR_HASH);
218 while (str->error)
219 {
220 str->error|=ERR_PACK(lib,0,0);
221 lh_insert(error_hash,(char *)str);
222 str++;
223 }
224 CRYPTO_w_unlock(CRYPTO_LOCK_ERR_HASH);
225 }
226
227void ERR_free_strings()
228 {
229 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
230
231 if (error_hash != NULL)
232 {
233 lh_free(error_hash);
234 error_hash=NULL;
235 }
236
237 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
238 }
239
240/********************************************************/
241
242void ERR_put_error(lib,func,reason,file,line)
243int lib,func,reason;
244char *file;
245int line;
246 {
247 ERR_STATE *es;
248
249 es=ERR_get_state();
250
251 es->top=(es->top+1)%ERR_NUM_ERRORS;
252 if (es->top == es->bottom)
253 es->bottom=(es->bottom+1)%ERR_NUM_ERRORS;
254 es->err_buffer[es->top]=ERR_PACK(lib,func,reason);
255 es->err_file[es->top]=file;
256 es->err_line[es->top]=line;
257 err_clear_data(es,es->top);
258 }
259
260void ERR_clear_error()
261 {
262 ERR_STATE *es;
263
264 es=ERR_get_state();
265
266#if 0
267 /* hmm... is this needed */
268 for (i=0; i<ERR_NUM_ERRORS; i++)
269 {
270 es->err_buffer[i]=0;
271 es->err_file[i]=NULL;
272 es->err_line[i]= -1;
273 err_clear_data(es,i);
274 }
275#endif
276 es->top=es->bottom=0;
277 }
278
279
280unsigned long ERR_get_error()
281 { return(get_error_values(1,NULL,NULL,NULL,NULL)); }
282
283unsigned long ERR_get_error_line(file,line)
284char **file;
285int *line;
286 { return(get_error_values(1,file,line,NULL,NULL)); }
287
288unsigned long ERR_get_error_line_data(file,line,data,flags)
289char **file;
290int *line;
291char **data;
292int *flags;
293 { return(get_error_values(1,file,line,data,flags)); }
294
295unsigned long ERR_peek_error()
296 { return(get_error_values(0,NULL,NULL,NULL,NULL)); }
297
298unsigned long ERR_peek_error_line(file,line)
299char **file;
300int *line;
301 { return(get_error_values(0,file,line,NULL,NULL)); }
302
303unsigned long ERR_peek_error_line_data(file,line,data,flags)
304char **file;
305int *line;
306char **data;
307int *flags;
308 { return(get_error_values(0,file,line,data,flags)); }
309
310static unsigned long get_error_values(inc,file,line,data,flags)
311int inc;
312char **file;
313int *line;
314char **data;
315int *flags;
316 {
317 int i=0;
318 ERR_STATE *es;
319 unsigned long ret;
320
321 es=ERR_get_state();
322
323 if (es->bottom == es->top) return(0);
324 i=(es->bottom+1)%ERR_NUM_ERRORS;
325
326 ret=es->err_buffer[i];
327 if (inc)
328 {
329 es->bottom=i;
330 es->err_buffer[i]=0;
331 }
332
333 if ((file != NULL) && (line != NULL))
334 {
335 if (es->err_file[i] == NULL)
336 {
337 *file="NA";
338 if (line != NULL) *line=0;
339 }
340 else
341 {
342 *file=es->err_file[i];
343 if (line != NULL) *line=es->err_line[i];
344 }
345 }
346
347 if (data != NULL)
348 {
349 if (es->err_data[i] == NULL)
350 {
351 *data="";
352 if (flags != NULL) *flags=0;
353 }
354 else
355 {
356 *data=es->err_data[i];
357 if (flags != NULL) *flags=es->err_data_flags[i];
358 }
359 }
360 return(ret);
361 }
362
363/* BAD for multi-threaded, uses a local buffer if ret == NULL */
364char *ERR_error_string(e,ret)
365unsigned long e;
366char *ret;
367 {
368 static char buf[256];
369 char *ls,*fs,*rs;
370 unsigned long l,f,r;
371 int i;
372
373 l=ERR_GET_LIB(e);
374 f=ERR_GET_FUNC(e);
375 r=ERR_GET_REASON(e);
376
377 ls=ERR_lib_error_string(e);
378 fs=ERR_func_error_string(e);
379 rs=ERR_reason_error_string(e);
380
381 if (ret == NULL) ret=buf;
382
383 sprintf(&(ret[0]),"error:%08lX:",e);
384 i=strlen(ret);
385 if (ls == NULL)
386 sprintf(&(ret[i]),":lib(%lu) ",l);
387 else sprintf(&(ret[i]),"%s",ls);
388 i=strlen(ret);
389 if (fs == NULL)
390 sprintf(&(ret[i]),":func(%lu) ",f);
391 else sprintf(&(ret[i]),":%s",fs);
392 i=strlen(ret);
393 if (rs == NULL)
394 sprintf(&(ret[i]),":reason(%lu)",r);
395 else sprintf(&(ret[i]),":%s",rs);
396
397 return(ret);
398 }
399
400LHASH *ERR_get_string_table()
401 {
402 return(error_hash);
403 }
404
405LHASH *ERR_get_err_state_table()
406 {
407 return(thread_hash);
408 }
409
410char *ERR_lib_error_string(e)
411unsigned long e;
412 {
413 ERR_STRING_DATA d,*p=NULL;
414 unsigned long l;
415
416 l=ERR_GET_LIB(e);
417
418 CRYPTO_r_lock(CRYPTO_LOCK_ERR_HASH);
419
420 if (error_hash != NULL)
421 {
422 d.error=ERR_PACK(l,0,0);
423 p=(ERR_STRING_DATA *)lh_retrieve(error_hash,(char *)&d);
424 }
425
426 CRYPTO_r_unlock(CRYPTO_LOCK_ERR_HASH);
427
428 return((p == NULL)?NULL:p->string);
429 }
430
431char *ERR_func_error_string(e)
432unsigned long e;
433 {
434 ERR_STRING_DATA d,*p=NULL;
435 unsigned long l,f;
436
437 l=ERR_GET_LIB(e);
438 f=ERR_GET_FUNC(e);
439
440 CRYPTO_r_lock(CRYPTO_LOCK_ERR_HASH);
441
442 if (error_hash != NULL)
443 {
444 d.error=ERR_PACK(l,f,0);
445 p=(ERR_STRING_DATA *)lh_retrieve(error_hash,(char *)&d);
446 }
447
448 CRYPTO_r_unlock(CRYPTO_LOCK_ERR_HASH);
449
450 return((p == NULL)?NULL:p->string);
451 }
452
453char *ERR_reason_error_string(e)
454unsigned long e;
455 {
456 ERR_STRING_DATA d,*p=NULL;
457 unsigned long l,r;
458
459 l=ERR_GET_LIB(e);
460 r=ERR_GET_REASON(e);
461
462 CRYPTO_r_lock(CRYPTO_LOCK_ERR_HASH);
463
464 if (error_hash != NULL)
465 {
466 d.error=ERR_PACK(l,0,r);
467 p=(ERR_STRING_DATA *)lh_retrieve(error_hash,(char *)&d);
468 if (p == NULL)
469 {
470 d.error=ERR_PACK(0,0,r);
471 p=(ERR_STRING_DATA *)lh_retrieve(error_hash,
472 (char *)&d);
473 }
474 }
475
476 CRYPTO_r_unlock(CRYPTO_LOCK_ERR_HASH);
477
478 return((p == NULL)?NULL:p->string);
479 }
480
481static unsigned long err_hash(a)
482ERR_STRING_DATA *a;
483 {
484 unsigned long ret,l;
485
486 l=a->error;
487 ret=l^ERR_GET_LIB(l)^ERR_GET_FUNC(l);
488 return(ret^ret%19*13);
489 }
490
491static int err_cmp(a,b)
492ERR_STRING_DATA *a,*b;
493 {
494 return((int)(a->error-b->error));
495 }
496
497static unsigned long pid_hash(a)
498ERR_STATE *a;
499 {
500 return(a->pid*13);
501 }
502
503static int pid_cmp(a,b)
504ERR_STATE *a,*b;
505 {
506 return((int)((long)a->pid - (long)b->pid));
507 }
508
509void ERR_remove_state(pid)
510unsigned long pid;
511 {
512 ERR_STATE *p,tmp;
513
514 if (thread_hash == NULL)
515 return;
516 if (pid == 0)
517 pid=(unsigned long)CRYPTO_thread_id();
518 tmp.pid=pid;
519 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
520 p=(ERR_STATE *)lh_delete(thread_hash,(char *)&tmp);
521 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
522
523 if (p != NULL) ERR_STATE_free(p);
524 }
525
526ERR_STATE *ERR_get_state()
527 {
528 static ERR_STATE fallback;
529 ERR_STATE *ret=NULL,tmp,*tmpp;
530 int i;
531 unsigned long pid;
532
533 pid=(unsigned long)CRYPTO_thread_id();
534
535 CRYPTO_r_lock(CRYPTO_LOCK_ERR);
536 if (thread_hash == NULL)
537 {
538 CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
539 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
540 if (thread_hash == NULL)
541 {
542 thread_hash=lh_new(pid_hash,pid_cmp);
543 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
544 if (thread_hash == NULL) return(&fallback);
545 }
546 else
547 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
548 }
549 else
550 {
551 tmp.pid=pid;
552 ret=(ERR_STATE *)lh_retrieve(thread_hash,(char *)&tmp);
553 CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
554 }
555
556 /* ret == the error state, if NULL, make a new one */
557 if (ret == NULL)
558 {
559 ret=(ERR_STATE *)Malloc(sizeof(ERR_STATE));
560 if (ret == NULL) return(&fallback);
561 ret->pid=pid;
562 ret->top=0;
563 ret->bottom=0;
564 for (i=0; i<ERR_NUM_ERRORS; i++)
565 {
566 ret->err_data[i]=NULL;
567 ret->err_data_flags[i]=0;
568 }
569 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
570 tmpp=(ERR_STATE *)lh_insert(thread_hash,(char *)ret);
571 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
572 if (tmpp != NULL) /* old entry - should not happen */
573 {
574 ERR_STATE_free(tmpp);
575 }
576 }
577 return(ret);
578 }
579
580int ERR_get_next_error_library()
581 {
582 static int value=ERR_LIB_USER;
583
584 return(value++);
585 }
586
587void ERR_set_error_data(data,flags)
588char *data;
589int flags;
590 {
591 ERR_STATE *es;
592 int i;
593
594 es=ERR_get_state();
595
596 i=es->top;
597 if (i == 0)
598 i=ERR_NUM_ERRORS-1;
599
600 es->err_data[i]=data;
601 es->err_data_flags[es->top]=flags;
602 }
603
604void ERR_add_error_data( VAR_PLIST(int , num))
605VAR_ALIST
606 {
607 VAR_BDEFN(args, int, num);
608 int i,n,s;
609 char *str,*p,*a;
610
611 s=64;
612 str=Malloc(s+1);
613 if (str == NULL) return;
614 str[0]='\0';
615
616 VAR_INIT(args,int,num);
617 n=0;
618 for (i=0; i<num; i++)
619 {
620 VAR_ARG(args,char *,a);
621 if (a != NULL) {
622 n+=strlen(a);
623 if (n > s)
624 {
625 s=n+20;
626 p=Realloc(str,s+1);
627 if (p == NULL)
628 {
629 Free(str);
630 return;
631 }
632 else
633 str=p;
634 }
635 strcat(str,a);
636 }
637 }
638 ERR_set_error_data(str,ERR_TXT_MALLOCED|ERR_TXT_STRING);
639
640 VAR_END( args );
641 }
642
diff --git a/src/lib/libcrypto/err/err.h b/src/lib/libcrypto/err/err.h
new file mode 100644
index 0000000000..75f931be11
--- /dev/null
+++ b/src/lib/libcrypto/err/err.h
@@ -0,0 +1,287 @@
1/* crypto/err/err.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#ifndef HEADER_ERR_H
60#define HEADER_ERR_H
61
62#ifdef __cplusplus
63extern "C" {
64#endif
65
66/* The following is a bit of a trick to help the object files only contain
67 * the 'name of the file' string once. Since 'err.h' is protected by the
68 * HEADER_ERR_H stuff, this should be included only once per file. */
69
70#define ERR_file_name __FILE__
71
72#ifndef NO_ERR
73#define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e)
74#else
75#define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0)
76#endif
77
78#include <errno.h>
79
80#define ERR_TXT_MALLOCED 0x01
81#define ERR_TXT_STRING 0x02
82
83#define ERR_NUM_ERRORS 16
84typedef struct err_state_st
85 {
86 unsigned long pid;
87 unsigned long err_buffer[ERR_NUM_ERRORS];
88 char *err_data[ERR_NUM_ERRORS];
89 int err_data_flags[ERR_NUM_ERRORS];
90 char *err_file[ERR_NUM_ERRORS];
91 int err_line[ERR_NUM_ERRORS];
92 int top,bottom;
93 } ERR_STATE;
94
95/* library */
96#define ERR_LIB_NONE 1
97#define ERR_LIB_SYS 2
98#define ERR_LIB_BN 3
99#define ERR_LIB_RSA 4
100#define ERR_LIB_DH 5
101#define ERR_LIB_EVP 6
102#define ERR_LIB_BUF 7
103#define ERR_LIB_OBJ 8
104#define ERR_LIB_PEM 9
105#define ERR_LIB_DSA 10
106#define ERR_LIB_X509 11
107#define ERR_LIB_METH 12
108#define ERR_LIB_ASN1 13
109#define ERR_LIB_CONF 14
110#define ERR_LIB_CRYPTO 15
111#define ERR_LIB_SSL 20
112#define ERR_LIB_SSL23 21
113#define ERR_LIB_SSL2 22
114#define ERR_LIB_SSL3 23
115#define ERR_LIB_RSAREF 30
116#define ERR_LIB_PROXY 31
117#define ERR_LIB_BIO 32
118#define ERR_LIB_PKCS7 33
119
120#define ERR_LIB_USER 128
121
122#define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),ERR_file_name,__LINE__)
123#define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),ERR_file_name,__LINE__)
124#define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),ERR_file_name,__LINE__)
125#define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),ERR_file_name,__LINE__)
126#define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),ERR_file_name,__LINE__)
127#define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),ERR_file_name,__LINE__)
128#define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),ERR_file_name,__LINE__)
129#define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),ERR_file_name,__LINE__)
130#define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),ERR_file_name,__LINE__)
131#define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),ERR_file_name,__LINE__)
132#define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),ERR_file_name,__LINE__)
133#define METHerr(f,r) ERR_PUT_error(ERR_LIB_METH,(f),(r),ERR_file_name,__LINE__)
134#define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),ERR_file_name,__LINE__)
135#define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),ERR_file_name,__LINE__)
136#define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),ERR_file_name,__LINE__)
137#define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),ERR_file_name,__LINE__)
138#define SSL23err(f,r) ERR_PUT_error(ERR_LIB_SSL23,(f),(r),ERR_file_name,__LINE__)
139#define SSL2err(f,r) ERR_PUT_error(ERR_LIB_SSL2,(f),(r),ERR_file_name,__LINE__)
140#define SSL3err(f,r) ERR_PUT_error(ERR_LIB_SSL3,(f),(r),ERR_file_name,__LINE__)
141#define RSAREFerr(f,r) ERR_PUT_error(ERR_LIB_RSAREF,(f),(r),ERR_file_name,__LINE__)
142#define PROXYerr(f,r) ERR_PUT_error(ERR_LIB_PROXY,(f),(r),ERR_file_name,__LINE__)
143#define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),ERR_file_name,__LINE__)
144
145/* Borland C seems too stupid to be able to shift and do longs in
146 * the pre-processor :-( */
147#define ERR_PACK(l,f,r) (((((unsigned long)l)&0xffL)*0x1000000)| \
148 ((((unsigned long)f)&0xfffL)*0x1000)| \
149 ((((unsigned long)r)&0xfffL)))
150#define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL)
151#define ERR_GET_FUNC(l) (int)((((unsigned long)l)>>12L)&0xfffL)
152#define ERR_GET_REASON(l) (int)((l)&0xfffL)
153#define ERR_FATAL_ERROR(l) (int)((l)&ERR_R_FATAL)
154
155/* OS fuctions */
156#define SYS_F_FOPEN 1
157#define SYS_F_CONNECT 2
158#define SYS_F_GETSERVBYNAME 3
159#define SYS_F_SOCKET 4
160#define SYS_F_IOCTLSOCKET 5
161#define SYS_F_BIND 6
162#define SYS_F_LISTEN 7
163#define SYS_F_ACCEPT 8
164#define SYS_F_WSASTARTUP 9 /* Winsock stuff */
165
166#define ERR_R_FATAL 32
167/* reasons */
168#define ERR_R_SYS_LIB ERR_LIB_SYS
169#define ERR_R_BN_LIB ERR_LIB_BN
170#define ERR_R_RSA_LIB ERR_LIB_RSA
171#define ERR_R_DSA_LIB ERR_LIB_DSA
172#define ERR_R_DH_LIB ERR_LIB_DH
173#define ERR_R_EVP_LIB ERR_LIB_EVP
174#define ERR_R_BUF_LIB ERR_LIB_BUF
175#define ERR_R_BIO_LIB ERR_LIB_BIO
176#define ERR_R_OBJ_LIB ERR_LIB_OBJ
177#define ERR_R_PEM_LIB ERR_LIB_PEM
178#define ERR_R_X509_LIB ERR_LIB_X509
179#define ERR_R_METH_LIB ERR_LIB_METH
180#define ERR_R_ASN1_LIB ERR_LIB_ASN1
181#define ERR_R_CONF_LIB ERR_LIB_CONF
182#define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO
183#define ERR_R_SSL_LIB ERR_LIB_SSL
184#define ERR_R_SSL23_LIB ERR_LIB_SSL23
185#define ERR_R_SSL2_LIB ERR_LIB_SSL2
186#define ERR_R_SSL3_LIB ERR_LIB_SSL3
187#define ERR_R_PROXY_LIB ERR_LIB_PROXY
188#define ERR_R_BIO_LIB ERR_LIB_BIO
189#define ERR_R_PKCS7_LIB ERR_LIB_PKCS7
190
191/* fatal error */
192#define ERR_R_MALLOC_FAILURE (1|ERR_R_FATAL)
193#define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (2|ERR_R_FATAL)
194#define ERR_R_PASSED_NULL_PARAMETER (3|ERR_R_FATAL)
195
196typedef struct ERR_string_data_st
197 {
198 unsigned long error;
199 char *string;
200 } ERR_STRING_DATA;
201
202#ifndef NOPROTO
203void ERR_put_error(int lib, int func,int reason,char *file,int line);
204void ERR_set_error_data(char *data,int flags);
205
206unsigned long ERR_get_error(void );
207unsigned long ERR_get_error_line(char **file,int *line);
208unsigned long ERR_get_error_line_data(char **file,int *line,
209 char **data, int *flags);
210unsigned long ERR_peek_error(void );
211unsigned long ERR_peek_error_line(char **file,int *line);
212unsigned long ERR_peek_error_line_data(char **file,int *line,
213 char **data,int *flags);
214void ERR_clear_error(void );
215char *ERR_error_string(unsigned long e,char *buf);
216char *ERR_lib_error_string(unsigned long e);
217char *ERR_func_error_string(unsigned long e);
218char *ERR_reason_error_string(unsigned long e);
219#ifndef NO_FP_API
220void ERR_print_errors_fp(FILE *fp);
221#endif
222#ifdef HEADER_BIO_H
223void ERR_print_errors(BIO *bp);
224void ERR_add_error_data( VAR_PLIST( int, num ) );
225#endif
226void ERR_load_strings(int lib,ERR_STRING_DATA str[]);
227void ERR_load_ERR_strings(void );
228void ERR_load_crypto_strings(void );
229void ERR_free_strings(void );
230
231void ERR_remove_state(unsigned long pid); /* if zero we look it up */
232ERR_STATE *ERR_get_state(void);
233
234#ifdef HEADER_LHASH_H
235LHASH *ERR_get_string_table(void );
236LHASH *ERR_get_err_state_table(void );
237#else
238char *ERR_get_string_table(void );
239char *ERR_get_err_state_table(void );
240#endif
241
242int ERR_get_next_error_library(void );
243
244#else
245
246void ERR_put_error();
247void ERR_set_error_data();
248
249unsigned long ERR_get_error();
250unsigned long ERR_get_error_line();
251unsigned long ERR_peek_error();
252unsigned long ERR_peek_error_line();
253void ERR_clear_error();
254char *ERR_error_string();
255char *ERR_lib_error_string();
256char *ERR_func_error_string();
257char *ERR_reason_error_string();
258#ifndef NO_FP_API
259void ERR_print_errors_fp();
260#endif
261void ERR_print_errors();
262void ERR_add_error_data();
263void ERR_load_strings();
264void ERR_load_ERR_strings();
265void ERR_load_crypto_strings();
266void ERR_free_strings();
267
268void ERR_remove_state();
269ERR_STATE *ERR_get_state();
270
271#ifdef HEADER_LHASH_H
272LHASH *ERR_get_string_table();
273LHASH *ERR_get_err_state_table();
274#else
275char *ERR_get_string_table();
276char *ERR_get_err_state_table();
277#endif
278
279int ERR_get_next_error_library();
280
281#endif
282
283#ifdef __cplusplus
284}
285#endif
286
287#endif
diff --git a/src/lib/libcrypto/err/err_all.c b/src/lib/libcrypto/err/err_all.c
new file mode 100644
index 0000000000..f874268e1a
--- /dev/null
+++ b/src/lib/libcrypto/err/err_all.c
@@ -0,0 +1,116 @@
1/* crypto/err/err_all.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "asn1.h"
61#include "bn.h"
62#include "buffer.h"
63#include "bio.h"
64#ifndef NO_RSA
65#include "rsa.h"
66#endif
67#ifdef RSAref
68#include "rsaref.h"
69#endif
70#ifndef NO_DH
71#include "dh.h"
72#endif
73#ifndef NO_DSA
74#include "dsa.h"
75#endif
76#include "evp.h"
77#include "objects.h"
78#include "pem.h"
79#include "x509.h"
80#include "conf.h"
81#include "err.h"
82
83void ERR_load_crypto_strings()
84 {
85 static int done=0;
86
87 if (done) return;
88 done=1;
89#ifndef NO_ERR
90 ERR_load_ASN1_strings();
91 ERR_load_BN_strings();
92 ERR_load_BUF_strings();
93 ERR_load_BIO_strings();
94 ERR_load_CONF_strings();
95#ifndef NO_RSA
96#ifdef RSAref
97 ERR_load_RSAREF_strings();
98#else
99 ERR_load_RSA_strings();
100#endif
101#endif
102#ifndef NO_DH
103 ERR_load_DH_strings();
104#endif
105#ifndef NO_DSA
106 ERR_load_DSA_strings();
107#endif
108 ERR_load_ERR_strings();
109 ERR_load_EVP_strings();
110 ERR_load_OBJ_strings();
111 ERR_load_PEM_strings();
112 ERR_load_X509_strings();
113 ERR_load_CRYPTO_strings();
114 ERR_load_PKCS7_strings();
115#endif
116 }
diff --git a/src/lib/libcrypto/err/err_prn.c b/src/lib/libcrypto/err/err_prn.c
new file mode 100644
index 0000000000..ecd0e7c4fa
--- /dev/null
+++ b/src/lib/libcrypto/err/err_prn.c
@@ -0,0 +1,107 @@
1/* crypto/err/err_prn.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "lhash.h"
61#include "crypto.h"
62#include "cryptlib.h"
63#include "buffer.h"
64#include "err.h"
65#include "crypto.h"
66
67#ifndef NO_FP_API
68void ERR_print_errors_fp(fp)
69FILE *fp;
70 {
71 unsigned long l;
72 char buf[200];
73 char *file,*data;
74 int line,flags;
75 unsigned long es;
76
77 es=CRYPTO_thread_id();
78 while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0)
79 {
80 fprintf(fp,"%lu:%s:%s:%d:%s\n",es,ERR_error_string(l,buf),
81 file,line,(flags&ERR_TXT_STRING)?data:"");
82 }
83 }
84#endif
85
86void ERR_print_errors(bp)
87BIO *bp;
88 {
89 unsigned long l;
90 char buf[256];
91 char buf2[256];
92 char *file,*data;
93 int line,flags;
94 unsigned long es;
95
96 es=CRYPTO_thread_id();
97 while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0)
98 {
99 sprintf(buf2,"%lu:%s:%s:%d:",es,ERR_error_string(l,buf),
100 file,line);
101 BIO_write(bp,buf2,strlen(buf2));
102 if (flags & ERR_TXT_STRING)
103 BIO_write(bp,data,strlen(data));
104 BIO_write(bp,"\n",1);
105 }
106 }
107