X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=util%2Fmkerr.pl;h=0ea02961a5fdea9bb0427eacd97a4035e97f623a;hb=3ce1c27b56fa9856693e5c98331cebaa2a3accfa;hp=64a01a3022c55deb275168c7dc95c9f2e9bcefa7;hpb=5816586ba45bba05f6d9f0432a408063a42e1012;p=openssl.git diff --git a/util/mkerr.pl b/util/mkerr.pl index 64a01a3022..0ea02961a5 100755 --- a/util/mkerr.pl +++ b/util/mkerr.pl @@ -1,5 +1,5 @@ #! /usr/bin/env perl -# Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. +# Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy @@ -9,6 +9,9 @@ use strict; use warnings; +use lib "."; +use configdata; + my $config = "crypto/err/openssl.ec"; my $debug = 0; my $internal = 0; @@ -17,6 +20,7 @@ my $rebuild = 0; my $reindex = 0; my $static = 0; my $unref = 0; +my %modules = (); my $errors = 0; my @t = localtime(); @@ -42,6 +46,13 @@ Options: -internal Generate code that is to be built as part of OpenSSL itself. Also scans internal list of files. + -module M Only useful with -internal! + Only write files for library module M. Whether files are + actually written or not depends on other options, such as + -rebuild. + Note: this option is cumulative. If not given at all, all + internal modules will be considered. + -nowrite Do not write the header/source files, even if changed. -rebuild Rebuild all header and C source files, even if there @@ -86,6 +97,9 @@ while ( @ARGV ) { } elsif ( $arg eq "-unref" ) { $unref = 1; $nowrite = 1; + } elsif ( $arg eq "-module" ) { + shift @ARGV; + $modules{uc $ARGV[0]} = 1; } elsif ( $arg =~ /-*h(elp)?/ ) { &help(); exit; @@ -102,6 +116,7 @@ if ( $internal ) { @source = ( glob('crypto/*.c'), glob('crypto/*/*.c'), glob('ssl/*.c'), glob('ssl/*/*.c') ); } else { + die "-module isn't useful without -internal\n" if scalar keys %modules > 0; @source = @ARGV; } @@ -153,7 +168,6 @@ while ( ) { } close IN; -my $statefile_prolog = ''; if ( ! $statefile ) { $statefile = $config; $statefile =~ s/.ec/.txt/; @@ -167,9 +181,7 @@ if ( ! $reindex && $statefile ) { # Scan function and reason codes and store them: keep a note of the # maximum code used. - my $collecting = 1; while ( ) { - $statefile_prolog .= $_ if $collecting && ( /^#/ || /^$/ ); next if /^#/ || /^$/; my $name; my $code; @@ -188,16 +200,15 @@ if ( ! $reindex && $statefile ) { } else { die "Bad line in $statefile:\n$_\n"; } - $collecting = 0; my $lib = $name; - $lib =~ s/_.*//; + $lib =~ s/^((?:OSSL_|OPENSSL_)?[^_]{2,}).*$/$1/; $lib = "SSL" if $lib =~ /TLS/; if ( !defined $errorfile{$lib} ) { print "Skipping $_"; $skippedstate++; next; } - if ( $name =~ /^[A-Z0-9]+_R_/ ) { + if ( $name =~ /^(?:OSSL_|OPENSSL_)?[A-Z0-9]{2,}_R_/ ) { die "$lib reason code $code collision at $name\n" if $rassigned{$lib} =~ /:$code:/; $rassigned{$lib} .= "$code:"; @@ -205,7 +216,7 @@ if ( ! $reindex && $statefile ) { $rmax{$lib} = $code if $code > $rmax{$lib}; } $rcodes{$name} = $code; - } elsif ( $name =~ /^[A-Z0-9]+_F_/ ) { + } elsif ( $name =~ /^(?:OSSL_|OPENSSL_)?[A-Z0-9]{2,}_F_/ ) { die "$lib function code $code collision at $name\n" if $fassigned{$lib} =~ /:$code:/; $fassigned{$lib} .= "$code:"; @@ -370,7 +381,7 @@ foreach my $file ( @source ) { $func = $1; } - if ( /(([A-Z0-9]+)_F_([A-Z0-9_]+))/ ) { + if ( /(((?:OSSL_|OPENSSL_)?[A-Z0-9]{2,})_F_([A-Z0-9_]+))/ ) { next unless exists $errorfile{$2}; next if $1 eq "BIO_F_BUFFER_CTX"; $usedfuncs{$1} = 1; @@ -387,7 +398,7 @@ foreach my $file ( @source ) { print STDERR " Function $1 = $fcodes{$1}\n" if $debug; } - if ( /(([A-Z0-9]+)_R_[A-Z0-9_]+)/ ) { + if ( /(((?:OSSL_|OPENSSL_)?[A-Z0-9]{2,})_R_[A-Z0-9_]+)/ ) { next unless exists $errorfile{$2}; $usedreasons{$1} = 1; if ( !exists $rcodes{$1} ) { @@ -409,6 +420,7 @@ foreach my $lib ( keys %errorfile ) { if ( ! $fnew{$lib} && ! $rnew{$lib} ) { next unless $rebuild; } + next if scalar keys %modules > 0 && !$modules{$lib}; next if $nowrite; print STDERR "$lib: $fnew{$lib} new functions\n" if $fnew{$lib}; print STDERR "$lib: $rnew{$lib} new reasons\n" if $rnew{$lib}; @@ -421,6 +433,9 @@ foreach my $lib ( keys %errorfile ) { my @function = sort grep( /^${lib}_/, keys %fcodes ); my @reasons = sort grep( /^${lib}_/, keys %rcodes ); + # indent level for innermost preprocessor lines + my $indent = " "; + # Rewrite the header file my $hfile = $hinc{$lib}; @@ -444,14 +459,21 @@ EOF if ( $internal ) { # Declare the load function because the generate C file # includes "fooerr.h" not "foo.h" + if ($lib ne "SSL" && $lib ne "ASYNC" + && grep { $lib eq uc $_ } @disablables) { + print OUT <<"EOF"; +# include + +# ifndef OPENSSL_NO_${lib} + +EOF + $indent = " "; + } print OUT <<"EOF"; -# ifdef __cplusplus -extern \"C\" { -# endif +#${indent}ifdef __cplusplus +extern \"C\" +#${indent}endif int ERR_load_${lib}_strings(void); -# ifdef __cplusplus -} -# endif EOF } else { print OUT <<"EOF"; @@ -477,6 +499,7 @@ EOF print OUT "\n/*\n * $lib function codes.\n */\n"; foreach my $i ( @function ) { my $z = 48 - length($i); + $z = 0 if $z < 0; if ( $fcodes{$i} eq "X" ) { $fassigned{$lib} =~ m/^:([^:]*):/; my $findcode = $1; @@ -488,12 +511,13 @@ EOF $fassigned{$lib} .= "$findcode:"; print STDERR "New Function code $i\n" if $debug; } - printf OUT "# define $i%s $fcodes{$i}\n", " " x $z; + printf OUT "#${indent}define $i%s $fcodes{$i}\n", " " x $z; } print OUT "\n/*\n * $lib reason codes.\n */\n"; foreach my $i ( @reasons ) { my $z = 48 - length($i); + $z = 0 if $z < 0; if ( $rcodes{$i} eq "X" ) { $rassigned{$lib} =~ m/^:([^:]*):/; my $findcode = $1; @@ -505,11 +529,14 @@ EOF $rassigned{$lib} .= "$findcode:"; print STDERR "New Reason code $i\n" if $debug; } - printf OUT "# define $i%s $rcodes{$i}\n", " " x $z; + printf OUT "#${indent}define $i%s $rcodes{$i}\n", " " x $z; } print OUT "\n"; - print OUT "#endif\n"; + while (length($indent) > 0) { + $indent = substr $indent, 0, -1; + print OUT "#${indent}endif\n"; + } # Rewrite the C source file containing the error details. @@ -690,8 +717,15 @@ die "Found $errors errors, quitting" if $errors; if ( $newstate ) { open(OUT, ">$statefile.new") || die "Can't write $statefile.new, $!"; - print OUT $statefile_prolog; - print OUT "# Function codes\n"; + print OUT <<"EOF"; +# Copyright 1999-$YEAR The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the OpenSSL license (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html +EOF + print OUT "\n# Function codes\n"; foreach my $i ( sort keys %fcodes ) { my $short = "$i:$fcodes{$i}:"; my $t = exists $strings{$i} ? $strings{$i} : "";