
1: #!/usr/local/bin/perl -w 2: 3: my $config = "crypto/err/openssl.ec"; 4: my $debug = 0; 5: my $rebuild = 0; 6: my $static = 1; 7: my $recurse = 0; 8: my $reindex = 0; 9: my $dowrite = 0; 10: my $staticloader = ""; 11: 12: my $pack_errcode; 13: my $load_errcode; 14: 15: while (@ARGV) { 16: my $arg = $ARGV[0]; 17: if($arg eq "-conf") { 18: shift @ARGV; 19: $config = shift @ARGV; 20: } elsif($arg eq "-debug") { 21: $debug = 1; 22: shift @ARGV; 23: } elsif($arg eq "-rebuild") { 24: $rebuild = 1; 25: shift @ARGV; 26: } elsif($arg eq "-recurse") { 27: $recurse = 1; 28: shift @ARGV; 29: } elsif($arg eq "-reindex") { 30: $reindex = 1; 31: shift @ARGV; 32: } elsif($arg eq "-nostatic") { 33: $static = 0; 34: shift @ARGV; 35: } elsif($arg eq "-staticloader") { 36: $staticloader = "static "; 37: shift @ARGV; 38: } elsif($arg eq "-write") { 39: $dowrite = 1; 40: shift @ARGV; 41: } else { 42: last; 43: } 44: } 45: 46: if($recurse) { 47: @source = (<crypto/*.c>, <crypto/*/*.c>, <ssl/*.c>); 48: } else { 49: @source = @ARGV; 50: } 51: 52: # Read in the config file 53: 54: open(IN, "<$config") || die "Can't open config file $config"; 55: 56: # Parse config file 57: 58: while(<IN>) 59: { 60: if(/^L\s+(\S+)\s+(\S+)\s+(\S+)/) { 61: $hinc{$1} = $2; 62: $libinc{$2} = $1; 63: $cskip{$3} = $1; 64: if($3 ne "NONE") { 65: $csrc{$1} = $3; 66: $fmax{$1} = 99; 67: $rmax{$1} = 99; 68: $fassigned{$1} = ":"; 69: $rassigned{$1} = ":"; 70: $fnew{$1} = 0; 71: $rnew{$1} = 0; 72: } 73: } elsif (/^F\s+(\S+)/) { 74: # Add extra function with $1 75: } elsif (/^R\s+(\S+)\s+(\S+)/) { 76: $rextra{$1} = $2; 77: $rcodes{$1} = $2; 78: } 79: } 80: 81: close IN; 82: 83: # Scan each header file in turn and make a list of error codes 84: # and function names 85: 86: while (($hdr, $lib) = each %libinc) 87: { 88: next if($hdr eq "NONE"); 89: print STDERR "Scanning header file $hdr\n" if $debug; 90: my $line = "", $def= "", $linenr = 0, $gotfile = 0; 91: if (open(IN, "<$hdr")) { 92: $gotfile = 1; 93: while(<IN>) { 94: $linenr++; 95: print STDERR "line: $linenr\r" if $debug; 96: 97: last if(/BEGIN\s+ERROR\s+CODES/); 98: if ($line ne '') { 99: $_ = $line . $_; 100: $line = ''; 101: } 102: 103: if (/\\$/) { 104: $line = $_; 105: next; 106: } 107: 108: if(/\/\*/) { 109: if (not /\*\//) { # multiline comment... 110: $line = $_; # ... just accumulate 111: next; 112: } else { 113: s/\/\*.*?\*\///gs; # wipe it 114: } 115: } 116: 117: if ($cpp) { 118: $cpp++ if /^#\s*if/; 119: $cpp-- if /^#\s*endif/; 120: next; 121: } 122: $cpp = 1 if /^#.*ifdef.*cplusplus/; # skip "C" declaration 123: 124: next if (/^\#/); # skip preprocessor directives 125: 126: s/{[^{}]*}//gs; # ignore {} blocks 127: 128: if (/\{|\/\*/) { # Add a } so editor works... 129: $line = $_; 130: } else { 131: $def .= $_; 132: } 133: } 134: } 135: 136: print STDERR " \r" if $debug; 137: $defnr = 0; 138: # Delete any DECLARE_ macros 139: $def =~ s/DECLARE_\w+\([\w,\s]+\)//gs; 140: foreach (split /;/, $def) { 141: $defnr++; 142: print STDERR "def: $defnr\r" if $debug; 143: 144: # The goal is to collect function names from function declarations. 145: 146: s/^[\n\s]*//g; 147: s/[\n\s]*$//g; 148: 149: # Skip over recognized non-function declarations 150: next if(/typedef\W/ or /DECLARE_STACK_OF/ or /TYPEDEF_.*_OF/); 151: 152: # Remove STACK_OF(foo) 153: s/STACK_OF\(\w+\)/void/; 154: 155: # Reduce argument lists to empty () 156: # fold round brackets recursively: (t(*v)(t),t) -> (t{}{},t) -> {} 157: while(/\(.*\)/s) { 158: s/\([^\(\)]+\)/\{\}/gs; 159: s/\(\s*\*\s*(\w+)\s*\{\}\s*\)/$1/gs; #(*f{}) -> f 160: } 161: # pretend as we didn't use curly braces: {} -> () 162: s/\{\}/\(\)/gs; 163: 164: if (/(\w+)\s*\(\).*/s) { # first token prior [first] () is 165: my $name = $1; # a function name! 166: $name =~ tr/[a-z]/[A-Z]/; 167: $ftrans{$name} = $1; 168: } elsif (/[\(\)]/ and not (/=/)) { 169: print STDERR "Header $hdr: cannot parse: $_;\n"; 170: } 171: } 172: 173: print STDERR " \r" if $debug; 174: 175: next if $reindex; 176: 177: # Scan function and reason codes and store them: keep a note of the 178: # maximum code used. 179: 180: if ($gotfile) { 181: while(<IN>) { 182: if(/^\#define\s+(\S+)\s+(\S+)/) { 183: $name = $1; 184: $code = $2; 185: next if $name =~ /^${lib}err/; 186: unless($name =~ /^${lib}_([RF])_(\w+)$/) { 187: print STDERR "Invalid error code $name\n"; 188: next; 189: } 190: if($1 eq "R") { 191: $rcodes{$name} = $code; 192: if ($rassigned{$lib} =~ /:$code:/) { 193: print STDERR "!! ERROR: $lib reason code $code assigned twice\n"; 194: } 195: $rassigned{$lib} .= "$code:"; 196: if(!(exists $rextra{$name}) && 197: ($code > $rmax{$lib}) ) { 198: $rmax{$lib} = $code; 199: } 200: } else { 201: if ($fassigned{$lib} =~ /:$code:/) { 202: print STDERR "!! ERROR: $lib function code $code assigned twice\n"; 203: } 204: $fassigned{$lib} .= "$code:"; 205: if($code > $fmax{$lib}) { 206: $fmax{$lib} = $code; 207: } 208: $fcodes{$name} = $code; 209: } 210: } 211: } 212: } 213: 214: if ($debug) { 215: if (defined($fmax{$lib})) { 216: print STDERR "Max function code fmax" . "{" . "$lib" . "} = $fmax{$lib}\n"; 217: $fassigned{$lib} =~ m/^:(.*):$/; 218: @fassigned = sort {$a <=> $b} split(":", $1); 219: print STDERR " @fassigned\n"; 220: } 221: if (defined($rmax{$lib})) { 222: print STDERR "Max reason code rmax" . "{" . "$lib" . "} = $rmax{$lib}\n"; 223: $rassigned{$lib} =~ m/^:(.*):$/; 224: @rassigned = sort {$a <=> $b} split(":", $1); 225: print STDERR " @rassigned\n"; 226: } 227: } 228: 229: if ($lib eq "SSL") { 230: if ($rmax{$lib} >= 1000) { 231: print STDERR "!! ERROR: SSL error codes 1000+ are reserved for alerts.\n"; 232: print STDERR "!! Any new alerts must be added to $config.\n"; 233: print STDERR "\n"; 234: } 235: } 236: close IN; 237: } 238: 239: # Scan each C source file and look for function and reason codes 240: # This is done by looking for strings that "look like" function or 241: # reason codes: basically anything consisting of all upper case and 242: # numerics which has _F_ or _R_ in it and which has the name of an 243: # error library at the start. This seems to work fine except for the 244: # oddly named structure BIO_F_CTX which needs to be ignored. 245: # If a code doesn't exist in list compiled from headers then mark it 246: # with the value "X" as a place holder to give it a value later. 247: # Store all function and reason codes found in %ufcodes and %urcodes 248: # so all those unreferenced can be printed out. 249: 250: 251: foreach $file (@source) { 252: # Don't parse the error source file. 253: next if exists $cskip{$file}; 254: print STDERR "File loaded: ".$file."\r" if $debug; 255: open(IN, "<$file") || die "Can't open source file $file\n"; 256: while(<IN>) { 257: if(/(([A-Z0-9]+)_F_([A-Z0-9_]+))/) { 258: next unless exists $csrc{$2}; 259: next if($1 eq "BIO_F_BUFFER_CTX"); 260: $ufcodes{$1} = 1; 261: if(!exists $fcodes{$1}) { 262: $fcodes{$1} = "X"; 263: $fnew{$2}++; 264: } 265: $notrans{$1} = 1 unless exists $ftrans{$3}; 266: } 267: if(/(([A-Z0-9]+)_R_[A-Z0-9_]+)/) { 268: next unless exists $csrc{$2}; 269: $urcodes{$1} = 1; 270: if(!exists $rcodes{$1}) { 271: $rcodes{$1} = "X"; 272: $rnew{$2}++; 273: } 274: } 275: } 276: close IN; 277: } 278: print STDERR " \n" if $debug; 279: 280: # Now process each library in turn. 281: 282: foreach $lib (keys %csrc) 283: { 284: my $hfile = $hinc{$lib}; 285: my $cfile = $csrc{$lib}; 286: if(!$fnew{$lib} && !$rnew{$lib}) { 287: print STDERR "$lib:\t\tNo new error codes\n"; 288: next unless $rebuild; 289: } else { 290: print STDERR "$lib:\t\t$fnew{$lib} New Functions,"; 291: print STDERR " $rnew{$lib} New Reasons.\n"; 292: next unless $dowrite; 293: } 294: 295: # If we get here then we have some new error codes so we 296: # need to rebuild the header file and C file. 297: 298: # Make a sorted list of error and reason codes for later use. 299: 300: my @function = sort grep(/^${lib}_/,keys %fcodes); 301: my @reasons = sort grep(/^${lib}_/,keys %rcodes); 302: 303: # Rewrite the header file 304: 305: if (open(IN, "<$hfile")) { 306: # Copy across the old file 307: while(<IN>) { 308: push @out, $_; 309: last if (/BEGIN ERROR CODES/); 310: } 311: close IN; 312: } else { 313: push @out, 314: "/* ====================================================================\n", 315: " * Copyright (c) 2001-2007 The OpenSSL Project. All rights reserved.\n", 316: " *\n", 317: " * Redistribution and use in source and binary forms, with or without\n", 318: " * modification, are permitted provided that the following conditions\n", 319: " * are met:\n", 320: " *\n", 321: " * 1. Redistributions of source code must retain the above copyright\n", 322: " * notice, this list of conditions and the following disclaimer. \n", 323: " *\n", 324: " * 2. Redistributions in binary form must reproduce the above copyright\n", 325: " * notice, this list of conditions and the following disclaimer in\n", 326: " * the documentation and/or other materials provided with the\n", 327: " * distribution.\n", 328: " *\n", 329: " * 3. All advertising materials mentioning features or use of this\n", 330: " * software must display the following acknowledgment:\n", 331: " * \"This product includes software developed by the OpenSSL Project\n", 332: " * for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"\n", 333: " *\n", 334: " * 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to\n", 335: " * endorse or promote products derived from this software without\n", 336: " * prior written permission. For written permission, please contact\n", 337: " * openssl-core\@openssl.org.\n", 338: " *\n", 339: " * 5. Products derived from this software may not be called \"OpenSSL\"\n", 340: " * nor may \"OpenSSL\" appear in their names without prior written\n", 341: " * permission of the OpenSSL Project.\n", 342: " *\n", 343: " * 6. Redistributions of any form whatsoever must retain the following\n", 344: " * acknowledgment:\n", 345: " * \"This product includes software developed by the OpenSSL Project\n", 346: " * for use in the OpenSSL Toolkit (http://www.openssl.org/)\"\n", 347: " *\n", 348: " * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\n", 349: " * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n", 350: " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n", 351: " * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR\n", 352: " * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n", 353: " * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n", 354: " * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n", 355: " * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n", 356: " * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n", 357: " * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n", 358: " * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n", 359: " * OF THE POSSIBILITY OF SUCH DAMAGE.\n", 360: " * ====================================================================\n", 361: " *\n", 362: " * This product includes cryptographic software written by Eric Young\n", 363: " * (eay\@cryptsoft.com). This product includes software written by Tim\n", 364: " * Hudson (tjh\@cryptsoft.com).\n", 365: " *\n", 366: " */\n", 367: "\n", 368: "#ifndef HEADER_${lib}_ERR_H\n", 369: "#define HEADER_${lib}_ERR_H\n", 370: "\n", 371: "/* BEGIN ERROR CODES */\n"; 372: } 373: open (OUT, ">$hfile") || die "Can't Open File $hfile for writing\n"; 374: 375: print OUT @out; 376: undef @out; 377: print OUT <<"EOF"; 378: /* The following lines are auto generated by the script mkerr.pl. Any changes 379: * made after this point may be overwritten when the script is next run. 380: */ 381: EOF 382: if($static) { 383: print OUT <<"EOF"; 384: ${staticloader}void ERR_load_${lib}_strings(void); 385: 386: EOF 387: } else { 388: print OUT <<"EOF"; 389: ${staticloader}void ERR_load_${lib}_strings(void); 390: ${staticloader}void ERR_unload_${lib}_strings(void); 391: ${staticloader}void ERR_${lib}_error(int function, int reason, char *file, int line); 392: #define ${lib}err(f,r) ERR_${lib}_error((f),(r),__FILE__,__LINE__) 393: 394: EOF 395: } 396: print OUT <<"EOF"; 397: /* Error codes for the $lib functions. */ 398: 399: /* Function codes. */ 400: EOF 401: 402: foreach $i (@function) { 403: $z=6-int(length($i)/8); 404: if($fcodes{$i} eq "X") { 405: $fassigned{$lib} =~ m/^:([^:]*):/; 406: $findcode = $1; 407: if (!defined($findcode)) { 408: $findcode = $fmax{$lib}; 409: } 410: while ($fassigned{$lib} =~ m/:$findcode:/) { 411: $findcode++; 412: } 413: $fcodes{$i} = $findcode; 414: $fassigned{$lib} .= "$findcode:"; 415: print STDERR "New Function code $i\n" if $debug; 416: } 417: printf OUT "#define $i%s $fcodes{$i}\n","\t" x $z; 418: } 419: 420: print OUT "\n/* Reason codes. */\n"; 421: 422: foreach $i (@reasons) { 423: $z=6-int(length($i)/8); 424: if($rcodes{$i} eq "X") { 425: $rassigned{$lib} =~ m/^:([^:]*):/; 426: $findcode = $1; 427: if (!defined($findcode)) { 428: $findcode = $rmax{$lib}; 429: } 430: while ($rassigned{$lib} =~ m/:$findcode:/) { 431: $findcode++; 432: } 433: $rcodes{$i} = $findcode; 434: $rassigned{$lib} .= "$findcode:"; 435: print STDERR "New Reason code $i\n" if $debug; 436: } 437: printf OUT "#define $i%s $rcodes{$i}\n","\t" x $z; 438: } 439: print OUT <<"EOF"; 440: 441: #ifdef __cplusplus 442: } 443: #endif 444: #endif 445: EOF 446: close OUT; 447: 448: # Rewrite the C source file containing the error details. 449: 450: # First, read any existing reason string definitions: 451: my %err_reason_strings; 452: if (open(IN,"<$cfile")) { 453: while (<IN>) { 454: if (/\b(${lib}_R_\w*)\b.*\"(.*)\"/) { 455: $err_reason_strings{$1} = $2; 456: } 457: } 458: close(IN); 459: } 460: 461: my $hincf; 462: if($static) { 463: $hfile =~ /([^\/]+)$/; 464: $hincf = "<openssl/$1>"; 465: } else { 466: $hincf = "\"$hfile\""; 467: } 468: 469: # If static we know the error code at compile time so use it 470: # in error definitions. 471: 472: if ($static) 473: { 474: $pack_errcode = "ERR_LIB_${lib}"; 475: $load_errcode = "0"; 476: } 477: else 478: { 479: $pack_errcode = "0"; 480: $load_errcode = "ERR_LIB_${lib}"; 481: } 482: 483: 484: open (OUT,">$cfile") || die "Can't open $cfile for writing"; 485: 486: print OUT <<"EOF"; 487: /* $cfile */ 488: /* ==================================================================== 489: * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. 490: * 491: * Redistribution and use in source and binary forms, with or without 492: * modification, are permitted provided that the following conditions 493: * are met: 494: * 495: * 1. Redistributions of source code must retain the above copyright 496: * notice, this list of conditions and the following disclaimer. 497: * 498: * 2. Redistributions in binary form must reproduce the above copyright 499: * notice, this list of conditions and the following disclaimer in 500: * the documentation and/or other materials provided with the 501: * distribution. 502: * 503: * 3. All advertising materials mentioning features or use of this 504: * software must display the following acknowledgment: 505: * "This product includes software developed by the OpenSSL Project 506: * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 507: * 508: * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 509: * endorse or promote products derived from this software without 510: * prior written permission. For written permission, please contact 511: * openssl-core\@OpenSSL.org. 512: * 513: * 5. Products derived from this software may not be called "OpenSSL" 514: * nor may "OpenSSL" appear in their names without prior written 515: * permission of the OpenSSL Project. 516: * 517: * 6. Redistributions of any form whatsoever must retain the following 518: * acknowledgment: 519: * "This product includes software developed by the OpenSSL Project 520: * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 521: * 522: * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 523: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 524: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 525: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 526: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 527: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 528: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 529: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 530: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 531: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 532: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 533: * OF THE POSSIBILITY OF SUCH DAMAGE. 534: * ==================================================================== 535: * 536: * This product includes cryptographic software written by Eric Young 537: * (eay\@cryptsoft.com). This product includes software written by Tim 538: * Hudson (tjh\@cryptsoft.com). 539: * 540: */ 541: 542: /* NOTE: this file was auto generated by the mkerr.pl script: any changes 543: * made to it will be overwritten when the script next updates this file, 544: * only reason strings will be preserved. 545: */ 546: 547: #include <stdio.h> 548: #include <openssl/err.h> 549: #include $hincf 550: 551: /* BEGIN ERROR CODES */ 552: #ifndef OPENSSL_NO_ERR 553: 554: #define ERR_FUNC(func) ERR_PACK($pack_errcode,func,0) 555: #define ERR_REASON(reason) ERR_PACK($pack_errcode,0,reason) 556: 557: static ERR_STRING_DATA ${lib}_str_functs[]= 558: { 559: EOF 560: # Add each function code: if a function name is found then use it. 561: foreach $i (@function) { 562: my $fn; 563: $i =~ /^${lib}_F_(\S+)$/; 564: $fn = $1; 565: if(exists $ftrans{$fn}) { 566: $fn = $ftrans{$fn}; 567: } 568: # print OUT "{ERR_PACK($pack_errcode,$i,0),\t\"$fn\"},\n"; 569: print OUT "{ERR_FUNC($i),\t\"$fn\"},\n"; 570: } 571: print OUT <<"EOF"; 572: {0,NULL} 573: }; 574: 575: static ERR_STRING_DATA ${lib}_str_reasons[]= 576: { 577: EOF 578: # Add each reason code. 579: foreach $i (@reasons) { 580: my $rn; 581: my $rstr = "ERR_REASON($i)"; 582: my $nspc = 0; 583: if (exists $err_reason_strings{$i}) { 584: $rn = $err_reason_strings{$i}; 585: } else { 586: $i =~ /^${lib}_R_(\S+)$/; 587: $rn = $1; 588: $rn =~ tr/_[A-Z]/ [a-z]/; 589: } 590: $nspc = 40 - length($rstr) unless length($rstr) > 40; 591: $nspc = " " x $nspc; 592: print OUT "{${rstr}${nspc},\"$rn\"},\n"; 593: } 594: if($static) { 595: print OUT <<"EOF"; 596: {0,NULL} 597: }; 598: 599: #endif 600: 601: ${staticloader}void ERR_load_${lib}_strings(void) 602: { 603: #ifndef OPENSSL_NO_ERR 604: 605: if (ERR_func_error_string(${lib}_str_functs[0].error) == NULL) 606: { 607: ERR_load_strings($load_errcode,${lib}_str_functs); 608: ERR_load_strings($load_errcode,${lib}_str_reasons); 609: } 610: #endif 611: } 612: EOF 613: } else { 614: print OUT <<"EOF"; 615: {0,NULL} 616: }; 617: 618: #endif 619: 620: #ifdef ${lib}_LIB_NAME 621: static ERR_STRING_DATA ${lib}_lib_name[]= 622: { 623: {0 ,${lib}_LIB_NAME}, 624: {0,NULL} 625: }; 626: #endif 627: 628: 629: static int ${lib}_lib_error_code=0; 630: static int ${lib}_error_init=1; 631: 632: ${staticloader}void ERR_load_${lib}_strings(void) 633: { 634: if (${lib}_lib_error_code == 0) 635: ${lib}_lib_error_code=ERR_get_next_error_library(); 636: 637: if (${lib}_error_init) 638: { 639: ${lib}_error_init=0; 640: #ifndef OPENSSL_NO_ERR 641: ERR_load_strings(${lib}_lib_error_code,${lib}_str_functs); 642: ERR_load_strings(${lib}_lib_error_code,${lib}_str_reasons); 643: #endif 644: 645: #ifdef ${lib}_LIB_NAME 646: ${lib}_lib_name->error = ERR_PACK(${lib}_lib_error_code,0,0); 647: ERR_load_strings(0,${lib}_lib_name); 648: #endif 649: } 650: } 651: 652: ${staticloader}void ERR_unload_${lib}_strings(void) 653: { 654: if (${lib}_error_init == 0) 655: { 656: #ifndef OPENSSL_NO_ERR 657: ERR_unload_strings(${lib}_lib_error_code,${lib}_str_functs); 658: ERR_unload_strings(${lib}_lib_error_code,${lib}_str_reasons); 659: #endif 660: 661: #ifdef ${lib}_LIB_NAME 662: ERR_unload_strings(0,${lib}_lib_name); 663: #endif 664: ${lib}_error_init=1; 665: } 666: } 667: 668: ${staticloader}void ERR_${lib}_error(int function, int reason, char *file, int line) 669: { 670: if (${lib}_lib_error_code == 0) 671: ${lib}_lib_error_code=ERR_get_next_error_library(); 672: ERR_PUT_error(${lib}_lib_error_code,function,reason,file,line); 673: } 674: EOF 675: 676: } 677: 678: close OUT; 679: undef %err_reason_strings; 680: } 681: 682: if($debug && defined(%notrans)) { 683: print STDERR "The following function codes were not translated:\n"; 684: foreach(sort keys %notrans) 685: { 686: print STDERR "$_\n"; 687: } 688: } 689: 690: # Make a list of unreferenced function and reason codes 691: 692: foreach (keys %fcodes) { 693: push (@funref, $_) unless exists $ufcodes{$_}; 694: } 695: 696: foreach (keys %rcodes) { 697: push (@runref, $_) unless exists $urcodes{$_}; 698: } 699: 700: if($debug && defined(@funref) ) { 701: print STDERR "The following function codes were not referenced:\n"; 702: foreach(sort @funref) 703: { 704: print STDERR "$_\n"; 705: } 706: } 707: 708: if($debug && defined(@runref) ) { 709: print STDERR "The following reason codes were not referenced:\n"; 710: foreach(sort @runref) 711: { 712: print STDERR "$_\n"; 713: } 714: }