summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/err/openssl.ec92
-rwxr-xr-xutil/mkerr.pl404
2 files changed, 330 insertions, 166 deletions
diff --git a/crypto/err/openssl.ec b/crypto/err/openssl.ec
index 589ff1094c..f265ca0f5d 100644
--- a/crypto/err/openssl.ec
+++ b/crypto/err/openssl.ec
@@ -1,55 +1,49 @@
# configuration file for util/mkerr.pl
# The INPUT HEADER is scanned for declarations
-# LIBNAME INPUT HEADER ERROR-TABLE FILE
-L ERR NONE NONE
-L FUNC NONE NONE
-L BN include/openssl/bn.h crypto/bn/bn_err.c
-L RSA include/openssl/rsa.h crypto/rsa/rsa_err.c
-L DH include/openssl/dh.h crypto/dh/dh_err.c
-L EVP include/openssl/evp.h crypto/evp/evp_err.c
-L BUF include/openssl/buffer.h crypto/buffer/buf_err.c
-L OBJ include/openssl/objects.h crypto/objects/obj_err.c
-L PEM include/openssl/pem.h crypto/pem/pem_err.c
-L DSA include/openssl/dsa.h crypto/dsa/dsa_err.c
-L X509 include/openssl/x509.h crypto/x509/x509_err.c
-L ASN1 include/openssl/asn1.h crypto/asn1/asn1_err.c
-L CONF include/openssl/conf.h crypto/conf/conf_err.c
-L CRYPTO include/openssl/crypto.h crypto/cpt_err.c
-L EC include/openssl/ec.h crypto/ec/ec_err.c
-L SSL include/openssl/ssl.h ssl/ssl_err.c
-L BIO include/openssl/bio.h crypto/bio/bio_err.c
-L PKCS7 include/openssl/pkcs7.h crypto/pkcs7/pkcs7err.c
-L X509V3 include/openssl/x509v3.h crypto/x509/v3err.c
-L PKCS12 include/openssl/pkcs12.h crypto/pkcs12/pk12err.c
-L RAND include/openssl/rand.h crypto/rand/rand_err.c
-L DSO include/internal/dso.h crypto/dso/dso_err.c
-L ENGINE include/openssl/engine.h crypto/engine/eng_err.c
-L OCSP include/openssl/ocsp.h crypto/ocsp/ocsp_err.c
-L UI include/openssl/ui.h crypto/ui/ui_err.c
-L COMP include/openssl/comp.h crypto/comp/comp_err.c
-L TS include/openssl/ts.h crypto/ts/ts_err.c
-L CMS include/openssl/cms.h crypto/cms/cms_err.c
-L CRMF include/openssl/crmf.h crypto/crmf/crmf_err.c
-L CMP include/openssl/cmp.h crypto/cmp/cmp_err.c
-L CT include/openssl/ct.h crypto/ct/ct_err.c
-L ASYNC include/openssl/async.h crypto/async/async_err.c
-L KDF NONE crypto/kdf/kdf_err.c
-L SM2 include/crypto/sm2.h crypto/sm2/sm2_err.c
-L OSSL_STORE include/openssl/store.h crypto/store/store_err.c
-L ESS include/openssl/ess.h crypto/ess/ess_err.c
-L PROP include/internal/property.h crypto/property/property_err.c
-L PROV providers/common/include/prov/providercommon.h providers/common/provider_err.c
-L OSSL_ENCODER include/openssl/encoder.h crypto/encode_decode/encoder_err.c
-L OSSL_DECODER include/openssl/decoder.h crypto/encode_decode/decoder_err.c
-L HTTP include/openssl/http.h crypto/http/http_err.c
-
-# additional header files to be scanned for function names
-L NONE include/openssl/x509_vfy.h NONE
-L NONE crypto/ec/ec_local.h NONE
-L NONE crypto/cms/cms_local.h NONE
-L NONE crypto/ct/ct_local.h NONE
-L NONE ssl/ssl_local.h NONE
+# LIBNAME PUBLIC HEADER ERROR-TABLE FILE INTERNAL HEADER (if relevant)
+L ERR NONE NONE
+L FUNC NONE NONE
+L BN include/openssl/bnerr.h crypto/bn/bn_err.c include/crypto/bnerr.h
+L RSA include/openssl/rsaerr.h crypto/rsa/rsa_err.c include/crypto/rsaerr.h
+L DH include/openssl/dherr.h crypto/dh/dh_err.c include/crypto/dherr.h
+L EVP include/openssl/evperr.h crypto/evp/evp_err.c include/crypto/evperr.h
+L BUF include/openssl/buffererr.h crypto/buffer/buf_err.c include/crypto/buffererr.h
+L OBJ include/openssl/objectserr.h crypto/objects/obj_err.c include/crypto/objectserr.h
+L PEM include/openssl/pemerr.h crypto/pem/pem_err.c include/crypto/pemerr.h
+L DSA include/openssl/dsaerr.h crypto/dsa/dsa_err.c include/crypto/dsaerr.h
+L X509 include/openssl/x509err.h crypto/x509/x509_err.c include/crypto/x509err.h
+L ASN1 include/openssl/asn1err.h crypto/asn1/asn1_err.c include/crypto/asn1err.h
+L CONF include/openssl/conferr.h crypto/conf/conf_err.c include/crypto/conferr.h
+L CRYPTO include/openssl/cryptoerr.h crypto/cpt_err.c include/crypto/cryptoerr.h
+L EC include/openssl/ecerr.h crypto/ec/ec_err.c include/crypto/ecerr.h
+L SSL include/openssl/sslerr.h ssl/ssl_err.c ssl/sslerr.h
+L BIO include/openssl/bioerr.h crypto/bio/bio_err.c include/crypto/bioerr.h
+L PKCS7 include/openssl/pkcs7err.h crypto/pkcs7/pkcs7err.c include/crypto/pkcs7err.h
+L X509V3 include/openssl/x509v3err.h crypto/x509/v3err.c include/crypto/x509v3err.h
+L PKCS12 include/openssl/pkcs12err.h crypto/pkcs12/pk12err.c include/crypto/pkcs12err.h
+L RAND include/openssl/randerr.h crypto/rand/rand_err.c include/crypto/randerr.h
+L DSO NONE crypto/dso/dso_err.c include/internal/dsoerr.h
+L ENGINE include/openssl/engineerr.h crypto/engine/eng_err.c include/crypto/engineerr.h
+L OCSP include/openssl/ocsperr.h crypto/ocsp/ocsp_err.c include/crypto/ocsperr.h
+L UI include/openssl/uierr.h crypto/ui/ui_err.c include/crypto/uierr.h
+L COMP include/openssl/comperr.h crypto/comp/comp_err.c include/crypto/comperr.h
+L TS include/openssl/tserr.h crypto/ts/ts_err.c include/crypto/tserr.h
+L CMS include/openssl/cmserr.h crypto/cms/cms_err.c include/crypto/cmserr.h
+L CRMF include/openssl/crmferr.h crypto/crmf/crmf_err.c include/crypto/crmferr.h
+L CMP include/openssl/cmperr.h crypto/cmp/cmp_err.c include/crypto/cmperr.h
+L CT include/openssl/cterr.h crypto/ct/ct_err.c include/crypto/cterr.h
+L ASYNC include/openssl/asyncerr.h crypto/async/async_err.c include/crypto/asyncerr.h
+# KDF is only here for conservation purposes
+L KDF NONE NONE NONE
+L SM2 NONE crypto/sm2/sm2_err.c include/crypto/sm2err.h
+L OSSL_STORE include/openssl/storeerr.h crypto/store/store_err.c include/crypto/storeerr.h
+L ESS include/openssl/esserr.h crypto/ess/ess_err.c include/crypto/esserr.h
+L PROP NONE crypto/property/property_err.c include/internal/propertyerr.h
+L PROV NONE providers/common/provider_err.c providers/common/include/prov/providercommonerr.h
+L OSSL_ENCODER include/openssl/encodererr.h crypto/encode_decode/encoder_err.c include/crypto/encodererr.h
+L OSSL_DECODER include/openssl/decodererr.h crypto/encode_decode/decoder_err.c include/crypto/decodererr.h
+L HTTP include/openssl/httperr.h crypto/http/http_err.c include/crypto/httperr.h
# SSL/TLS alerts
R SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010
diff --git a/util/mkerr.pl b/util/mkerr.pl
index 0c7ae7b56d..d7c72af14c 100755
--- a/util/mkerr.pl
+++ b/util/mkerr.pl
@@ -9,6 +9,9 @@
use strict;
use warnings;
+use File::Basename;
+use File::Spec::Functions qw(abs2rel rel2abs);
+
use lib ".";
use configdata;
@@ -124,8 +127,10 @@ if ( $internal ) {
# Data parsed out of the config and state files.
# We always map function-code values to zero, so items marked below with
# an asterisk could eventually be removed. TODO(4.0)
-my %hinc; # lib -> header
-my %libinc; # header -> lib
+my %hpubinc; # lib -> public header
+my %libpubinc; # public header -> lib
+my %hprivinc; # lib -> private header
+my %libprivinc; # private header -> lib
my %cskip; # error_file -> lib
my %errorfile; # lib -> error file name
my %fmax; # lib -> max assigned function code*
@@ -145,21 +150,30 @@ my %strings; # define -> text
open(IN, "$config") || die "Can't open config file $config, $!,";
while ( <IN> ) {
next if /^#/ || /^$/;
- if ( /^L\s+(\S+)\s+(\S+)\s+(\S+)/ ) {
+ if ( /^L\s+(\S+)\s+(\S+)\s+(\S+)(?:\s+(\S+))?\s+$/ ) {
my $lib = $1;
- my $hdr = $2;
+ my $pubhdr = $2;
my $err = $3;
- $hinc{$lib} = $hdr;
- $libinc{$hdr} = $lib;
+ my $privhdr = $4 // 'NONE';
+ $hpubinc{$lib} = $pubhdr;
+ $libpubinc{$pubhdr} = $lib;
+ $hprivinc{$lib} = $privhdr;
+ $libprivinc{$privhdr} = $lib;
$cskip{$err} = $lib;
- next if $err eq 'NONE';
$errorfile{$lib} = $err;
+ next if $err eq 'NONE';
$fmax{$lib} = 100;
$rmax{$lib} = 100;
$fassigned{$lib} = ":";
$rassigned{$lib} = ":";
$fnew{$lib} = 0;
$rnew{$lib} = 0;
+ die "Public header file must be in include/openssl ($pubhdr is not)\n"
+ if ($internal
+ && $pubhdr ne 'NONE'
+ && $pubhdr !~ m|^include/openssl/|);
+ die "Private header file may only be specified with -internal ($privhdr given)\n"
+ unless ($privhdr eq 'NONE' || $internal);
} elsif ( /^R\s+(\S+)\s+(\S+)/ ) {
$rextra{$1} = $2;
$rcodes{$1} = $2;
@@ -211,6 +225,7 @@ if ( ! $reindex && $statefile ) {
$skippedstate++;
next;
}
+ next if $errorfile{$lib} eq 'NONE';
if ( $name =~ /^(?:OSSL_|OPENSSL_)?[A-Z0-9]{2,}_R_/ ) {
die "$lib reason code $code collision at $name\n"
if $rassigned{$lib} =~ /:$code:/;
@@ -252,10 +267,9 @@ if ( ! $reindex && $statefile ) {
}
}
-# Scan each header file and make a list of error codes
-# and function names
+# Scan each public header file and make a list of function codes and names
&phase("Scanning headers");
-while ( ( my $hdr, my $lib ) = each %libinc ) {
+while ( ( my $hdr, my $lib ) = each %libpubinc ) {
next if $hdr eq "NONE";
print STDERR " ." if $debug;
my $line = "";
@@ -386,6 +400,7 @@ foreach my $file ( @source ) {
if ( /(((?:OSSL_|OPENSSL_)?[A-Z0-9]{2,})_F_([A-Z0-9_]+))/ ) {
next unless exists $errorfile{$2};
+ next if $errorfile{$2} eq 'NONE';
next if $1 eq "BIO_F_BUFFER_CTX";
$usedfuncs{$1} = 1;
if ( !exists $fcodes{$1} ) {
@@ -399,6 +414,7 @@ foreach my $file ( @source ) {
}
if ( /(((?:OSSL_|OPENSSL_)?[A-Z0-9]{2,})_R_[A-Z0-9_]+)/ ) {
next unless exists $errorfile{$2};
+ next if $errorfile{$2} eq 'NONE';
$usedreasons{$1} = 1;
if ( !exists $rcodes{$1} ) {
print STDERR " New reason $1\n" if $debug;
@@ -419,7 +435,6 @@ foreach my $lib ( keys %errorfile ) {
next if ! $fnew{$lib} && ! $rnew{$lib} && ! $rebuild;
next if scalar keys %modules > 0 && !$modules{$lib};
next if $nowrite;
- next if $hinc{$lib} eq 'NONE';
print STDERR "$lib: $fnew{$lib} new functions\n" if $fnew{$lib};
print STDERR "$lib: $rnew{$lib} new reasons\n" if $rnew{$lib};
$newstate = 1;
@@ -434,15 +449,32 @@ foreach my $lib ( keys %errorfile ) {
# indent level for innermost preprocessor lines
my $indent = " ";
- # Rewrite the header file
+ # Flag if the sub-library is disablable
+ # There are a few exceptions, where disabling the sub-library
+ # doesn't actually remove the whole sub-library, but rather implements
+ # it with a NULL backend.
+ my $disablable =
+ ($lib ne "SSL" && $lib ne "ASYNC" && $lib ne "DSO"
+ && (grep { $lib eq uc $_ } @disablables, @disablables_int));
- my $hfile = $hinc{$lib};
- $hfile =~ s/.h$/err.h/ if $internal;
- open( OUT, ">$hfile" ) || die "Can't write to $hfile, $!,";
- print OUT <<"EOF";
+ # Rewrite the internal header file if there is one ($internal only!)
+
+ if ($hprivinc{$lib} ne 'NONE') {
+ my $hfile = $hprivinc{$lib};
+ my $guard = $hfile;
+
+ if ($guard =~ m|^include/|) {
+ $guard = $';
+ } else {
+ $guard = basename($guard);
+ }
+ $guard = "OSSL_" . join('_', split(m|[./]|, uc $guard));
+
+ open( OUT, ">$hfile" ) || die "Can't write to $hfile, $!,";
+ print OUT <<"EOF";
/*
* Generated by util/mkerr.pl DO NOT EDIT
- * Copyright 1995-$YEAR The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2020-$YEAR The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the \"License\"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -450,41 +482,142 @@ foreach my $lib ( keys %errorfile ) {
* https://www.openssl.org/source/license.html
*/
-#ifndef OPENSSL_${lib}ERR_H
-# define OPENSSL_${lib}ERR_H
+#ifndef $guard
+# define $guard
# pragma once
# include <openssl/opensslconf.h>
# include <openssl/symhacks.h>
+# ifdef __cplusplus
+extern \"C\" {
+# endif
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, @disablables_int)) {
+ $indent = ' ';
+ if ($disablable) {
print OUT <<"EOF";
-# include <openssl/opensslconf.h>
-
# ifndef OPENSSL_NO_${lib}
EOF
$indent = " ";
}
print OUT <<"EOF";
-#${indent}ifdef __cplusplus
-extern \"C\"
-#${indent}endif
-int ERR_load_${lib}_strings(void);
+int err_load_${lib}_strings_int(void);
EOF
- } else {
+
+ # If this library doesn't have a public header file, we write all
+ # definitions that would end up there here instead
+ if ($hpubinc{$lib} eq 'NONE') {
+ print OUT "\n/*\n * $lib function codes.\n */\n";
+ print OUT "#${indent}ifndef OPENSSL_NO_DEPRECATED_3_0\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;
+ $findcode = $fmax{$lib} if !defined $findcode;
+ while ( $fassigned{$lib} =~ m/:$findcode:/ ) {
+ $findcode++;
+ }
+ $fcodes{$i} = $findcode;
+ $fassigned{$lib} .= "$findcode:";
+ print STDERR "New Function code $i\n" if $debug;
+ }
+ printf OUT "#${indent} define $i%s 0\n", " " x $z;
+ }
+ print OUT "#${indent}endif\n";
+
+ 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;
+ $findcode = $rmax{$lib} if !defined $findcode;
+ while ( $rassigned{$lib} =~ m/:$findcode:/ ) {
+ $findcode++;
+ }
+ $rcodes{$i} = $findcode;
+ $rassigned{$lib} .= "$findcode:";
+ print STDERR "New Reason code $i\n" if $debug;
+ }
+ printf OUT "#${indent}define $i%s $rcodes{$i}\n", " " x $z;
+ }
+ print OUT "\n";
+ }
+
+ # This doesn't go all the way down to zero, to allow for the ending
+ # brace for 'extern "C" {'.
+ while (length($indent) > 1) {
+ $indent = substr $indent, 0, -1;
+ print OUT "#${indent}endif\n";
+ }
+
print OUT <<"EOF";
-# define ${lib}err(f, r) ERR_${lib}_error(0, (r), OPENSSL_FILE, OPENSSL_LINE)
+# ifdef __cplusplus
+}
+# endif
+#endif
EOF
- if ( ! $static ) {
+ close OUT;
+ }
+
+ # Rewrite the public header file
+
+ if ($hpubinc{$lib} ne 'NONE') {
+ my $extra_include =
+ $internal
+ ? ($lib ne 'SSL'
+ ? "# include <openssl/cryptoerr_legacy.h>\n"
+ : "# include <openssl/sslerr_legacy.h>\n")
+ : '';
+ my $hfile = $hpubinc{$lib};
+ my $guard = $hfile;
+ $guard =~ s|^include/||;
+ $guard = join('_', split(m|[./]|, uc $guard));
+ $guard = "OSSL_" . $guard unless $internal;
+
+ open( OUT, ">$hfile" ) || die "Can't write to $hfile, $!,";
+ print OUT <<"EOF";
+/*
+ * Generated by util/mkerr.pl DO NOT EDIT
+ * Copyright 1995-$YEAR The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (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
+ */
+
+#ifndef $guard
+# define $guard
+# pragma once
+
+# include <openssl/opensslconf.h>
+# include <openssl/symhacks.h>
+$extra_include
+
+EOF
+ $indent = ' ';
+ if ( $internal ) {
+ if ($disablable) {
+ print OUT <<"EOF";
+# ifndef OPENSSL_NO_${lib}
+
+EOF
+ $indent .= ' ';
+ }
+ } else {
print OUT <<"EOF";
+# define ${lib}err(f, r) ERR_${lib}_error(0, (r), OPENSSL_FILE, OPENSSL_LINE)
+
+EOF
+ if ( ! $static ) {
+ print OUT <<"EOF";
# ifdef __cplusplus
extern \"C\" {
@@ -496,72 +629,86 @@ void ERR_${lib}_error(int function, int reason, char *file, int line);
}
# endif
EOF
+ }
}
- }
- print OUT "\n/*\n * $lib function codes.\n */\n";
- print OUT "# ifndef OPENSSL_NO_DEPRECATED_3_0\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;
- $findcode = $fmax{$lib} if !defined $findcode;
- while ( $fassigned{$lib} =~ m/:$findcode:/ ) {
- $findcode++;
+ print OUT "\n/*\n * $lib function codes.\n */\n";
+ print OUT "#${indent}ifndef OPENSSL_NO_DEPRECATED_3_0\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;
+ $findcode = $fmax{$lib} if !defined $findcode;
+ while ( $fassigned{$lib} =~ m/:$findcode:/ ) {
+ $findcode++;
+ }
+ $fcodes{$i} = $findcode;
+ $fassigned{$lib} .= "$findcode:";
+ print STDERR "New Function code $i\n" if $debug;
}
- $fcodes{$i} = $findcode;
- $fassigned{$lib} .= "$findcode:";
- print STDERR "New Function code $i\n" if $debug;
+ printf OUT "#${indent} define $i%s 0\n", " " x $z;
}
- printf OUT "#${indent} define $i%s 0\n", " " x $z;
- }
- print OUT "# endif\n";
-
- 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;
- $findcode = $rmax{$lib} if !defined $findcode;
- while ( $rassigned{$lib} =~ m/:$findcode:/ ) {
- $findcode++;
+ print OUT "#${indent}endif\n";
+
+ 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;
+ $findcode = $rmax{$lib} if !defined $findcode;
+ while ( $rassigned{$lib} =~ m/:$findcode:/ ) {
+ $findcode++;
+ }
+ $rcodes{$i} = $findcode;
+ $rassigned{$lib} .= "$findcode:";
+ print STDERR "New Reason code $i\n" if $debug;
}
- $rcodes{$i} = $findcode;
- $rassigned{$lib} .= "$findcode:";
- print STDERR "New Reason code $i\n" if $debug;
+ printf OUT "#${indent}define $i%s $rcodes{$i}\n", " " x $z;
}
- printf OUT "#${indent}define $i%s $rcodes{$i}\n", " " x $z;
- }
- print OUT "\n";
+ print OUT "\n";
- while (length($indent) > 0) {
- $indent = substr $indent, 0, -1;
- print OUT "#${indent}endif\n";
+ while (length($indent) > 0) {
+ $indent = substr $indent, 0, -1;
+ print OUT "#${indent}endif\n";
+ }
+ close OUT;
}
# Rewrite the C source file containing the error details.
- # First, read any existing reason string definitions:
- my $cfile = $errorfile{$lib};
- my $pack_lib = $internal ? "ERR_LIB_${lib}" : "0";
- my $hincf = $hfile;
- $hincf =~ s|.*include/||;
- if ( $hincf =~ m|^openssl/| ) {
- $hincf = "<${hincf}>";
- } else {
- $hincf = "\"${hincf}\"";
- }
+ if ($errorfile{$lib} ne 'NONE') {
+ # First, read any existing reason string definitions:
+ my $cfile = $errorfile{$lib};
+ my $pack_lib = $internal ? "ERR_LIB_${lib}" : "0";
+ my $hpubincf = $hpubinc{$lib};
+ my $hprivincf = $hprivinc{$lib};
+ my $includes = '';
+ if ($internal) {
+ if ($hpubincf ne 'NONE') {
+ $hpubincf =~ s|^include/||;
+ $includes .= "#include <${hpubincf}>\n";
+ }
+ if ($hprivincf =~ m|^include/|) {
+ $hprivincf = $';
+ } else {
+ $hprivincf = abs2rel(rel2abs($hprivincf),
+ rel2abs(dirname($cfile)));
+ }
+ $includes .= "#include \"${hprivincf}\"\n";
+ } else {
+ $includes .= "#include \"${hpubincf}\"\n";
+ }
- open( OUT, ">$cfile" )
- || die "Can't open $cfile for writing, $!, stopped";
+ open( OUT, ">$cfile" )
+ || die "Can't open $cfile for writing, $!, stopped";
- my $const = $internal ? 'const ' : '';
+ my $const = $internal ? 'const ' : '';
- print OUT <<"EOF";
+ print OUT <<"EOF";
/*
* Generated by util/mkerr.pl DO NOT EDIT
* Copyright 1995-$YEAR The OpenSSL Project Authors. All Rights Reserved.
@@ -573,53 +720,64 @@ EOF
*/
#include <openssl/err.h>
-#include $hincf
+$includes
+EOF
+ $indent = '';
+ if ( $internal ) {
+ if ($disablable) {
+ print OUT <<"EOF";
+#ifndef OPENSSL_NO_${lib}
-#ifndef OPENSSL_NO_ERR
+EOF
+ $indent .= ' ';
+ }
+ }
+ print OUT <<"EOF";
+#${indent}ifndef OPENSSL_NO_ERR
static ${const}ERR_STRING_DATA ${lib}_str_reasons[] = {
EOF
- # Add each reason code.
- foreach my $i ( @reasons ) {
- my $rn;
- if ( exists $strings{$i} ) {
- $rn = $strings{$i};
- $rn = "" if $rn eq '*';
- } else {
- $i =~ /^${lib}_R_(\S+)$/;
- $rn = $1;
- $rn =~ tr/_[A-Z]/ [a-z]/;
- $strings{$i} = $rn;
- }
- my $short = " {ERR_PACK($pack_lib, 0, $i), \"$rn\"},";
- if ( length($short) <= 80 ) {
- print OUT "$short\n";
- } else {
- print OUT " {ERR_PACK($pack_lib, 0, $i),\n \"$rn\"},\n";
+ # Add each reason code.
+ foreach my $i ( @reasons ) {
+ my $rn;
+ if ( exists $strings{$i} ) {
+ $rn = $strings{$i};
+ $rn = "" if $rn eq '*';
+ } else {
+ $i =~ /^${lib}_R_(\S+)$/;
+ $rn = $1;
+ $rn =~ tr/_[A-Z]/ [a-z]/;
+ $strings{$i} = $rn;
+ }
+ my $short = " {ERR_PACK($pack_lib, 0, $i), \"$rn\"},";
+ if ( length($short) <= 80 ) {
+ print OUT "$short\n";
+ } else {
+ print OUT " {ERR_PACK($pack_lib, 0, $i),\n \"$rn\"},\n";
+ }
}
- }
- print OUT <<"EOF";
+ print OUT <<"EOF";
{0, NULL}
};
-#endif
+#${indent}endif
EOF
- if ( $internal ) {
- print OUT <<"EOF";
+ if ( $internal ) {
+ print OUT <<"EOF";
-int ERR_load_${lib}_strings(void)
+int err_load_${lib}_strings_int(void)
{
-#ifndef OPENSSL_NO_ERR
+#${indent}ifndef OPENSSL_NO_ERR
if (ERR_reason_error_string(${lib}_str_reasons[0].error) == NULL)
ERR_load_strings_const(${lib}_str_reasons);
-#endif
+#${indent}endif
return 1;
}
EOF
- } else {
- my $st = $static ? "static " : "";
- print OUT <<"EOF";
+ } else {
+ my $st = $static ? "static " : "";
+ print OUT <<"EOF";
static int lib_code = 0;
static int error_loaded = 0;
@@ -657,9 +815,21 @@ ${st}void ERR_${lib}_error(int function, int reason, char *file, int line)
}
EOF
- }
+ }
- close OUT;
+ while (length($indent) > 1) {
+ $indent = substr $indent, 0, -1;
+ print OUT "#${indent}endif\n";
+ }
+ if ($internal && $disablable) {
+ print OUT <<"EOF";
+#else
+NON_EMPTY_TRANSLATION_UNIT
+#endif
+EOF
+ }
+ close OUT;
+ }
}
&phase("Ending");