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