X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=util%2Fmkdef.pl;h=4e2845a4e191b25b69a4d2e962cba1c99b6d3e8a;hp=80384af325a31aaae5635f92b77e3457e30cc871;hb=5241a83b2d1ebe3e430cfefcaa5057d85bda4cd5;hpb=f598cd13a3a194bf51bba32fc45751f392609898 diff --git a/util/mkdef.pl b/util/mkdef.pl index 80384af325..4e2845a4e1 100755 --- a/util/mkdef.pl +++ b/util/mkdef.pl @@ -6,26 +6,34 @@ # prototyped functions: it then prunes the output. # -$crypto_num="util/libeay.num"; -$ssl_num= "util/ssleay.num"; +my $crypto_num="util/libeay.num"; +my $ssl_num= "util/ssleay.num"; my $do_update = 0; my $do_crypto = 0; my $do_ssl = 0; -$rsaref = 0; +my $do_ctest = 0; +my $rsaref = 0; -$W32=1; -$NT=0; +my $W32=1; +my $NT=0; # Set this to make typesafe STACK definitions appear in DEF -$safe_stack_def = 1; +my $safe_stack_def = 1; -$options=""; +my $options=""; open(IN,") { $options=$1 if (/^OPTIONS=(.*)$/); } close(IN); +# The following ciphers may be excluded (by Configure). This means functions +# defined with ifndef(NO_XXX) are not included in the .def file, and everything +# in directory xxx is ignored. +my $no_rc2; my $no_rc4; my $no_rc5; my $no_idea; my $no_des; my $no_bf; +my $no_cast; my $no_md2; my $no_md5; my $no_sha; my $no_ripemd; my $no_mdc2; +my $no_rsa; my $no_dsa; my $no_dh; my $no_hmac=0; + foreach (@ARGV, split(/ /, $options)) { $W32=1 if $_ eq "32"; @@ -39,6 +47,7 @@ foreach (@ARGV, split(/ /, $options)) $do_crypto=1 if $_ eq "libeay"; $do_crypto=1 if $_ eq "crypto"; $do_update=1 if $_ eq "update"; + $do_ctest=1 if $_ eq "ctest"; $rsaref=1 if $_ eq "rsaref"; if (/^no-rc2$/) { $no_rc2=1; } @@ -59,6 +68,7 @@ foreach (@ARGV, split(/ /, $options)) elsif (/^no-hmac$/) { $no_hmac=1; } } + if (!$do_ssl && !$do_crypto) { print STDERR "usage: $0 ( ssl | crypto ) [ 16 | 32 | NT ] [rsaref]\n"; @@ -70,9 +80,9 @@ $max_ssl = $max_num; %crypto_list=&load_numbers($crypto_num); $max_crypto = $max_num; -$ssl="ssl/ssl.h"; +my $ssl="ssl/ssl.h"; -$crypto ="crypto/crypto.h"; +my $crypto ="crypto/crypto.h"; $crypto.=" crypto/des/des.h" unless $no_des; $crypto.=" crypto/idea/idea.h" unless $no_idea; $crypto.=" crypto/rc4/rc4.h" unless $no_rc4; @@ -115,8 +125,8 @@ $crypto.=" crypto/rand/rand.h"; $crypto.=" crypto/comp/comp.h"; $crypto.=" crypto/tmdiff.h"; -@ssl_func = &do_defs("SSLEAY", $ssl); -@crypto_func = &do_defs("LIBEAY", $crypto); +my @ssl_func = &do_defs("SSLEAY", $ssl); +my @crypto_func = &do_defs("LIBEAY", $crypto); if ($do_update) { @@ -131,7 +141,26 @@ if($do_crypto == 1) { open(OUT, ">>$crypto_num"); &update_numbers(*OUT,"LIBEAY",*crypto_list,$max_crypto, @crypto_func); close OUT; -} +} + +} elsif ($do_ctest) { + + print <<"EOF"; + +/* Test file to check all DEF file symbols are present by trying + * to link to all of them. This is *not* intended to be run! + */ + +int main() +{ +EOF + &print_test_file(*STDOUT,"SSLEAY",*ssl_list,@ssl_func) + if $do_ssl == 1; + + &print_test_file(*STDOUT,"LIBEAY",*crypto_list,@crypto_func) + if $do_crypto == 1; + + print "}\n"; } else { @@ -147,14 +176,15 @@ if($do_crypto == 1) { sub do_defs { my($name,$files)=@_; + my $file; my @ret; my %funcs; + my $cpp; foreach $file (split(/\s+/,$files)) { open(IN,"<$file") || die "unable to open $file:$!\n"; - - my $line = "", $def= ""; + my $line = "", my $def= ""; my %tag = ( FreeBSD => 0, NOPROTO => 0, @@ -164,6 +194,22 @@ sub do_defs NO_FP_API => 0, CONST_STRICT => 0, TRUE => 1, + NO_RC2 => 0, + NO_RC4 => 0, + NO_RC5 => 0, + NO_IDEA => 0, + NO_DES => 0, + NO_BF => 0, + NO_CAST => 0, + NO_MD2 => 0, + NO_MD5 => 0, + NO_SHA => 0, + NO_RIPEMD => 0, + NO_MDC2 => 0, + NO_RSA => 0, + NO_DSA => 0, + NO_DH => 0, + NO_HMAC => 0, ); while() { last if (/BEGIN ERROR CODES/); @@ -214,6 +260,11 @@ sub do_defs push(@tag,"TRUE"); $tag{"TRUE"}=1; next; + } elsif (/^\#\s*if\s+0/) { + # Dummy tag + push(@tag,"TRUE"); + $tag{"TRUE"}=-1; + next; } elsif (/^\#/) { next; } @@ -250,7 +301,20 @@ sub do_defs } $funcs{"PEM_read_bio_${1}"} = 1; $funcs{"PEM_write_bio_${1}"} = 1; - } elsif ( + } elsif (/^DECLARE_PEM_write\s*\(\s*(\w*)\s*,/ || + /^DECLARE_PEM_write_cb\s*\(\s*(\w*)\s*,/ ) { + if($W32) { + $funcs{"PEM_write_${1}"} = 1; + } + $funcs{"PEM_write_bio_${1}"} = 1; + } elsif (/^DECLARE_PEM_read\s*\(\s*(\w*)\s*,/ || + /^DECLARE_PEM_read_cb\s*\(\s*(\w*)\s*,/ ) { + if($W32) { + $funcs{"PEM_read_${1}"} = 1; + } + $funcs{"PEM_read_bio_${1}"} = 1; + } elsif ( + ($tag{'TRUE'} != -1) && ($tag{'FreeBSD'} != 1) && ($tag{'CONST_STRICT'} != 1) && (($W32 && ($tag{'WIN16'} != 1)) || @@ -260,7 +324,23 @@ sub do_defs ((!$W32 && $tag{'_WINDLL'} != -1) || ($W32 && $tag{'_WINDLL'} != 1)) && ((($tag{'NO_FP_API'} != 1) && $W32) || - (($tag{'NO_FP_API'} != -1) && !$W32))) + (($tag{'NO_FP_API'} != -1) && !$W32)) && + ($tag{'NO_RC2'} == 0 || !$no_rc2) && + ($tag{'NO_RC4'} == 0 || !$no_rc4) && + ($tag{'NO_RC5'} == 0 || !$no_rc5) && + ($tag{'NO_IDEA'} == 0 || !$no_idea) && + ($tag{'NO_DES'} == 0 || !$no_des) && + ($tag{'NO_BF'} == 0 || !$no_bf) && + ($tag{'NO_CAST'} == 0 || !$no_cast) && + ($tag{'NO_MD2'} == 0 || !$no_md2) && + ($tag{'NO_MD5'} == 0 || !$no_md5) && + ($tag{'NO_SHA'} == 0 || !$no_sha) && + ($tag{'NO_RIPEMD'} == 0 || !$no_ripemd) && + ($tag{'NO_MDC2'} == 0 || !$no_mdc2) && + ($tag{'NO_RSA'} == 0 || !$no_rsa) && + ($tag{'NO_DSA'} == 0 || !$no_dsa) && + ($tag{'NO_DH'} == 0 || !$no_dh) && + ($tag{'NO_HMAC'} == 0 || !$no_hmac)) { if (/{|\/\*/) { # } $line = $_; @@ -309,8 +389,8 @@ sub do_defs # Prune the returned functions delete $funcs{"SSL_add_dir_cert_subjects_to_stack"}; - delete $funcs{"des_crypt"}; delete $funcs{"RSA_PKCS1_RSAref"} unless $rsaref; + delete $funcs{"bn_dump1"}; if($W32) { delete $funcs{"BIO_s_file_internal"}; @@ -334,10 +414,31 @@ sub do_defs return(@ret); } +sub print_test_file +{ + (*OUT,my $name,*nums,my @functions)=@_; + my $n = 1; my @e; my @r; + my $func; + + (@e)=grep(/^SSLeay/,@functions); + (@r)=grep(!/^SSLeay/,@functions); + @functions=((sort @e),(sort @r)); + + foreach $func (@functions) { + if (!defined($nums{$func})) { + printf STDERR "$func does not have a number assigned\n" + if(!$do_update); + } else { + $n=$nums{$func}; + print OUT "\t$func();\n"; + } + } +} + sub print_def_file { - (*OUT,my $name,*nums,@functions)=@_; - my $n =1; + (*OUT,my $name,*nums,my @functions)=@_; + my $n = 1; my @e; my @r; if ($W32) { $name.="32"; }